NL ▾
API-sleutel ophalen

Uitleg API-parameters voor LLM's: van request-velden tot response-velden

De eerste keer dat je de documentatie van een chat-completie-API ziet, schrikt je vaak van de lange lijst parameters. Stel je een API-call voor als een bestelling in een restaurant: messages is je gesprek met de ober, temperature bepaalt hoe creatief de chef mag zijn, max_tokens is de maximale portie, en tools stelt de chef in staat om de keuken te bellen voor ingrediënten. We lichten elke parameter stap voor stap grondig uit.

Bijgewerkt op

Kernpunten

  • messages bestaan uit de rollen system, user, assistant en tool. Het model heeft geen geheugen; jij moet de geschiedenis aanleveren.
  • temperature regelt randomisering, top_p de kandidaatruimte. Ze lijken op elkaar; pas meestal maar één aan.
  • finish_reason bepaalt de actie: stop is normaal, length is afgekapt, tool_calls vereist functies.
  • usage is de enige betrouwbare bron voor facturatie; lees dit veld altijd.

Hoe ziet een request eruit

Endpoint: POST https://api.apidamoxing.com/v1/chat/completions. Autorisatie: Authorization: Bearer <key>. Body is JSON, compatibel met OpenAI chat-completions. Zie het volledige voorbeeld:

curl https://api.apidamoxing.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "system", "content": "你是一位耐心的天文科普作者。"},
      {"role": "user", "content": "为什么月亮总是同一面朝向地球?"}
    ],
    "temperature": 0.7,
    "top_p": 0.9,
    "max_tokens": 400,
    "stop": ["###"]
  }'

Vul bij model alleen uncensored in, want er is maar één model. Controleer met GET /v1/models. We leggen de velden nu uit.

De parameters vallen in drie groepen: 'wat' (messages, tools), 'hoe' (temperature, top_p) en 'hoeveel/wanneer' (max_tokens, stop, stream). Herken de groep om de functie te raden.

messages: het 'notitieboekje' van het gesprek

messages is een array met role en content. Het model leest alles opnieuw en schrijft de volgende pagina. Het onthoudt niets; jij moet de geschiedenis volledig meesturen.

roleAuteurDoel
systemJij (ontwikkelaar)Instellen van identiteit, regels en formaat; meestal vooraan
userEindgebruikerVraag of instructie
assistantModel (of door jou toegevoegde geschiedenis)Eerdere antwoorden voor context
toolJouw programmaUitvoering van functieaanroepen, vereist tool_call_id

Een veelgebruikte truc: wil je dat het model in een bepaalde toon verder schrijft, voeg dan zelf een assistant-bericht toe aan de geschiedenis. Onthoud dat de prompt en de uitvoer samen niet meer dan 100,000 tokens mogen beslaan; hoe langer de geschiedenis, hoe meer ruimte dit in beslag neemt.

Een concreet voorbeeld. Je bouwt een customer support-assistent met de system-prompt 'Beantwoord alleen vragen over bestellingen, maximaal drie zinnen'. De gebruiker vraagt in de eerste ronde naar de levertijd en in de tweede ronde 'en wat als ik het wil retourneren?'. De tweede request moet messages bevatten: system, de user-message van ronde 1, de assistant-response van het model uit ronde 1, en de user-message van ronde 2. Ontbreekt er één, dan weet het model niet waar 'dat' naar verwijst.

Samplingparameters: de "ruimte" aanpassen

Wanneer het model een token genereert, kent het eerst kansen toe aan alle kandidaten en trekt het vervolgens een keuze. De volgende twee parameters zijn de knoppen om de trekregels aan te passen:

ParameterAnalogieHoe te begrijpenVeelgebruikte waarden
temperatureCreativiteit van de chef-kokLager is conservatiever en stabieler; hoger is divergent0 tot 1,2; laag voor vragen en antwoorden, hoog voor creatief werk
top_pAlleen trekken uit de topkandidatenAlleen trekken uit kandidaten waarvan de cumulatieve waarschijnlijkheid p bereikt0,8 tot 1, standaard is meestal voldoende

