Few-Shot-Prompting über die API
Auf dieser Seite
Lernen durch Beispiele
Few-Shot-Prompting bedeutet, dem Modell einige Eingabe-Ausgabe-Beispiele zu geben, bevor Sie Ihre eigentliche Anfrage senden. Bei der Chat-Completions-API erhalten diese Beispiele keinen speziellen Platz: Sie injizieren sie in die Konversationshistorie als gefälschte user/assistant-Nachrichtpaare, als wäre der Austausch wirklich stattgefunden. Das Modell kann keinen Unterschied zwischen einem echten Turn und einem von Ihnen erfundenen erkennen, und genau das macht die Technik so effektiv. Ohne Feinabstimmung (fine-tuning) ist dies der zuverlässigste Weg, um ein präzises Ausgabeformat zu erhalten.
Der Trick ist eine Umkehrung: Statt das erwartete Format ausführlich im System-Prompt zu beschreiben, zeigen Sie es. Für eine Sentiment-Analyse-Aufgabe reichen drei Beispiele, damit das Modell versteht, dass es mit einem Großbuchstaben-Label und nichts anderem antworten muss.
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Sie klassifizieren das Sentiment von Kundenbewertungen."
},
# Beispiel 1
{"role": "user", "content": "Bewertung: Schnelle Lieferung, Produkt wie beschrieben. Sehr zufrieden!"},
{"role": "assistant", "content": "POSITIVE"},
# Beispiel 2
{"role": "user", "content": "Bewertung: Paket ist beschädigt eingetroffen, Kundenservice unerreichbar."},
{"role": "assistant", "content": "NEGATIV"},
# Beispiel 3
{"role": "user", "content": "Bewertung: Das Produkt ist in Ordnung, aber etwas teuer für das, was es ist."},
{"role": "assistant", "content": "MIXED"},
# Eigentliche Anfrage
{"role": "user", "content": "Bewertung: Exzellente Qualität, ich empfehle diesen Laden sehr."}
],
temperature=0.0
)
print(response.choices[0].message.content)
# POSITIVE
Das Modell hat das Muster extrahiert – Bewertung als Eingabe, Großbuchstaben-Label als Ausgabe – und es auf die neue Eingabe angewendet. Es wurde keine Formatierungsanweisung explizit ausgeschrieben: Die drei Paare waren ausreichend.
Wie viele Beispiele bereitstellen
Die Anzahl der Beispiele hängt von der Schwierigkeit der Aufgabe ab, und Sie stoßen auf starke abnehmende Grenznutzen.
| Anzahl | Wann einsetzen |
|---|---|
| 0 (Zero-Shot) | Einfache Aufgaben, die das Modell von Natur aus bewältigt |
| 1–2 | Standard-Ausgabeformat (JSON, Label) |
| 3–5 | Klassifizierung mit mehreren Kategorien |
| 5–10 | Komplexe Aufgaben oder sehr spezifische Formate |
Über zehn Beispiele hinaus verbrennen Sie viele Eingabetokens ohne proportionalen Gewinn: Jede Anfrage zieht denselben Block von Beispielen mit sich und wird bei jedem Aufruf berechnet. An diesem Punkt wird Feinabstimmung zur wirtschaftlich sinnvollen Option.
Zwei Anwendungen, die die Ausgabe verändern
Die Entitätserkennung zeigt, was Beispiele über ein vollständig beschriebenes Schema hinaus hinzufügen. Sie fixieren nicht nur die JSON-Schlüssel, sondern auch die Art und Weise, wie leere Kategorien behandelt werden – das zweite Beispiel zeigt explizit leere Listen statt eines fehlenden Feldes, was Ihren Parser vor einer unerwarteten Struktur bewahrt.
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Extrahieren Sie benannte Entitäten im JSON-Format."
},
# Beispiel 1
{
"role": "user",
"content": "Pierre Martin trat im Januar 2025 bei Google France in Paris bei."
},
{
"role": "assistant",
"content": '{"personnes": ["Pierre Martin"], "organisations": ["Google France"], "lieux": ["Paris"], "dates": ["janvier 2025"]}'
},
# Beispiel 2
{
"role": "user",
"content": "Die VivaTech-Konferenz, organisiert von Publicis, findet im Juni statt."
},
{
"role": "assistant",
"content": '{"personnes": [], "organisations": ["Publicis"], "lieux": [], "dates": ["juin"]}'
},
# Eigentliche Anfrage
{
"role": "user",
"content": "Sophie Leclerc, Direktorin bei Mistral AI, kündigte am 15. März 2026 auf der AI Paris Messe eine Partnerschaft mit Microsoft an."
}
],
temperature=0.0
)
import json
result = json.loads(response.choices[0].message.content)
print(json.dumps(result, indent=2, ensure_ascii=False))
Texttransformation folgt einer anderen Logik: Sie übertragen kein Schema, sondern ein Sprachregister. Ein einziges Beispiel zur Vereinfachung – die Übersetzung der Transformer-Architektur in einen zugänglichen Satz – lehrt das Modell das gewünschte Abstraktionsniveau, etwas, das keine Anweisung wie „seien Sie pädagogisch” mit dieser Präzision erreichen würde.
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Transformieren Sie technischen Text in eine Laienzusammenfassung."
},
# Beispiel
{
"role": "user",
"content": "Das Modell verwendet eine Transformer-Encoder-Decoder-Architektur mit Multi-Head-Aufmerksamkeit und Pre-Layer RMS-Normalisierung."
},
{
"role": "assistant",
"content": "Dieses KI-System verwendet fortschrittliche Technologie, die es ihm ermöglicht, Text zu verstehen und zu generieren, indem es Beziehungen zwischen Wörtern parallel und effizient analysiert."
},
# Eigentliche Anfrage
{
"role": "user",
"content": "Die API verwendet Nucleus-Sampling mit top_p, um die Wahrscheinlichkeitsverteilung von Kandidatentokens während der autoregressiven Generierung zu kürzen."
}
]
)
print(response.choices[0].message.content)
Dynamisches Few-Shot
In der Produktion führt ein festes Set von Beispielen bei der Hälfte Ihrer Anfragen zu Problemen: Technische Beispiele vergrößern unnötigerweise eine Abfrage zur Rechnungsstellung. Die Lösung besteht darin, eine Beispielbasis nach Kategorien zu erstellen und dann nur diejenigen zu injizieren, die zum im upstream erkannten Kontext passen. Die folgende Funktion montiert den System-Prompt, die Beispiele für die Kategorie und die eigentliche Frage in der richtigen Reihenfolge.
# Beispielbasis
EXAMPLES = {
"technical": [
{"user": "Wie konfiguriere ich eine VPN?", "assistant": "Hier sind die Schritte..."},
{"user": "Mein Server gibt einen 502-Fehler zurück.", "assistant": "Fehler 502..."},
],
"sales": [
{"user": "Was sind Ihre Tarife?", "assistant": "Unsere Pläne beginnen bei..."},
{"user": "Gibt es eine Testphase?", "assistant": "Ja, 14 Tage..."},
],
"billing": [
{"user": "Ich habe meine Rechnung nicht erhalten.", "assistant": "Überprüfen Sie Ihre..."},
{"user": "Wie ändere ich meinen Plan?", "assistant": "Gehen Sie zu..."},
]
}
def build_messages(category: str, user_question: str) -> list:
"""Erstellen Sie Nachrichten mit dynamischem Few-Shot."""
messages = [
{"role": "system", "content": "Technischer Support-Assistent."}
]
# Beispiele für die Kategorie hinzufügen
for ex in EXAMPLES.get(category, []):
messages.append({"role": "user", "content": ex["user"]})
messages.append({"role": "assistant", "content": ex["assistant"]})
# Die eigentliche Frage hinzufügen
messages.append({"role": "user", "content": user_question})
return messages
# Verwendung
messages = build_messages("technical", "Meine Docker-Deployment scheitert.")
response = client.chat.complete(
model="mistral-large-latest",
messages=messages
)
Was ein gutes Beispielset ausmacht
Few-Shot-Prompting scheitert am häufigsten aufgrund mangelnder Vielfalt: Drei eindeutig positive Bewertungen und das Modell wird alles als POSITIVE klassifizieren. Decken Sie normale Fälle und Grenzfälle ab, einschließlich eines Beispiels dafür, was das Modell NICHT tun muss – die Darstellung einer Ablehnung ist oft effektiver als das Verbot mit einer Regel. Konsistenz in der Form ist ebenso wichtig: Wenn ein Beispiel POSITIVE zurückgibt und ein anderes Positive, haben Sie dem Modell gerade beigebracht, dass die Groß-/Kleinschreibung frei ist.
Zwei Gewohnheiten vervollständigen die Übung. Zählen Sie Tokens, da jedes Beispiel bei jedem Aufruf als Eingabe berechnet wird – ein Set mit acht Paaren wird schnell zum Hauptkostentreiber für eine hochvolumige Klassifizierungs-API. Und testen Sie zuerst ohne Beispiele: Aktuelle Modelle bewältigen Zero-Shot-Aufgaben, die vor zwei Jahren fünf Beispiele erforderten, und Sie sparen, was Sie gar nicht schreiben mussten.
Kernaussagen
- Few-Shot injiziert gefälschte user/assistant-Paare vor der eigentlichen Anfrage
- 3–5 Beispiele reichen für die meisten Klassifizierungs- und Extraktionsaufgaben aus
- Verwenden Sie
temperature=0mit Few-Shot, um die Konsistenz zu maximieren - Dynamisches Few-Shot wählt relevante Beispiele basierend auf dem Kontext aus
- Über 10 Beispiele hinaus sollten Sie Feinabstimmung statt Few-Shot in Betracht ziehen