Чат-бот отвечает на вопросы. Агент выполняет задачи. Это главное отличие. Чат-бот — как справочная по телефону. Агент — как личный ассистент, который сам звонит, ищет, бронирует и возвращается с результатом.
Вот простой пример. Допустим, в терминале работает чат с Claude (такой, как из урока 2.3):
Пользователь: Какая погода в Москве?
Claude: Я не могу проверить погоду, так как у меня нет доступа к интернету.
Но обычно в марте в Москве около 0-5°C...
Claude не знает реальную погоду. Он может только предположить. Потому что у него нет рук — он не может выйти в интернет, открыть сайт, позвонить API.
Агент — это тот же Claude, но с руками. Ему можно дать инструменты (tools) — и он сам решит, какие использовать.
Ты → Вопрос → Claude → Текстовый ответ → Ты
Один шаг. Вопрос-ответ. Всё.
Ты → Задача → Claude → [Думает: что мне нужно сделать?]
→ Вызывает инструмент (например: проверь погоду)
→ Получает результат (15°C, облачно)
→ [Думает: нужно ещё что-то?]
→ Вызывает другой инструмент (отправь сообщение в Telegram)
→ Получает результат (отправлено)
→ [Думает: задача выполнена]
→ Финальный ответ → Ты
Агент работает в цикле: думает → действует → наблюдает → думает снова. Это называется agentic loop (агентный цикл).
Ты: Забронируй мне столик в ресторане на вечер
Чат-бот: Вот несколько ресторанов, которые я рекомендую:
1. Ресторан А — итальянская кухня
2. Ресторан Б — японская кухня
Вы можете забронировать столик по телефону...
Чат-бот дал совет, но ничего не сделал.
Ты: Забронируй мне столик в ресторане на вечер
Агент: [Думает] Мне нужно:
1. Найти ресторан поблизости
2. Проверить свободные столики
3. Забронировать
[Вызывает инструмент: search_restaurants(location="рядом", cuisine="любая")]
→ Результат: Ресторан "Оливия", ул. Пушкина 5, есть столики на 19:00 и 20:00
[Вызывает инструмент: book_table(restaurant="Оливия", time="19:00", guests=2)]
→ Результат: Бронь подтверждена, номер 4521
Готово! Забронировала столик в "Оливия" на 19:00 на 2 персоны.
Адрес: ул. Пушкина 5. Номер брони: 4521.
Агент сам выполнил задачу: нашёл ресторан, забронировал, вернул результат.
Инструменты — это функции, которые ты даёшь Claude, и он сам решает, когда их вызвать.
# Ты описываешь инструмент:
"get_weather" — получить погоду в городе
"send_message" — отправить сообщение
"search_database" — найти информацию в базе
"add_to_spreadsheet" — добавить строку в Google Таблицу
# Claude решает:
# "Пользователь спросил про погоду → вызову get_weather"
# "Пользователь попросил отправить сообщение → вызову send_message"
Аналогия: Ты нанимаешь ассистента и говоришь: "Вот телефон для звонков, вот доступ к почте, вот ключ от базы данных". Ассистент сам решает, когда что использовать — в зависимости от задачи.
# 1. Ты описываешь инструмент для Claude (что он может делать)
tools = [
{
"name": "get_weather",
"description": "Получить текущую погоду в указанном городе",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Название города"
}
},
"required": ["city"]
}
}
]
# "name" — имя инструмента
# "description" — что он делает (Claude читает это чтобы решить, использовать ли)
# "input_schema" — какие параметры нужны (город, в данном случае)
# 2. Ты пишешь реальную функцию (что ДЕЙСТВИТЕЛЬНО происходит)
def get_weather(city):
# Здесь будет запрос к настоящему API погоды
return f"В {city} сейчас +15°C, облачно"
# 3. Claude САМА решает, вызвать ли инструмент
# Если ты спросишь "Какая погода в Москве?" — Claude вызовет get_weather
# Если ты спросишь "Что такое Python?" — Claude ответит текстом, без инструмента
Claude не вызывает функцию сам. Он говорит тебе: "Я хочу вызвать get_weather с параметром city=Москва". Ты выполняешь функцию в своём коде и отправляешь результат обратно.
Вот как выглядит полный агент на Python:
from anthropic import Anthropic
client = Anthropic()
# --- Инструменты ---
# Описание для Claude (что доступно)
tools = [
{
"name": "get_weather",
"description": "Получить погоду в городе",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Город"}
},
"required": ["city"]
}
},
{
"name": "send_notification",
"description": "Отправить уведомление пользователю",
"input_schema": {
"type": "object",
"properties": {
"text": {"type": "string", "description": "Текст уведомления"}
},
"required": ["text"]
}
}
]
# Реальные функции (что происходит на самом деле)
def get_weather(city):
# В реальности — запрос к API погоды
return f"В {city}: +15°C, облачно, ветер 3 м/с"
def send_notification(text):
# В реальности — отправка в Telegram, email и т.д.
print(f"[Уведомление отправлено]: {text}")
return "Уведомление отправлено успешно"
# Маппинг имени → функции
tool_functions = {
"get_weather": lambda args: get_weather(args["city"]),
"send_notification": lambda args: send_notification(args["text"]),
}
# --- Агентный цикл ---
messages = [
{"role": "user", "content": "Проверь погоду в Москве и отправь мне уведомление"}
]
while True:
# Отправляем запрос Claude с инструментами
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=messages
)
# Если Claude закончил — выводим ответ и выходим
if response.stop_reason == "end_turn":
for block in response.content:
if hasattr(block, "text"):
print(f"\nClaude: {block.text}")
break
# stop_reason == "end_turn" — Claude решил, что задача выполнена
# Если Claude хочет вызвать инструмент
if response.stop_reason == "tool_use":
# Добавляем ответ Claude в историю
messages.append({"role": "assistant", "content": response.content})
# Выполняем каждый вызов инструмента
tool_results = []
for block in response.content:
if block.type == "tool_use":
print(f"[Агент вызывает: {block.name}({block.input})]")
# Вызываем реальную функцию
result = tool_functions[block.name](block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result
})
# Отправляем результаты обратно Claude
messages.append({"role": "user", "content": tool_results})
# И цикл повторяется — Claude получит результаты и решит, что делать дальше
[Агент вызывает: get_weather({"city": "Москва"})]
[Агент вызывает: send_notification({"text": "В Москве сейчас +15°C, облачно, ветер 3 м/с"})]
[Уведомление отправлено]: В Москве сейчас +15°C, облачно, ветер 3 м/с
Claude: Готово! Я проверил погоду в Москве (+15°C, облачно, ветер 3 м/с)
и отправил тебе уведомление.
Claude сам решил:
1. Сначала вызвать get_weather чтобы узнать погоду
2. Потом send_notification чтобы отправить результат
3. Потом дать финальный ответ
Ты не говорила ему "сначала проверь погоду, потом отправь уведомление". Он сам спланировал шаги.
| Критерий | Чат-бот | Агент |
|---|---|---|
| Что делает | Отвечает текстом | Выполняет задачи |
| Инструменты | Нет | Да (tools) |
| Шаги | Один (вопрос → ответ) | Много (цикл думай-действуй) |
| Автономность | Нет — ты управляешь | Да — сам планирует шаги |
| Взаимодействие с миром | Не может | Может (API, базы, файлы, сообщения) |
| Пример | Чат Claude на сайте | OpenClaw — AI-агент, который мониторит чат и пишет в таблицу |
OpenClaw — это open-source AI-агент, который работает локально на компьютере и может подключаться к 40+ мессенджерам (Telegram, WhatsApp, Discord, Slack и др.). Внутри него — тот самый агентный цикл:
Это не вопрос-ответ. Это цикл: получил → проанализировал → действовал → ждёт следующее. Классический агент.
| Задача | Что использовать | Почему |
|---|---|---|
| Ответы на вопросы | Чат-бот | Не нужны действия, только текст |
| FAQ поддержка | Чат-бот | Ответы по шаблону |
| Мониторинг чата и запись в таблицу | Агент | Нужно читать, анализировать, записывать |
| Бронирование / заказ | Агент | Нужно взаимодействие с внешними системами |
| Генерация отчётов из данных | Агент | Нужно достать данные, обработать, оформить |
| Автоматизация рабочих процессов | Агент | Много шагов, много инструментов |
┌─────────────────────────────────────────┐
│ ТВОЙ КОД (Python) │
│ │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ Описания │ │ Реальные │ │
│ │ tools │ │ функции │ │
│ │ (JSON) │ │ (Python) │ │
│ └──────┬──────┘ └───────┬───────┘ │
│ │ │ │
│ ┌──────▼───────────────────▼───────┐ │
│ │ Агентный цикл (loop) │ │
│ │ │ │
│ │ 1. Отправь сообщение + tools │ │
│ │ 2. Получи ответ от Claude │ │
│ │ 3. Если tool_use → выполни │ │
│ │ 4. Отправь результат обратно │ │
│ │ 5. Повтори пока stop ≠ end │ │
│ └──────────────┬───────────────────┘ │
│ │ │
└─────────────────┼────────────────────────┘
│ API вызовы
┌───────▼───────┐
│ Claude API │
│ (Anthropic) │
└───────────────┘
Весь агент — это твой Python-код + Claude API. Ты описываешь инструменты, Claude решает когда их вызвать, ты выполняешь — и так по кругу.
Для каждого примера скажи, нужен чат-бот или агент:
Допустим, нужен бот-монитор для Telegram-чата, который ищет потенциальных клиентов и записывает их в таблицу. Какие инструменты (tools) ему нужны? Напиши список с описанием.
tools = [
{"name": "read_chat_messages", "description": "Читать новые сообщения из Telegram-чата"},
{"name": "classify_message", "description": "Определить, является ли сообщение лидом"},
{"name": "add_to_sheets", "description": "Добавить строку в Google Таблицу"},
{"name": "send_notification", "description": "Отправить уведомление владельцу"},
]
Задача 1: Чем агент отличается от чат-бота в одном предложении?
Задача 2: Что такое agentic loop?
Задача 3: Claude сам вызывает функции на твоём компьютере?
Задача 4: Что означает stop_reason == "tool_use" в ответе Claude?
| Термин | Что значит |
|---|---|
| Чат-бот | Программа, которая принимает текст и возвращает текст, без выполнения действий во внешнем мире. |
| AI-агент | Программа на основе LLM, которая умеет планировать и выполнять действия с помощью инструментов для достижения цели. |
| Agentic loop (агентный цикл) | Цикл, в котором агент повторяет шаги «думает → действует → наблюдает» до тех пор, пока задача не будет выполнена. |
| Инструмент (tool) | Функция, которую ты описываешь для Claude, и он сам решает, когда её вызвать. |
| stop_reason | Поле в ответе API, которое показывает, почему Claude остановил генерацию — закончил ответ или хочет вызвать инструмент. |
| end_turn | Значение stop_reason, означающее, что Claude закончил свой ответ и больше ничего не хочет делать. |
| tool_use | Значение stop_reason, означающее, что Claude хочет вызвать инструмент и ждёт от тебя результат его выполнения. |
| Цикл «думает → действует → наблюдает» | Основной паттерн работы агента: сначала анализирует задачу, потом вызывает инструмент, потом смотрит на результат и решает, что делать дальше. |
| Оркестрация | Управление процессом работы агента: какие инструменты доступны, в каком порядке вызываются и когда остановиться. |
В следующем уроке — Tools: руки агента. Ты напишешь свои инструменты и создашь агента, который умеет выполнять реальные действия — работать с файлами, искать информацию, отправлять данные.