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

N-Vervollständigungen

Lektion 15 von 16 Aktualisiert am 2. November 2026 Entwickler
Auf dieser Seite
  1. Mehrere Antworten in einer einzigen Anfrage generieren
  2. Die beste Antwort auswählen
  3. Vergleich zweier Prompts an einem Stichprobenumfang
  4. Verbesserung der Klassifizierungszuverlässigkeit durch Abstimmung
  5. Wann n > 1 verwendet werden sollte
  6. Kernaussagen

Mehrere Antworten in einer einzigen Anfrage generieren

Der Parameter n weist das Modell an, mehrere alternative Antworten auf denselben Prompt innerhalb einer einzigen API-Anfrage zu erzeugen. Obwohl dies auf den ersten Blick wie eine geringfügige Funktion erscheinen mag, ermöglicht es drei ernstzunehmende Anwendungsfälle: den Vergleich zweier Prompt-Formulierungen an einem Stichprobenumfang, die automatische Auswahl der besten Antwort aus einem Batch und die Erforschung des Lösungsraums anstatt sich mit der ersten Ausgabe zufriedenzugeben.

Standardmäßig ist n=1, und die API gibt eine einzige Antwort in choices zurück. Wenn Sie n=5 setzen, enthält das Array fünf Einträge, jeder mit seinem eigenen index. Beachten Sie die im folgenden Beispiel eingestellte Temperatur von 1,0: Ohne ausreichende Randomisierung wären alle fünf Antworten identisch, wodurch der Aufruf nutzlos wäre.

from mistralai.client import Mistral
import os

client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))

response = client.chat.complete(
    model="ministral-3b-latest",
    messages=[
        {"role": "user", "content": "Was ist die beste Programmiersprache für Anfänger? Nur ein Wort."}
    ],
    temperature=1.0,  # Hohe Temperatur zur Maximierung der Vielfalt
    n=5
)

for choice in response.choices:
    print(f"Antwort {choice.index}: {choice.message.content}")

Zwei Faktoren bestimmen den praktischen Nutzen dieses Parameters. Der erste ist die Abrechnung: Eingabe-Tokens werden nur einmal berechnet, da der Prompt nur einmal gesendet wird, während Ausgabe-Tokens für jede Vervollständigung berechnet werden. Bei n=5 und max_tokens=100 springt Ihr Ausgabe-Limit auf 500 Tokens. Genau dies macht n für lange Prompts attraktiv: Die Amortisierung eines großen Kontexts über fünf Antworten kostet deutlich weniger als fünf separate Aufrufe.

print(f"Prompt-Tokens  : {response.usage.prompt_tokens}")     # 1x berechnet
print(f"Antwort-Tokens : {response.usage.completion_tokens}")  # n-x berechnet
print(f"Insgesamt      : {response.usage.total_tokens}")

Der zweite Faktor ist die Kompatibilität: Nicht alle Mistral-Modelle unterstützen n. Stand April 2026 unterstützen neuere Versionen von mistral-large keine n > 1. Verwenden Sie ministral-3b-latest oder andere kompatible Modelle für diese Funktion – weshalb alle Beispiele in dieser Lektion auf diesem Modell basieren.

Die beste Antwort auswählen

Der erste Anwendungsfall umfasst die Generierung mehrerer Kandidaten und die Beibehaltung des besten basierend auf einem von Ihnen definierten Kriterium. Der Mechanismus ist absichtlich allgemein gehalten: best_of_n akzeptiert jede Bewertungsfunktion, sodass Sie messen können, was in Ihrem Kontext zählt – das Vorhandensein eines obligatorischen Schlüssels, die Gültigkeit von JSON oder die Einhaltung einer Zielgröße. Die Funktion length_scorer illustriert dieses letzte Kriterium, bei dem die Punktzahl proportional zur Abweichung von der Zielgröße abnimmt.

def best_of_n(client, messages, n=5, scorer=None, **kwargs):
    """Generiert N Antworten und wählt die beste aus."""
    response = client.chat.complete(
        model="ministral-3b-latest",
        messages=messages,
        n=n,
        temperature=0.9,
        **kwargs
    )

    candidates = [
        {
            "index": c.index,
            "content": c.message.content,
            "score": scorer(c.message.content) if scorer else 0
        }
        for c in response.choices
    ]

    if scorer:
        candidates.sort(key=lambda x: x["score"], reverse=True)

    return candidates

# Scorer: angemessene Länge (nicht zu kurz, nicht zu lang)
def length_scorer(text: str, target=200) -> float:
    """Bewertung basierend auf der Nähe zu einer Zielgröße."""
    diff = abs(len(text) - target)
    return max(0, 1 - diff / target)

candidates = best_of_n(
    client,
    [{"role": "user", "content": "Schreiben Sie eine Zusammenfassung der generativen KI im Jahr 2026."}],
    n=5,
    scorer=length_scorer,
    max_tokens=300
)

print("Beste Antwort:")
print(candidates[0]["content"])
print(f"Punktzahl: {candidates[0]['score']:.2f}")

Vergleich zweier Prompts an einem Stichprobenumfang