Beide bepalen 'hoe willekeurig', maar vanuit een ander perspectief. Als je ze tegelijk aanpast, is het moeilijk te zien welk effect van welke parameter komt. Pas daarom bij voorkeur maar één aan. Deze standaard velden voor sampling worden doorgegeven zoals ze zijn; de API herschrijft ze niet.

Nog een concreet voorbeeld: stel dat de drie meest waarschijnlijke volgende woorden van het model kansen van 60%, 30% en 10% hebben. Een lagere temperature maakt het woord met 60% kans nog dominanter, waardoor de output lijkt alsof er altijd voor het eerste woord wordt gekozen. Een hogere temperature maakt de kansen dichter bij elkaar, waardoor minder waarschijnlijke woorden vaker getrokken worden. Bij top_p van 0,9 worden alleen de eerste twee woorden behouden die samen 90% van de kans dekken; het derde woord valt af. Deze cijfers zijn alleen bedoeld om het principe uit te leggen en geen echte kansen.

Lengte en stopregels beheren: max_tokens, stop, stream

ParameterDoelBelangrijkste punten
max_tokensBeperkt het maximale aantal tokens dat deze keer gegenereerd wordtStandaard 2048, maximaal 32.000 per keer; samen met de prompt mag dit niet meer dan 100.000 zijn
stopStoppen bij een opgegeven tekenreeksKan een tekenreeksarray zijn, handig voor segmentatie of het afkappen van vaste formaten
streamOf er gestreamd teruggegeven moet wordenStel in op true voor streaming via SSE; er wordt automatisch een laatste blok met usage toegevoegd

max_tokens is als de grootte van een bord: als het bord te klein is, wordt het weggehaald voordat het eten op is, en dan is finish_reason 'length'. stop is als een afgesproken signaal: de kok stopt zodra hij het signaal hoort. stream verandert niet de inhoud, alleen de manier van leveren: van 'alles klaar serveren' naar 'een hap tegelijk serveren', waardoor de gebruiker het gevoel heeft dat de respons sneller is.

Een handige toepassing van stop: laat het model een vast format volgen zoals 'Vraag: ... Antwoord: ...###'. Stel ### in als stop-teken, dan stopt de generatie automatisch bij het scheidingsteken. Dit bespaart tokens en voorkomt dat het model er achter nog onnodige tekst bij verzint. Let op: als stop geraakt wordt, is finish_reason ook 'stop'. Als je dit wilt onderscheiden van een normale stop, moet je zelf de inhoud controleren.

tools en tool_choice: het model 'laten bellen'

Het model heeft geen toegang tot realtime data. Bij function calling geef je eerst aan welke functies beschikbaar zijn. Als het model een functie nodig heeft, antwoordt het niet direct, maar vraagt het om een functie aan te roepen met bepaalde parameters. Jouw programma voert de functie uit en geeft het resultaat terug, waarna het model het antwoord formuleert. De indeling is compatibel met OpenAI.

ParameterWaardeUitleg
toolsArray met functiedescriptiesElk item bevat name, description en parameters in JSON Schema-formaat
tool_choice"auto" / "none" / specifieke functieauto laat het model beslissen, none verbiedt aanroepen, een specifieke functie forceert het aanroepen
import json
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.apidamoxing.com/v1", api_key=os.environ["API_KEY"])

tools = [{
    "type": "function",
    "function": {
        "name": "get_tide_time",
        "description": "查询某港口今天的高潮时刻",
        "parameters": {
            "type": "object",
            "properties": {"port": {"type": "string", "description": "港口名称"}},
            "required": ["port"],
        },
    },
}]

messages = [{"role": "user", "content": "青岛今天几点涨潮?"}]
first = client.chat.completions.create(
    model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = first.choices[0].message

if msg.tool_calls:
    call = msg.tool_calls[0]
    args = json.loads(call.function.arguments)
    result = {"port": args["port"], "high_tide": "14:20"}   # 这里换成你自己的查询
    messages.append(msg)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result, ensure_ascii=False)})
    final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
    print(final.choices[0].message.content)
