Zum Hauptinhalt springen
Lektion 10 von 16 · Chat Completions: Beherrschung der API

Few-Shot-Prompting über die API

Lektion 10 von 16 Aktualisiert am 2. November 2026 Entwickler
Auf dieser Seite
  1. Lernen durch Beispiele
  2. Wie viele Beispiele bereitstellen
  3. Zwei Anwendungen, die die Ausgabe verändern
  4. Dynamisches Few-Shot
  5. Was ein gutes Beispielset ausmacht
  6. Kernaussagen

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.

AnzahlWann einsetzen
0 (Zero-Shot)Einfache Aufgaben, die das Modell von Natur aus bewältigt
1–2Standard-Ausgabeformat (JSON, Label)
3–5Klassifizierung mit mehreren Kategorien
5–10Komplexe 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=0 mit 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