Роли и история диалога
Из чего состоит диалог с моделью: три роли и массив сообщений.
Сообщение — это пара «роль + содержимое». Диалог — это упорядоченный список таких сообщений, который вы целиком отправляете в каждом запросе.
Три роли
| Роль | Кто говорит / зачем |
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любым