Роли и история диалога

Из чего состоит диалог с моделью: три роли и массив сообщений.

Сообщение — это пара «роль + содержимое». Диалог — это упорядоченный список таких сообщений, который вы целиком отправляете в каждом запросе.

Три роли

РольКто говорит / зачем
systemинструкция от вас: задаёт характер, правила, формат ответа
userреплика пользователя (или ваше задание модели)
assistantответ модели; вы возвращаете его в историю, чтобы продолжить диалог

У Anthropic роль system выносится в отдельный параметр system, а массив messages чередует user и assistant. У OpenAI системное сообщение кладётся прямо в messages первым элементом.

Как растёт история

Диалог накапливается так: пользователь сказал → модель ответила → вы дописали её ответ в массив → пользователь сказал снова. На каждом шаге массив длиннее, и вы отправляете его весь.

[
  {"role": "user", "content": "Меня зовут Алиса."},
  {"role": "assistant", "content": "Приятно познакомиться, Алиса!"},
  {"role": "user", "content": "Как меня зовут?"}
]

Только потому, что первые два сообщения снова в массиве, модель сможет ответить «Алиса» на третье. Уберите их — и она не знает имени.

Сборка массива messages (запускаемо)

Соберём историю программно — чистый Python, без сети:

import json

messages = []

def add(role, text):
    messages.append({"role": role, "content": text})

add("user", "Привет! Кто ты?")
add("assistant", "Я ассистент. Чем помочь?")
add("user", "Объясни, что такое токен.")

print(json.dumps(messages, ensure_ascii=False, indent=2))
print("Всего сообщений:", len(messages))
print("Последняя роль:", messages[-1]["role"])

Вывод:

[
  {
    "role": "user",
    "content": "Привет! Кто ты?"
  },
  {
    "role": "assistant",
    "content": "Я ассистент. Чем помочь?"
  },
  {
    "role": "user",
    "content": "Объясни, что такое токен."
  }
]
Всего сообщений: 3
Последняя роль: user

Правила, которые нельзя нарушать

  • Первое сообщение в messages — обязательно user (не assistant).
  • Роли по смыслу чередуются: реплика пользователя, ответ модели, и так далее.
  • Чтобы продолжить диалог, ответ модели (роль assistant) нужно дописать в массив перед новой репликой пользователя.

Итог

  • Диалог — это массив сообщений с ролями system/user/assistant.
  • Память диалога обеспечиваете вы, дописывая ответы ассистента в историю.
  • Первое сообщение — всегда user.
Проверьте себя
1. Какая роль задаёт модели правила поведения и формат ответа?
Auser
Bassistant
Csystem
Ddeveloper
2. Зачем дописывать ответ модели (роль assistant) обратно в массив messages?
AЧтобы посчитать токены
BЧтобы при следующем запросе модель видела свой прошлый ответ и продолжила диалог связно
CЭто требование протокола HTTP
DЧтобы ускорить ответ
3. Каким должно быть первое сообщение в массиве messages?
Aassistant
Bsystem
Cuser
Dлюбым
Поддержать проект