localaiforum
Anmelden
Guide › Arbeiten mit Modellen

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