Агенты vs Чат-боты
Технологии вокруг LLM развиваются быстро и некоторые термины могут вызывать путаницу, как, например, «агенты» и «чат-боты». Сегодня обсудим их различия, а также устройство и работу агента.
Для начала определимся с терминами:
- Чат-бот ожидает ввод пользователя и выдаёт реакцию на него, генерируя текст ответа.
- Агент — автономная система. Ввод пользователя здесь — триггер, который даёт начало его действиям / рассуждениям. Получив ввод (задачу), он выстраивает последовательность шагов для решения, самостоятельно выполняет их и генерирует текст по результатам выполнения задачи пользователя.
Если попросить чат-бота «организовать встречу», он выдаст чек-лист для реализации, но не сможет выполнить действия — ограничится только текстовыми советами. Агент на тот же запрос самостоятельно полезет в Google Calendar, найдёт свободный слот, отправит письма участникам и забронирует переговорку.
Архитектура агента
В классическом определении агента к LLM добавляют три модуля:
- Память — хранилище, например, база данных, где собирается опыт успешного выполнения предыдущих задач.
- Планировщик — разбитие исходной задачи на последовательность действий с использованием доступных инструментов, которые нужно выполнить для достижения цели пользователя.
- Инструменты (function calling) — интерфейс для выполнения действий.
С помощью памяти и планировщика агент успешно выполняет более сложные задачи. А инструменты дают возможность агенту выполнять действия.
Инструменты
Самостоятельно LLM не умеет выполнять действия — она генерирует с помощью инструментов вызов функции, результат которой возвращается к ней.
Это работает следующим образом:
- Описание доступных функций. В системном промпте модели задаётся описание доступных функций в формате JSON. Модель не видит реализацию функции, ей доступно только её описание (входные параметры, результат выполнения и действия), по которому она понимает семантику функции. Пример описания функции get_weather, которая вызывается при вопросе пользователя о температуре или дожде:
{
"type": "function",
"name": "get_weather",
"description": "Retrieves current weather for the given location.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City and country e.g. Bogotá, Colombia"
},
"units": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Units the temperature will be returned in."
}
},надо
"required": ["location", "units"],
"additionalProperties": false,
"strict": true
}
}
- Генерация вызова. Когда модели приходит запрос пользователя, она анализирует, содержится ли в системном промпте инструмент для решения задачи. Если да — возвращает специальную структуру. Ниже пример для запроса с погодой:
Q: Какая погода в Париже?
Response:
{
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Paris\"}"
}
}
Обратите внимание — модель, опираясь на контекст, сама извлекает необходимые сущности для вызова функции из запроса.
- Выполнение вызова. После генерации описания вызова инструмента LLM прекращает генерацию токенов, и управление передаётся модулю исполнения. По сгенерированному имени инструмента скрипт соотносит, что именно нужно исполнить и с какими аргументами. Результаты выполнения инструмента не показываются пользователю. Они возвращаются модели. А в историю переписки добавляется новое сообщение с ролью tool о результате выполнения функции:
{
"role": "tool",
"tool_call_id": "call_abc123",
"name": "get_weather",
"content": "{\\"temperature\\": \\"25\\", \\"unit\\": \\"C\\", \\"description\\": \\"Sunny\\"}"
}
- Генерация ответа. Перед финальным ответом LLM видит что-то подобное (пример с запросом погоды в Париже):
System: Ты полезный помощник... (описание инструментов)
User: Какая погода в Париже?
Assistant: (call tool: `get_weather(city="Paris")`)
Tool: `{"temperature": 22, "condition": "sunny"}`
Модель читает историю, переключается в режим генерации текста и выдаёт ответ. Пользователь видит только вопрос и ответ, не подозревая, что «под капотом» произошёл обмен техническими данными.
Агент может совершать множество таких итераций, например:
Попробовал найти информацию -> Не нашёл -> Поменял запрос -> Нашёл ссылку -> Прочитал содержимое -> Сформировал ответ

