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.
System-Prompts
Abschnitt betitelt „System-Prompts“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.
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?"} ] }'Multi-Turn-Gespräche
Abschnitt betitelt „Multi-Turn-Gespräche“Ü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:
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)Response-Struktur
Abschnitt betitelt „Response-Struktur“Die Antwort des Endpunkts ist ein JSON-Objekt mit mehreren Feldern. Die wichtigsten sind:
| Feld | Bedeutung |
|---|---|
id | Eindeutige Kennung der Anfrage. |
object | Objekttyp, i.d.R. "chat.completion" (bei Streaming "chat.completion.chunk"). |
choices | Liste möglicher Antworten; bei n=1 (Standard) enthält sie genau ein Element. |
choices[i].index | Position dieser Alternative innerhalb von choices. |
choices[i].message.role | Rolle der erzeugten Nachricht, normalerweise "assistant". |
choices[i].message.content | Der eigentliche generierte Text. |
choices[i].finish_reason | Grund für den Abschluss: "stop", "length", "tool_calls" u.a. |
usage.prompt_tokens | Anzahl Tokens im Eingabe-Prompt. |
usage.completion_tokens | Anzahl generierter Tokens in der Antwort. |
usage.total_tokens | Summe 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.
Weiterführende Themen
Abschnitt betitelt „Weiterführende Themen“- Streaming-Responses: Antworten tokenweise entgegennehmen und sofort anzeigen.
- Tool Calling (Function Calling): Funktionen und externe APIs ins Gespräch einbinden.
