Prompts & Chat-Templates
Jede Nachricht, die Sie senden, wird in Markup eingewickelt, bevor das Model sie je sieht. Das Chat-Template verwandelt Ihre rollenmarkierten Nachrichten in einen flachen Token-String, und das Model wurde darauf trainiert, genau diesen String zu lesen — nicht Ihre ordentlichen API-Objekte. Stimmt der Umschlag, benimmt sich ein 3B-Instruct-Modell; stimmt er nicht, spuckt ein 70B-Modell Wortsuppe aus.
Der Umschlag: ein Chat, drei Dialekte
Ihre API legt Rollen frei: system, user, assistant. Das Model sieht Spezial-Tokens. Dieselbe Zwei-Nachrichten-Konversation, dreifach gerendert.
ChatML — Modelle der Qwen-Familie und Fine-Tunes der Hermes-Linie:
<|im_start|>system
You are a concise assistant.<|im_end|>
<|im_start|>user
Summarize this file.<|im_end|>
<|im_start|>assistant
Llama-2-Stil — System-Marker im ersten Instruktion-Block verschachtelt:
<s>[INST] <<SYS>>You are a concise assistant.<</SYS>>
Summarize this file. [/INST] The file implements a tokenizer... </s>
Gemma-Stil — es gibt keine System-Rolle; Anweisungen reiten auf dem ersten Nutzer-Zug, und der Assistent heißt model:
<bos><start_of_turn>user
You are a concise assistant.
Summarize this file.<end_of_turn>
<start_of_turn>model
Dieselbe Konversation, drei inkompatible Umschläge. Ein auf ChatML trainiertes Model rätselt Llama-Markup nicht heraus — es behandelt fremdes Markup als gewöhnlichen Text und antwortet in gleicher Münze.
Engines lesen das Template aus der Modelldatei
GGUF-Metadaten betten ein chat_template ein (ein Jinja-Schnipsel). llama.cpp, Ollama, LM Studio und Open WebUI lesen es und rendern Ihre Nachrichten automatisch, weshalb Chat mit einem ordentlichen GGUF aus der Schachtel funktioniert. Zwei klassische Fallen: Der nackte Completion-Endpunkt (/completion) überspringt das Template und übergibt dem Model bloßen Text — benutzen Sie den Chat-Endpunkt; und ein GGUF kann mit fehlendem oder falschem Template ausgeliefert werden — übergeben Sie eines explizit (--chat-template in llama.cpp, ein Modelfile in Ollama) oder greifen Sie zu einem anderen Quant desselben Modells aus einer Quelle, die es richtig gemacht hat.
Symptome eines falschen Templates
- Sofort leere Antwort — der gerenderte Prompt sieht schon wie eine beendete Konversation aus, also stößt das Model sofort EOS aus.
- Rollen-Blutung — die Ausgabe liest sich wie
user: sure thing! assistant:— das Model imitiert den Umschlag, statt zu antworten. - Müll — Base-Modell-Wortsuppe von einem Model, das vor einer Stunde noch fein chattete, weil Sie Dateien tauschten, ohne Templates zu tauschen.
Zur Diagnose: den gerenderten Prompt ausgeben lassen — der llama.cpp-Server loggt ihn ausführlich, OLLAMA_DEBUG=1 zeigt ihn in Ollama. Dann reparieren Sie das Template oder die Datei: Fehlerbehebung.
System-Prompts und Vorrang
Die System-Rolle setzt dauerhaftes Verhalten: Persona, Sprache, Ausgabeformat, Sicherheitshaltung. Sie ist Kontext, nicht Firmware — eine lange Konversation kann sie ausspülen, und kleine Modelle gewichten sie geringer, als Sie hoffen. Zwei praktische Regeln: Legen Sie alles Tragende (Sprache, Formatvertrag, harte Grenzen) in den System-Prompt und wiederholen Sie es in der letzten Nutzer-Nachricht; Anweisungen, die der Generierung am nächsten stehen, gewinnen.
Zero-Shot vs. Few-Shot
Zero-Shot fragt; Few-Shot zeigt. Strukturierte Felder aus Bug-Berichten mit einem 3B-Modell zu extrahieren, Zero-Shot — „Extrahiere Titel, Komponente und Schweregrad als JSON“ — liefert etwa zwei Drittel der Zeit gültiges, konsistent benanntes JSON, wobei Key-Namen driften (severity in einer Runde, priority in der nächsten).
Few-Shot: gleiches Model, zwei durchgerechnete Beispiele, der dritte Bericht offen gelassen:
Report: "Login button does nothing on Safari 17."
{"title": "Login button unresponsive", "component": "auth", "severity": "medium"}
Report: "App crashes when uploading 4K video."
{"title": "Crash on 4K upload", "component": "upload", "severity": "high"}
Report: "Dark mode makes settings text unreadable."
Die Beispiele tragen den Formatvertrag, also wählt der Sampler Inhalt, statt Schema zu erfinden. Bei dieser Aufgabenklasse sinkt die Format-Fehlerrate typischerweise von ~30% auf ein paar Prozent. Zwei oder drei Beispiele sind der Knick der Kurve; darüber hinaus zahlen Sie Kontext-Tokens. Für strenge Schemas überspringen Sie das Rätselraten ganz: Strukturierte Ausgabe.
Muster, die kleine Modelle überleben
| Muster | Warum es funktioniert |
|---|---|
| Eine Aufgabe pro Prompt | Aufgaben konkurrieren um Aufmerksamkeit; Verlierer fallen raus |
| Explizites Ausgabeformat („JSON mit den Keys a, b, c“) | macht das Format zu einer nahezu deterministischen Wahl |
| Nummerierte Schritte („1) finden 2) erklären 3) flicken“) | hält die Kette auf Schienen statt umherirren zu lassen |
| Beispiele statt Beschreibungen | Modelle imitieren besser, als sie Prosa gehorchen |
| Kurze Meta-Anweisungen | jede zusätzliche Regel verdünnt jede andere |
Die Mitte des Kontexts ist dort, wo Anweisungen sterben
Die Attention ist am stärksten am Anfang und am Ende des Prompts — der „Lost in the Middle“-Effekt, stabil über Modellfamilien. Praktische Platzierung: Ziel und Formatvertrag oben, das zu verarbeitende Dokument unten, und bei langen Dokumenten eine einzeilige Wiederholung der Anweisung nach der Nutzlast. Position trägt genauso viel wie Inhalt — und jede zusätzliche Kontext-Runde kostet Speicher: KV-Cache.
Stop-Sequenzen
Die Generierung endet, wenn das Model sein EOS-Token ausstößt — das Template definiert, welches Token das ist. Zusätzliche Stop-Sequenzen (der stop-Parameter auf dem llama.cpp-Server und OpenAI-kompatiblen APIs) kappen stattdessen bei einem String: nützlich, wenn ein geschwätziges Model anfängt, Ihren nächsten Nutzer-Zug zu schreiben. Wählen Sie Stops, die nur „Zug vorbei“ bedeuten können (\n<|im_start|> bei ChatML-Modellen), nie Strings, die innerhalb legitimer Antworten vorkommen — ein nackter Zeilenumbruch schneidet mehrzeiligen Code mitten im Block ab.
Kürze schlägt Breite unter ~7B
Kleine Instruct-Modelle folgen einer 40-Wort-Anweisung besser als einer 400-Wort-Checkliste: Ihre begrenzte Aufmerksamkeit verteilt sich über alles, was Sie ihnen geben. Struktur und Beispiele ersetzen Prosaregeln. Heben Sie sich die Essay-Prompts für die großen Modelle auf; nur sie lesen jede Zeile.
Wiederverwendbare Schnipsel-Templates
Extraktion:
Extract from the text below: person names, dates, money amounts.
Return a JSON array, one object per item, keys: name, date, amount.
No prose before or after the JSON.
Text: {text}
Zusammenfassung:
Summarize in exactly 3 bullet points, each under 15 words,
for someone who skipped the meeting. Most important decision first.
Text: {text}
Code-Review:
Review the diff below. List at most 5 findings, ordered by severity.
Format each as: [severity] file:line — problem — suggested fix.
Skip praise and summary. Diff: {diff}
Verwandt: Tokens · Strukturierte Ausgabe · Engine-Regler · Fehlerbehebung