LLM против Chat models и типы сообщений

Урок объясняет два вида моделей в LangChain и систему ролей в диалоге.

Chat model — модель, которая принимает на вход список сообщений с ролями (system, human, ai) и возвращает сообщение ассистента.

Два интерфейса моделей

Исторически LangChain различает два типа обёрток. LLM — простой интерфейс «строка на вход, строка на выход» (completion-стиль). ChatModel — интерфейс «список сообщений на вход, сообщение на выход». Современные модели почти все диалоговые, поэтому в новых проектах используют именно chat-модели (ChatOpenAI, ChatAnthropic и т.п.). Понимать разницу важно: если перепутать тип, не совпадут форматы ввода-вывода.

Роли сообщений

В chat-формате каждое сообщение имеет роль:

  • System — задаёт поведение и роль ассистента («ты лаконичный технический помощник»).
  • Human — реплика пользователя.
  • AI — ответ модели (используется и в истории диалога).
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini")
messages = [
    SystemMessage(content="Отвечай одним предложением."),
    HumanMessage(content="Что такое индекс в базе данных?"),
]
print(model.invoke(messages).content)

Как работает под капотом

Список сообщений LangChain сериализует в формат, который ждёт API провайдера (как правило, массив объектов вида {role, content}). Ответ приходит как AIMessage с полем content и метаданными (число токенов, причина остановки). System-сообщение провайдер учитывает с повышенным приоритетом — поэтому именно туда кладут инструкции о стиле и ограничениях. Если положить инструкцию в Human-сообщение, модель может воспринять её как часть пользовательского запроса, а не как правило поведения.

Частые ошибки

  • Передавать chat-модели голую строку и ждать строгого формата сообщений. Chat-модели принимают строку для удобства, но для контроля ролей передавайте список сообщений.
  • Класть системную инструкцию в Human-сообщение. Правила поведения — в System.
  • Читать ответ как строку. Результат — объект AIMessage; текст лежит в .content.

Итог

  • LangChain различает completion-LLM и chat-модели; в новых проектах берут chat-модели.
  • Сообщения имеют роли System / Human / AI.
  • Инструкции о поведении кладут в System-сообщение.
  • Ответ chat-модели — объект AIMessage, текст в .content.
Проверьте себя
1. Чем chat-модель отличается от completion-LLM в LangChain?
AChat-модель работает только локально
BChat-модель принимает список сообщений с ролями, а не одну строку
CМежду ними нет разницы
DCompletion-LLM умнее по определению
2. Куда лучше поместить инструкцию о стиле и поведении ассистента?
AВ Human-сообщение
BВ AI-сообщение
CВ System-сообщение
DВ имя переменной модели
3. Где лежит текст ответа chat-модели?
AЭто сразу строка
BВ поле .content объекта AIMessage
CВ переменной окружения
DВ System-сообщении