Parámetros de la API de LLM: de los campos de solicitud a los de respuesta
Al ver la documentación de la API de chat completion por primera vez, la larga lista de parámetros puede asustar. Imagina una llamada como pedir comida: messages es tu conversación, temperature es cuánto improvisar, max_tokens la porción máxima, y tools permite llamar a la cocina. Esta guía lo explica todo con tablas.
Actualizado el
Puntos clave
- messages incluye roles system, user, assistant y tool. El modelo no tiene memoria; tú debes proporcionar el historial.
- temperature controla la aleatoriedad y top_p el rango de candidatos; suelen ser similares, ajusta solo uno.
- finish_reason indica cómo tratar el resultado: stop es finalización normal, length es truncamiento, tool_calls requiere ejecutar funciones.
- usage es la única fuente fiable para facturación y presupuesto; léelo siempre.
Aspecto de una solicitud
El endpoint es POST https://api.apidamoxing.com/v1/chat/completions, el encabezado de autenticación es Authorization: Bearer <key> y el cuerpo es JSON, compatible con la API de chat de OpenAI. Veamos una solicitud completa con campos comunes:
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": ["###"]
}'Nota: model solo acepta uncensored porque el servicio tiene un solo modelo, sin opciones. Confírmalo con GET /v1/models. Explicamos campo por campo.
Los parámetros se dividen en: qué decir (messages, tools), cómo decirlo (temperature, top_p) y cuánto/parar (max_tokens, stop, stream). Clasifica cualquier campo desconocido para adivinar su uso.
messages: el "libro de actas" de la conversación
messages es un array con role y content. Es como un acta: el modelo lee todo desde cero cada vez. No recuerda, así que debes enviar el historial completo.
| role | Quién escribe | Uso |
|---|---|---|
| system | Tú (desarrollador) | Define identidad, reglas y formato; colócalo al inicio |
| user | Usuario final | Pregunta o instrucción |
| assistant | Modelo (o historial añadido) | Respuestas previas para contexto multironda |
| tool | Tu programa | Resultado de llamada a función, requiere tool_call_id |
Un truco común: si quieres que el modelo continúe escribiendo con un tono específico, puedes construir un mensaje de assistant y añadirlo al historial. Recuerda que el prompt y la salida combinados no pueden superar los 100,000 tokens; cuanto más largo sea el historial, más espacio ocupará.
Ejemplo: asistente de soporte con system "responde solo sobre pedidos, máx. tres frases". Usuario pregunta por envío y luego "¿y la devolución?". La segunda petición incluye: system, user 1, assistant 1, user 2. Sin todo, el modelo no entiende "y la devolución".
Parámetros de muestreo: ajustar el "margen de maniobra"
El modelo asigna probabilidades a candidatos y luego hace un sorteo. Estos parámetros ajustan las reglas del sorteo:
| Parámetro | Analogía | Interpretación | Valores comunes |
|---|---|---|---|
| temperature | Creatividad del chef | Cuanto más bajo, más conservador y estable; cuanto más alto, más disperso | De 0 a 1.2; usa valores bajos para preguntas y respuestas, y altos para creación |
| top_p | Sortear solo entre los primeros puestos | Solo se extrae de los candidatos cuya probabilidad acumulada alcanza p | De 0.8 a 1; el valor predeterminado suele ser suficiente |
Ambos controlan «cuánta aleatoriedad» desde ángulos distintos. Ajustarlos a la vez dificulta saber de qué proviene el efecto, así que se recomienda modificar solo uno a la vez. Estos campos de muestreo estándar se reenvían tal cual; la API no los modifica.
Ejemplo: probabilidades 60%, 30%, 10%. Temperature bajo favorece al primero; alto los iguala. Con top_p 0.9, solo se conservan los dos primeros (90%). Números hipotéticos.
Control de longitud y detención: max_tokens, stop, stream
| Parámetro | Función | Puntos clave |
|---|---|---|
| max_tokens | Limita el máximo de tokens que se generarán en esta petición | Predeterminado 2048, máximo por llamada 32,000; la suma con el prompt no debe superar 100,000 |
| stop | Detiene la generación al encontrar la cadena especificada | Acepta un array de cadenas; útil para segmentar o truncar formatos fijos |
| stream | Indica si la respuesta se devuelve en streaming | Al establecerlo en true se envían fragmentos vía SSE; al final se añade automáticamente un fragmento con usage |
max_tokens es como el tamaño del plato: si es pequeño, la comida se retira antes de servirla y finish_reason será length. stop actúa como una señal convenida; el chef se detiene al recibirla. stream no cambia el contenido, solo la forma de entrega: en lugar de «todo listo para servir», se pasa a «servir por porciones», lo que hace que la respuesta se sienta más rápida.
stop tiene un uso muy práctico: si pides al modelo que siga el formato «Pregunta: …… Respuesta: ……###» y estableces ### como stop, la generación se detendrá automáticamente al llegar al separador, ahorrando tokens y evitando que el modelo añada texto innecesario. Ten en cuenta que, al activarse stop, finish_reason también será stop; si necesitas distinguir el motivo, debes inspeccionar el contenido tú mismo.
tools y tool_choice: permite que el modelo «llame» para consultarte
El modelo no puede acceder a datos en tiempo real. La función function calling consiste en indicarle qué funciones tienes disponibles; cuando lo considere necesario, en lugar de responder directamente, devuelve «Llama a la función X con los parámetros Y». Tu programa ejecuta la función y devuelve el resultado; el modelo lo usa para organizar la respuesta. El formato es compatible con OpenAI.
| Parámetro | Valor | Descripción |
|---|---|---|
| tools | Array de descripciones de funciones | Cada elemento incluye name, description y parameters en formato JSON Schema |
| tool_choice | "auto" / "none" / función específica | auto deja que el modelo decida; none deshabilita las llamadas; especificar una función fuerza su uso |
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)El flujo tiene dos rondas: en la primera recibes tool_calls; en la segunda, añades el resultado con role tool y vuelves a solicitar. Cuanto más detallada sea la description, más claro tendrá el modelo cuándo llamar. Los parámetros son cadenas JSON; analízalas con json.loads y valida los datos antes de confiar en ellos.
Campos de respuesta: lee el «recibo» que devuelve la API
Una respuesta correcta tiene esta estructura fija:
{
"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}
}| Campo | Significado |
|---|---|
| choices | Array de resultados; normalmente contiene un solo elemento, y el texto está en choices[0].message.content |
| finish_reason | Motivo de finalización: stop indica finalización normal; length indica truncamiento por alcanzar max_tokens; tool_calls indica que el modelo solicitó una llamada a función |
| usage.prompt_tokens | Tokens consumidos en la entrada |
| usage.completion_tokens | Tokens consumidos en la salida |
| usage.total_tokens | Suma de ambos |
En el código, revisa primero finish_reason: si es length, avisa al usuario de que el contenido se truncó o continúa automáticamente; si es tool_calls, sigue la rama de ejecución de funciones. El uso de usage se detalla con métodos de presupuesto en tokens y facturación.
Errores comunes con los parámetros
- Tratar max_tokens como límite de entrada. Controla solo la salida; tú controlas la entrada.
- Crear la ilusión de que el modelo recuerda la petición anterior. Cada petición es independiente; tú proporcionas el historial.
- Asumir que temperature = 0 garantiza resultados idénticos. Aumenta la estabilidad, pero no asumas coincidencia carácter por carácter.
- Leer directamente choices[0].message en modo streaming. Los bloques contienen delta; debes concatenarlos tú mismo.
- Olvidaste añadir el mensaje del assistant con tool_calls tras la llamada a la herramienta, lo que provocó un error en la segunda ronda.
Puedes consultar el significado de los códigos de error y la estrategia de reintento en documentación. Para ver un ejemplo completo que conecta estos parámetros, consulta cómo crear un chatbot.
Preguntas frecuentes
Sí, pero es difícil aislar el efecto de cada uno. En la mayoría de los casos basta con ajustar temperature; modifica top_p solo cuando necesites un control fino del rango de candidatos.
Sí, pero es difícil separar los efectos. Usa solo temperature en la mayoría de casos; ajusta top_p solo si necesitas controlar el rango de candidatos.
Indica que la salida alcanzó el límite de max_tokens y se truncó. Puedes aumentar max_tokens hasta 32,000 o solicitar al modelo que genere por fragmentos.
Indica que la salida se truncó al alcanzar max_tokens. Puedes aumentar max_tokens hasta un límite de 32,000 o hacer que el modelo genere por fragmentos.
Sí. Usa tools y tool_choice con el formato de OpenAI; los tool_calls en la respuesta tienen la misma estructura.
Sí, usas el formato OpenAI de tools y tool_choice; tool_calls en la respuesta tiene la misma estructura.
Al activar stream, al final se añade automáticamente un fragmento con usage; solo debes leerlo, sin necesidad de parámetros adicionales.
Al activar stream, se añade un bloque final con usage. Léelo para obtener el uso sin parámetros extra.
Solo rellena el formulario para obtener la clave
Crea una cuenta, copia la clave y modifica la Base URL. La configuración es así de simple.