Zum Inhalt springen

Text-Generierung (Chat Completions)

Der /chat/completions-Endpunkt ist der zentrale Baustein der noris “LLM as a Service”-Plattform. Sie übermitteln eine Liste von Nachrichten (ein “Gespräch”), das Modell antwortet mit einer weiteren Nachricht, die nahtlos an die Konversation angefügt werden kann.

Jede Nachricht besitzt eine role (system, user oder assistant) sowie ein content-Feld. Die Reihenfolge der Nachrichten entspricht dem chronologischen Verlauf des Gesprächs. Diese Struktur ermöglicht es Ihnen, System-Anweisungen, Benutzeranfragen und bisherige Modellantworten explizit voneinander zu trennen.

Nachrichten mit der Rolle system steuern Verhalten, Tonfall und Formatierungsregeln des Modells, ohne direkt als Frage wahrnehmbar zu sein. Platzieren Sie die System-Nachricht typischerweise als erstes Element im messages-Array. Eine klare, prägnante System-Anweisung verbessert die Konsistenz der Antworten erheblich.

Terminal-Fenster
curl -X POST https://ai.noris.de/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "vllm/release/gpt-oss-120b",
"messages": [
{"role": "system", "content": "Du bist ein präziser technischer Assistent. Antworte kompakt und auf Deutsch."},
{"role": "user", "content": "Was ist ein Vektor-Index?"}
]
}'

Übergeben Sie den vollständigen Gesprächsverlauf bei jedem Aufruf. Auf diese Weise “erinnert” sich das Modell an vorherige Aussagen. Alternativ können Sie den Verlauf serverseitig verwalten und nur die relevanten letzten Turns mitsenden, um Token-Kosten zu reduzieren.

Das folgende Beispiel zeigt zwei vollständige Turns (jeweils eine User- und eine Assistant-Nachricht) gefolgt von einer neuen User-Frage:

Terminal-Fenster
curl -X POST https://ai.noris.de/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "vllm/release/gpt-oss-120b",
"messages": [
{"role": "system", "content": "Du bist ein hilfsbereiter Assistent."},
{"role": "user", "content": "Was ist die Hauptstadt von Frankreich?"},
{"role": "assistant", "content": "Die Hauptstadt von Frankreich ist Paris."},
{"role": "user", "content": "Wie viele Einwohner hat diese Stadt ungefähr?"},
{"role": "assistant", "content": "Paris hat rund 2,1 Millionen Einwohner im Stadtgebiet."},
{"role": "user", "content": "Und wie heißt der Fluss, der dort fließt?"}
]
}'

Mit dem openai-SDK sieht derselbe Mehrfachturn-Dialog in Python so aus:

from openai import OpenAI
client = OpenAI(base_url="https://ai.noris.de/v1", api_key="YOUR_API_KEY")
conversation = [
{"role": "system", "content": "Du bist ein hilfsbereiter Assistent."},
{"role": "user", "content": "Was ist die Hauptstadt von Frankreich?"},
{"role": "assistant", "content": "Die Hauptstadt von Frankreich ist Paris."},
{"role": "user", "content": "Wie viele Einwohner hat diese Stadt ungefähr?"},
{"role": "assistant", "content": "Paris hat rund 2,1 Millionen Einwohner im Stadtgebiet."},
{"role": "user", "content": "Und wie heißt der Fluss, der dort fließt?"}
]
response = client.chat.completions.create(
model="vllm/release/gpt-oss-120b",
messages=conversation
)
print(response.choices[0].message.content)

Die Antwort des Endpunkts ist ein JSON-Objekt mit mehreren Feldern. Die wichtigsten sind:

FeldBedeutung
idEindeutige Kennung der Anfrage.
objectObjekttyp, i.d.R. "chat.completion" (bei Streaming "chat.completion.chunk").
choicesListe möglicher Antworten; bei n=1 (Standard) enthält sie genau ein Element.
choices[i].indexPosition dieser Alternative innerhalb von choices.
choices[i].message.roleRolle der erzeugten Nachricht, normalerweise "assistant".
choices[i].message.contentDer eigentliche generierte Text.
choices[i].finish_reasonGrund für den Abschluss: "stop", "length", "tool_calls" u.a.
usage.prompt_tokensAnzahl Tokens im Eingabe-Prompt.
usage.completion_tokensAnzahl generierter Tokens in der Antwort.
usage.total_tokensSumme aus Prompt- und Completion-Tokens (Grundlage der Abrechnung in AI-Punkten).

Ein minimales Antwortbeispiel:

{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Die Seine fließt durch Paris."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 48, "completion_tokens": 8, "total_tokens": 56}
}

Prüfen Sie finish_reason: Ist der Wert "length", wurde die Antwort wegen Erreichen des Token-Limits abgeschnitten und sollte fortgesetzt werden. Bei "tool_calls" erwartet das Modell die Ausführung eines Werkzeugs, siehe Tool Calling.