Как устроено взаимодействие с LLM API

Что происходит, когда ваше приложение «разговаривает» с большой языковой моделью через HTTP.

LLM API — это HTTP-эндпоинт, которому вы посылаете текст (промпт) и параметры, а в ответ получаете сгенерированный моделью текст.

Запрос → ответ, и ничего магического

С точки зрения кода работа с Claude или GPT — это обычный сетевой запрос. Вы формируете JSON-тело: модель, входные сообщения, лимит на длину ответа. Сервер прогоняет вход через нейросеть и возвращает JSON с текстом. Никакого постоянного соединения, никакой «сессии» на сервере — каждый вызов независим.

Ваше приложение  ──POST /v1/messages──▶  API провайдера
                 ◀──── JSON с ответом ───

API без состояния (stateless)

Это ключевой момент, который путает новичков. Модель не помнит предыдущие запросы. Если вы спросили «Как меня зовут?» после того как в прошлом запросе представились, — она не ответит, потому что прошлый запрос для неё не существует. Чтобы поддержать диалог, вы сами при каждом вызове отправляете всю историю переписки. Об этом — весь второй раздел курса.

Из чего состоит запрос

ПолеЗачем
modelкакую модель использовать (например, claude-opus-4-8)
messagesмассив сообщений диалога (роль + содержимое)
max_tokensверхний предел длины ответа
system / system-рольинструкция, задающая поведение модели

Как выглядит минимальный обмен

Тело запроса (для Anthropic Messages API) — это JSON:

{
  "model": "claude-opus-4-8",
  "max_tokens": 1024,
  "messages": [
    {"role": "user", "content": "Привет! Назови столицу Франции."}
  ]
}

Ответ — тоже JSON, текст лежит внутри массива блоков:

{
  "id": "msg_01XYZ",
  "role": "assistant",
  "content": [
    {"type": "text", "text": "Столица Франции — Париж."}
  ],
  "stop_reason": "end_turn",
  "usage": {"input_tokens": 14, "output_tokens": 7}
}

Почему важно понимать это с самого начала

Вся «магия» LLM-приложений (чат-боты, ассистенты, RAG, агенты) строится поверх этого простого цикла «запрос-ответ». Память, инструменты, потоковый вывод — это надстройки. Если держать в голове, что сервер ничего не помнит и каждый раз получает полный контекст, большинство ошибок интеграции отпадают сами.

Итог

  • Вызов LLM — это обычный HTTP POST с JSON-телом.
  • API без состояния: историю диалога отправляете вы при каждом запросе.
  • В ответе — текст плюс служебные поля: причина остановки и счётчики токенов.
Проверьте себя
1. Что означает «API без состояния» (stateless) применительно к LLM?
AМодель хранит историю всех ваших диалогов на сервере
BКаждый запрос независим, и историю диалога приложение отправляет само при каждом вызове
CМожно отправить только один запрос за всё время
DОтвет всегда одинаковый при одинаковом вопросе
2. Где в ответе Anthropic Messages API находится сгенерированный текст?
AВ поле text на верхнем уровне
BВ массиве content, в блоке с type == "text"
CВ поле messages
DВ поле stop_reason
3. Зачем при поддержке многоходового диалога отправлять всю историю заново?
AЧтобы сэкономить токены
BПотому что API stateless и без истории модель не знает контекста предыдущих реплик
CТак требует протокол HTTP
DЧтобы ответ приходил быстрее
Поддержать проект