Der zweite Anwendungsfall ist methodischer Natur und nicht produktbezogen. Wenn Sie zwischen zwei Prompt-Formulierungen entscheiden, beweist der Vergleich einer einzelnen Antwort mit einer anderen nichts: Die Modellvarianz allein könnte den Unterschied erklären. Indem Sie für jede Version N Antworten generieren und die durchschnittliche Länge sowie die Rate der eindeutigen Antworten messen, erhalten Sie vorläufige Beweise. Eine Diversitätspunktzahl von 1,0 bei einem Prompt, der eine stabile Formatierung erzeugen soll, ist ein Warnsignal, keine gute Nachricht.

def ab_test_prompts(client, prompt_a: str, prompt_b: str, n: int = 5):
    """Vergleicht zwei Prompts, indem er für jeden N Antworten generiert."""
    results = {}

    for label, prompt in [("A", prompt_a), ("B", prompt_b)]:
        response = client.chat.complete(
            model="ministral-3b-latest",
            messages=[{"role": "user", "content": prompt}],
            n=n,
            temperature=0.8,
            max_tokens=200
        )

        texts = [c.message.content for c in response.choices]
        avg_length = sum(len(t) for t in texts) / len(texts)
        unique_ratio = len(set(texts)) / len(texts)

        results[label] = {
            "avg_length": round(avg_length),
            "diversity": round(unique_ratio, 2),
            "sample": texts[0][:150]
        }

    return results

# Test
results = ab_test_prompts(
    client,
    "Zusammenfassen Sie die Vorteile von Python.",
    "Listen Sie die 3 Hauptvorteile von Python in jeweils einem Satz auf."
)

for label, data in results.items():
    print(f"\nPrompt {label}:")
    print(f"  Durchschnittliche Länge : {data['avg_length']} Zeichen")
    print(f"  Diversität              : {data['diversity']}")
    print(f"  Stichprobe              : {data['sample']}...")

Verbesserung der Klassifizierungszuverlässigkeit durch Abstimmung

Der dritte Anwendungsfall bietet die höchste Rendite in der Produktion. Bei einer Klassifizierungsaufgabe sagt eine einzelne Antwort nichts über das Vertrauen des Modells aus: Die Antwort könnte offensichtlich sein oder eine Grenzzwischenentscheidung zwischen zwei Kategorien sein. Generieren Sie sieben Antworten, zählen Sie die Stimmen, und Sie erhalten sowohl ein Label als auch eine handlungsrelevante Vertrauensrate – eine Klassifizierung von 4/7 kann zur menschlichen Validierung weitergeleitet werden, während eine 7/7 direkt durchgelassen wird. Die Verwendung einer ungeraden Zahl vermeidet Unentschieden.

from collections import Counter

def majority_vote(client, messages, n=7, **kwargs):
    """Mehrheitsabstimmungsklassifizierung über N Vervollständigungen."""
    response = client.chat.complete(
        model="ministral-3b-latest",
        messages=messages,
        n=n,
        temperature=0.7,
        max_tokens=20,
        **kwargs
    )

    votes = [c.message.content.strip().upper() for c in response.choices]
    counts = Counter(votes)
    winner, count = counts.most_common(1)[0]
    confidence = count / n

    return {
        "result": winner,
        "confidence": round(confidence, 2),
        "votes": dict(counts),
        "n": n
    }

# Sentiment-Klassifizierung
result = majority_vote(
    client,
    messages=[
        {"role": "system", "content": "Klassifizieren Sie die Stimmung: POSITIV, NEGATIV oder NEUTRAL. Antworten Sie mit nur einem Wort."},
        {"role": "user", "content": "Das Produkt ist okay, aber die Lieferung war sehr langsam."}
    ],
    n=7
)

print(f"Ergebnis    : {result['result']}")
print(f"Vertrauen   : {result['confidence']:.0%}")
print(f"Stimmen     : {result['votes']}")

Wann n > 1 verwendet werden sollte

Dieser Parameter ist nicht überall gerechtfertigt: Bei Standardverkehr ist jede zusätzliche Vervollständigung eine Ausgabe-Kosten ohne Gegenleistung. Die folgende Tabelle fasst vertretbare Werte basierend auf dem Szenario zusammen.

SzenarioEmpfohlenes nWarum
Standardproduktion1Minimale Kosten
Qualitätsauswahl3-5Best-of-N für kritischen Text
Robuste Klassifizierung5-9 (ungerade)Mehrheitsabstimmung für Zuverlässigkeit
Prompt A/B-Test5-10Ausreichender Stichprobenumfang für den Vergleich
Brainstorming5-10Maximale Ideen-Vielfalt

Kernaussagen

  • Der Parameter n generiert mehrere Antworten in einer einzigen API-Anfrage.
  • Eingabe-Tokens werden einmal berechnet; Ausgabe-Tokens werden mit N multipliziert.
  • Nicht alle Modelle unterstützen n > 1 – überprüfen Sie die Kompatibilität.
  • Mehrheitsabstimmungen verbessern die Klassifizierungszuverlässigkeit.
  • Best-of-N wählt die beste Antwort basierend auf einem messbaren Kriterium aus.
  • Verwenden Sie eine hohe Temperatur mit n > 1, um die Vielfalt der Antworten zu maximieren.