else:
    print(msg.content)

Het proces verloopt in twee ronden: in de eerste ronde haal je tool_calls op, in de tweede ronde voeg je de resultaten met role 'tool' toe en vraag je opnieuw op. Hoe specifieker de description, hoe beter het model weet wanneer het moet aanroepen. De parameters zijn een JSON-string; parseer en valideer ze altijd met json.loads, vertrouw ze niet zomaar.

Responsvelden: de 'bon' begrijpen

Een succesvolle respons ziet er ongeveer zo uit, met vaste velden:

{
  "id": "chatcmpl-xxxx",
  "object": "chat.completion",
  "model": "uncensored",
  "choices": [
    {
      "index": 0,
      "message": {"role": "assistant", "content": "因为潮汐锁定……"},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 38, "completion_tokens": 212, "total_tokens": 250}
}
VeldBetekenis
choicesResultatenarray, meestal maar één item; de inhoud staat in choices[0].message.content
finish_reasonReden van einde: 'stop' voor normaal einde; 'length' als afgekapt door max_tokens; 'tool_calls' als het model een functieaanroep vraagt
usage.prompt_tokensTokens verbruikt voor input
usage.completion_tokensTokens verbruikt voor output
usage.total_tokensSom van beide

Kijk in de code eerst naar finish_reason: als het 'length' is, geef dan een melding dat de inhoud is afgekapt of voer automatisch een vervolg uit; als het 'tool_calls' is, ga dan naar de tak voor functieverwerking. De rol van usage wordt in token en facturatie gedetailleerder uitgelegd.

Veelgemaakte fouten met parameters

  • max_tokens verwarren met 'inputlimiet'. Het regelt alleen de output; de input bepaal jij.
  • Gelooven dat het model zich vorige verzoeken herinnert. Elk verzoek is onafhankelijk; de historie voer je zelf mee.
  • Een temperature van 0 betekent dat het resultaat elke keer exact hetzelfde is. Dit is stabieler, maar je mag niet aannemen dat het letterlijk per token identiek is.
  • Lees in stream-modus direct choices[0].message. In de blokken van de stream is het veld delta; je moet deze zelf aan elkaar plakken.
  • Je vergeet de assistant-berichten met tool_calls toe te voegen na de tool-aanroep, wat leidt tot een fout in de tweede ronde.

De betekenis van foutcodes en herstelstrategieën vind je in documentatie. Voor een compleet voorbeeld waarin deze parameters aan elkaar worden geknoopt, zie Chatbot bouwen.

Veelgestelde vragen

Ja, maar het is moeilijk om het effect van elk apart te beoordelen. In de meeste gevallen is aanpassen van alleen temperature voldoende; pas pas top_p aan als je het bereik van kandidaten fijnere wilt sturen.

Ja, maar het effect is moeilijk te isoleren. Pas in de meeste gevallen alleen temperature aan; pas pas top_p aan als je de candidate range fijn moet afstellen.

Dit betekent dat de output afgekapt is door max_tokens. Je kunt max_tokens verhogen (maximaal 32.000) of het model laten segmenteren.

Dit geeft aan dat de uitvoer is afgekapt door max_tokens. Je kunt max_tokens verhogen tot een maximum van 32,000, of het model laten genereren in segmenten.

Ja, we gebruiken de OpenAI-indeling voor tools en tool_choice, en de tool_calls in de respons hebben dezelfde structuur.

Ja, gebruik OpenAI-formaat voor tools en tool_choice; de tool_calls in de response hebben dezelfde structuur.

Hoe haal je usage op in een stream-response?

Nadat je stream hebt ingeschakeld, wordt er automatisch een data-blok met usage toegevoegd aan het einde; lees dit uit en gebruik geen extra parameters.

Vul alleen het formulier in om je sleutel te ontvangen

Maak een account aan, kopieer je sleutel en pas de Base URL aan. Zo eenvoudig is de configuratie.

API-sleutel verkrijgen