Подробно о параметрах API больших языковых моделей: от полей запроса до полей ответа
При первом взгляде на документацию по API чат-дополнения можно испугаться длинного списка параметров. Но можно представить вызов как заказ еды в ресторане: messages — это переписка с официантом, temperature — степень свободы повара, max_tokens — максимальный объем блюда, а tools — разрешение повару позвонить на кухню за ингредиентами. Мы подробно разберем каждый параметр в таблицах.
Обновлено
Ключевые моменты
- Сообщения состоят из ролей system, user, assistant и tool. Модель не помнит историю, вы должны передавать её сами.
- temperature управляет случайностью, top_p — охватом кандидатов. Их эффекты схожи, обычно достаточно настроить один.
- finish_reason определяет действие: stop — завершение, length — обрезка, tool_calls — выполнение функции.
- Поле usage — единственный надежный источник данных для биллинга и бюджета, его нужно читать каждый раз.
Как выглядит запрос
Адрес эндпоинта: POST https://api.apidamoxing.com/v1/chat/completions. Заголовок авторизации: Authorization: Bearer <key>. Тело запроса — JSON, совместимый с API чат-дополнения OpenAI. Ниже полный пример запроса с использованием всех полей:
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": ["###"]
}'Обратите внимание: model принимает только значение uncensored, так как доступна только одна модель. Подтвердить можно через GET /v1/models. Ниже описание каждого поля.
Вы увидите, что параметры делятся на три группы: «что говорить» (messages, tools), «как говорить» (temperature, top_p) и «сколько говорить, когда останавливаться» (max_tokens, stop, stream). Запомните эту классификацию, чтобы быстро определять назначение новых полей.
messages: «записная книжка» диалога
messages — это массив, где каждый элемент имеет поля role и content. Представьте, что это протокол совещания, который модель читает с начала перед каждым ответом. Она не помнит предыдущие чтения, поэтому для многооборотных диалогов вы должны передавать всю историю.
| role | Кто пишет | Назначение |
|---|---|---|
| system | Вы (разработчик) | Задает роль, правила и формат вывода. Обычно ставится в начало. |
| user | Конечный пользователь | Вопрос или инструкция |
| assistant | Модель (или ваша история) | Предыдущие ответы для контекста диалога |
| tool | Ваша программа | Результат выполнения функции, требует tool_call_id |
Частый приём: чтобы модель продолжила текст в определённом стиле, добавьте assistant-сообщение в историю. Помните, что сумма токенов промпта и вывода не должна превышать 100 000 токенов; чем длиннее история, тем больше она занимает места.
Пример. Вы создали помощника для поддержки: в system указано «Отвечайте только на вопросы по заказам, не более трёх предложений». Пользователь в первом запросе спрашивает о доставке, а во втором уточняет: «А как насчёт возврата?». Во втором запросе messages должен содержать: system, user первого запроса, assistant первого запроса, user второго запроса. Без любого из этих элементов модель не поймёт, на что относится «А».
Параметры сэмплирования: настройка «степени свободы»
При генерации каждого символа модель сначала оценивает вероятности всех кандидатов, а затем проводит лотерею. Два параметра ниже — это регуляторы правил лотереи:
| Параметр | Аналогия | Как понять | Типичные значения |
|---|---|---|---|
| temperature | Креативность повара | Чем ниже значение, тем более консервативны и стабильны результаты; чем выше — тем более они разнообразны | От 0 до 1,2: для Q&A — низкое, для творчества — высокое |
| top_p | Выбор только из наиболее вероятных вариантов | Отбор кандидатов, чья накопленная вероятность достигает p | От 0,8 до 1; по умолчанию значения обычно достаточно |
Оба параметра регулируют степень случайности, но с разных сторон. Одновременная настройка затрудняет оценку эффекта, поэтому меняйте только один параметр за раз. Эти стандартные поля выборки передаются в API без изменений, интерфейс не переписывает их.
Наглядный пример: вероятности трёх следующих слов — 60%, 30%, 10%. Низкий temperature усиливает вариант 60%, высокий — выравнивает их. При top_p 0,9 остаются слова, дающие 90% вероятности. Цифры — гипотетические предположения для объяснения принципов, а не реальные вероятности.
Контроль длины и остановки: max_tokens, stop, stream
| Параметр | Назначение | Важные особенности |
|---|---|---|
| max_tokens | Ограничивает максимальное количество сгенерированных токенов | По умолчанию 2048, максимум 32 000; вместе с промптом не должно превышать 100 000 |
| stop | Остановка генерации при обнаружении указанной строки | Можно передать массив строк; подходит для разделения текста или обрезки по фиксированному формату |
| stream | Возвращать ли ответ потоком | При значении true данные отправляются блоками через SSE, в конце автоматически добавляется блок с usage |
max_tokens — это размер тарелки для подачи блюда. Если тарелка мала, блюдо уносят недоготовленным, и finish_reason будет length. stop — это условный сигнал: модель останавливается при его получении. stream не меняет контент, а только способ доставки: вместо «всё сразу» — «готовое сразу подаётся», что создаёт ощущение более быстрого ответа.
У параметра stop есть полезное применение: если вы просите модель вывести ответ в формате «Вопрос: … Ответ: …###», установив stop на «###», генерация автоматически остановится на разделителе. Это экономит токены и предотвращает добавление лишней информации. Обратите внимание: при срабатывании stop finish_reason также равен «stop». Если вам нужно различить эти случаи, проверяйте содержимое ответа самостоятельно.
tools и tool_choice: вызов функций моделью
Модель не имеет доступа к данным в реальном времени. При вызове функций вы сначала указываете доступные функции. Если модель решает, что они нужны, она не отвечает напрямую, а возвращает запрос на вызов функции с параметрами. Ваша программа выполняет функцию и возвращает результат, после чего модель формирует ответ. Формат данных совместим с OpenAI.
| Параметр | Значение | Описание |
|---|---|---|
| tools | Массив описаний функций | Каждый элемент содержит name, description и параметры в формате JSON Schema |
| tool_choice | "auto" / "none" / имя конкретной функции | auto — выбор за моделью; none — запрет вызова; имя функции — принудительный вызов |
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)Процесс состоит из двух шагов: на первом шаге вы получаете tool_calls, на втором — добавляете результат с role: tool и отправляете запрос снова. Чем конкретнее описание, тем лучше модель понимает, когда вызывать функцию. Параметры — это строка JSON; обязательно используйте json.loads для разбора и проверки, не доверяйте данным наугад.
Поля ответа: как читать «чек» от API
Успешный ответ обычно имеет следующую структуру, поля фиксированы:
{
"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}
}| Поле | Значение |
|---|---|
| choices | Массив результатов (обычно содержит один элемент). Текст ответа находится в choices[0].message.content |
| finish_reason | Причина завершения: stop — нормальное завершение; length — обрезка из-за достижения max_tokens; tool_calls — запрос на вызов функции |
| usage.prompt_tokens | Количество токенов, потреблённых на ввод |
| usage.completion_tokens | Количество токенов, потреблённых на вывод |
| usage.total_tokens | Сумма обоих |
В коде сначала проверьте finish_reason: если это length, сообщите пользователю о сокращении контента или выполните автоматическое продолжение; если tool_calls — перейдите к ветке выполнения функции. Роль usage подробно описана в разделе Токены и тарификация, где приведён метод расчёта бюджета.
Наиболее частые ошибки при использовании параметров
- max_tokens ограничивает только объём вывода, а не ввод. Ввод контролируется вами.
- Модель не запоминает предыдущие запросы. Каждый запрос независим, историю нужно передавать вручную.
- Установка temperature в 0 означает, что каждый результат будет полностью идентичным. Это более стабильно, но не стоит предполагать, что каждый токен будет одинаковым.
- В потоковом режиме напрямую читайте choices[0].message. В блоках потока поле называется delta, его нужно склеивать самостоятельно.
- После вызова функции забывают добавить сообщение от assistant с tool_calls, что приводит к ошибке на втором шаге.
Значения кодов ошибок и стратегии повторных попыток описаны в документации. Полный пример использования всех параметров см. в статье Создание чат-бота.
Часто задаваемые вопросы
Можно ли одновременно установить temperature и top_p?
Да, можно, но сложно оценить эффект каждого параметра по отдельности. В большинстве случаев достаточно настроить только temperature; top_p следует использовать, когда требуется точный контроль над диапазоном кандидатов.
Что делать, если finish_reason равен length?
Это означает, что вывод был обрезан из-за достижения лимита max_tokens. Вы можете увеличить max_tokens (до 32,000) или попросить модель генерировать ответ частями.
Формат tools такой же, как у OpenAI?
Да, мы используем формат tools и tool_choice от OpenAI, а структура ответа tool_calls полностью идентична.
Как получить информацию об использовании токенов в потоковом режиме?
При включении stream в конце ответа автоматически добавляется блок с usage. Просто прочитайте его, дополнительные параметры не требуются.
Получите API-ключ, заполнив форму
Создайте аккаунт, скопируйте ключ, измените Base URL. Конфигурация настолько проста.