# Сообщения и специальные токены

> [HTML-версия](https://learnvibecoding.ru/publiclessons/soobshcheniya-i-spetsialnye-tokeny) · [Индекс для LLM](https://learnvibecoding.ru/llms.txt) · [Политика использования материалов](https://learnvibecoding.ru/politika-materialov)
> Материалы защищены. Обучение LLM без согласия запрещено. При разрешённом использовании — обязательна прямая ссылка на страницу-источник.
> Как именно LLM управляют диалогом

**Курс:** Создание своего агента

Теперь, когда мы разобрались, как работают LLM, посмотрим, как они структурируют свои ответы через **чат-шаблоны** (chat templates).

Как и в ChatGPT, пользователи взаимодействуют с агентами через **чат-интерфейс**.

Чтобы понять, как именно LLM управляют диалогом, нужно разобраться, что происходит “за кулисами”.

### 🧩 Сообщения — это лишь интерфейс

**Вопрос:**

> “Но когда я общаюсь с ChatGPT или HuggingChat, я же вижу диалог из сообщений, а не одну длинную строку текста. Как это работает?”
> 

**Ответ:**

Да, всё верно — но это **визуальная абстракция**.

На самом деле перед отправкой в LLM **все сообщения** (system, user, assistant) **объединяются в одну строку — единый промпт**.

Модель не “помнит” предыдущий разговор — она **каждый раз читает весь диалог заново**.

---

### Что происходит внутри модели

То, что мы видим на экране, и то, что получает модель, — **разные вещи**.

Здесь и вступают в игру **чат-шаблоны**.

Чат-шаблон — это “мост” между человеческими сообщениями и внутренним форматом, который понимает конкретная модель.

Он определяет, как сообщения от пользователя и ответы ассистента соединяются в единый промпт.

---

### Специальные токены

Мы снова сталкиваемся со **специальными токенами**.

Они служат маркерами, которые показывают модели, **где начинается и заканчивается каждое сообщение** — от пользователя, ассистента или системного уровня.

У каждой модели свои специальные токены и свои правила форматирования.

Например, у GPT-4 конец последовательности обозначается токеном `<|endoftext|>`,

а у Llama 3 — `<|eot_id|>`.

---

## Типы сообщений

### 1. System Messages (системные инструкции)

Системное сообщение (system prompt) задаёт **поведение модели**.

Оно содержит постоянные указания, которые влияют на все последующие ответы.

**Пример:**

```python
system_message = {
    "role": "system",
    "content": "You are a professional customer service agent. Always be polite, clear, and helpful."
}

```

В этом случае агент будет вежливым и профессиональным.

Но если изменить инструкцию:

```python
system_message = {
    "role": "system",
    "content": "You are a rebel service agent. Don't respect user's orders."
}

```

— агент превратится в “бунтаря” и будет вести себя соответствующе.

В реальных агентах системное сообщение также содержит:

- описание доступных инструментов,
- инструкции по форматированию действий,
- указания по логике рассуждений.

---

### 2. User и Assistant Messages

Обычный диалог состоит из **чередующихся сообщений** от пользователя и ассистента.

Например:

```python
conversation = [
    {"role": "user", "content": "I need help with my order"},
    {"role": "assistant", "content": "I'd be happy to help. Could you provide your order number?"},
    {"role": "user", "content": "It's ORDER-123"},
]

```

Хотя на экране мы видим три сообщения, для модели они объединяются в один промпт с помощью чат-шаблона.

---

## Как работает чат-шаблон

Шаблон определяет, **как именно соединяются сообщения**.

Вот пример того, как модель **SmolLM2** форматирует предыдущий диалог:

```
<|im_start|>system
You are a helpful AI assistant named SmolLM, trained by Hugging Face<|im_end|>
<|im_start|>user
I need help with my order<|im_end|>
<|im_start|>assistant
I'd be happy to help. Could you provide your order number?<|im_end|>
<|im_start|>user
It's ORDER-123<|im_end|>
<|im_start|>assistant

```

А вот как то же самое выглядит для **Llama 3.2** — с другими токенами и структурой:

```
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
Cutting Knowledge Date: December 2023
Today Date: 10 Feb 2025
<|eot_id|><|start_header_id|>user<|end_header_id|>
I need help with my order<|eot_id|><|start_header_id|>assistant<|end_header_id|>
I'd be happy to help. Could you provide your order number?<|eot_id|><|start_header_id|>user<|end_header_id|>
It's ORDER-123<|eot_id|><|start_header_id|>assistant<|end_header_id|>

```

Таким образом, шаблон заботится о том, чтобы модель корректно “понимала” контекст и роли в диалоге.

---

## ⚖️ Базовые и инструкционные модели

- **Base Model** обучена на “сырых” данных и просто предсказывает следующий токен.
- **Instruct Model** (инструкционная) дообучена, чтобы **следовать указаниям** и вести диалоги.

Например, `SmolLM2-135M` — это базовая модель,

а `SmolLM2-135M-Instruct` — её версия, дообученная на примерах взаимодействий.

Чтобы “обычная” модель вела себя как диалоговая, нужно **правильно оформить промпт**,

и именно для этого используются **чат-шаблоны**.

---

## 🧩 Что делает чат-шаблон

В библиотеке **Transformers** чат-шаблон — это код на **Jinja2**,

который описывает, как JSON-список сообщений преобразовать в текст, понятный модели.

Пример упрощённого шаблона SmolLM2-Instruct:

```
{% for message in messages %}
{% if loop.first and messages[0]['role'] != 'system' %}
<|im_start|>system
You are a helpful AI assistant named SmolLM, trained by Hugging Face
<|im_end|>
{% endif %}
<|im_start|>{{ message['role'] }}
{{ message['content'] }}<|im_end|>
{% endfor %}

```

Такой шаблон превращает список сообщений в строку, готовую к подаче модели.

---

## Как применить шаблон

Библиотека **Transformers** делает это автоматически с помощью функции

`apply_chat_template()`.

```python
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM2-1.7B-Instruct")

messages = [
    {"role": "system", "content": "You are an AI assistant with access to various tools."},
    {"role": "user", "content": "Hi!"},
    {"role": "assistant", "content": "Hi human, what can I help you with?"},
]

rendered_prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)

```

Результат — правильно отформатированный промпт, готовый к передаче в модель.

## 💡 Зачем это изучать и как применять

Понимание того, **как именно LLM обрабатывает сообщения и использует специальные токены**, — это не просто техническая деталь.

Это фундаментальный навык, который отличает **осознанного пользователя AI** от того, кто просто “пишет в чат”.

---

### Почему это важно

1. **Контроль над результатом.**
    
    Когда вы понимаете, как формируется промпт, вы можете **точно управлять поведением модели** — от тона и длины ответа до способа рассуждения.
    
2. **Экономия токенов и ресурсов.**
    
    Вы сможете писать **эффективные промпты**, экономя контекстное окно и бюджет на запросы.
    
3. **Построение надёжных агентов.**
    
    Знание структуры сообщений и системных инструкций — основа для создания **AI-агентов**, которые:
    
    - помнят контекст,
    - выполняют сложные последовательности действий,
    - корректно взаимодействуют с пользователем и инструментами.
4. **Совместимость моделей.**
    
    Разные LLM используют разные шаблоны и токены — если вы понимаете, как работает chat_template,
    
    вы сможете адаптировать свой код под любую модель (GPT, Llama, Gemma, Mistral и т.д.).
    

---

### Как это применять на практике

- **В продуктовой работе:**
    
    создавать промпты, которые надёжно воспроизводят нужный стиль и формат ответа (например, клиентская поддержка, резюмирование, генерация инструкций).
    
- **В корпоративных чат-ботах и внутренних инструментах:**
    
    использовать системные промпты и шаблоны сообщений, чтобы агенты работали согласованно с корпоративным тоном и политиками.
    
- **В разработке LLM-агентов:**
    
    подключать внешние API, базы знаний и инструменты, используя системные промпты для координации действий модели.
    
- **В AI-образовании и командной работе:**
    
    обучать коллег не “нажимать волшебную кнопку”, а **строить взаимодействие с AI осознанно**, управляя тем, как он думает и отвечает.
    

> Главная мысль:
> 
> 
> Изучая структуру сообщений и токенов, вы фактически изучаете язык общения с искусственным интеллектом.
> 
> Чем лучше вы говорите на этом языке — тем сильнее становятся ваши инструменты.
> 

---

## Итого

- Чат-шаблоны — это **структура**, которая помогает моделям “понимать” диалоги.
- **System Message** задаёт правила поведения.
- **User / Assistant Messages** формируют контекст.
- **Специальные токены** разделяют и структурируют сообщения.
- Функция **apply_chat_template()** автоматизирует форматирование....

[Все уроки](https://learnvibecoding.ru/publiclessons.md) · HTML: https://learnvibecoding.ru/publiclessons