← НАЗАД К КУРСУ Этап 3 · Урок 1 из 5

Урок 3.1 — Чат-бот vs Агент

Чат-бот отвечает на вопросы. Агент выполняет задачи. Это главное отличие. Чат-бот — как справочная по телефону. Агент — как личный ассистент, который сам звонит, ищет, бронирует и возвращается с результатом.


Чат-бот = только текст

Вот простой пример. Допустим, в терминале работает чат с 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.

Агент сам выполнил задачу: нашёл ресторан, забронировал, вернул результат.


Что такое инструменты (Tools)

Инструменты — это функции, которые ты даёшь 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. Потом дать финальный ответ

Ты не говорила ему "сначала проверь погоду, потом отправь уведомление". Он сам спланировал шаги.


Сравнение: Чат-бот vs Агент

Критерий Чат-бот Агент
Что делает Отвечает текстом Выполняет задачи
Инструменты Нет Да (tools)
Шаги Один (вопрос → ответ) Много (цикл думай-действуй)
Автономность Нет — ты управляешь Да — сам планирует шаги
Взаимодействие с миром Не может Может (API, базы, файлы, сообщения)
Пример Чат Claude на сайте OpenClaw — AI-агент, который мониторит чат и пишет в таблицу

Реальный пример: OpenClaw

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 решает когда их вызвать, ты выполняешь — и так по кругу.


Практика

Задание 1: Определи — чат-бот или агент?

Для каждого примера скажи, нужен чат-бот или агент:

  1. Бот, который переводит текст с русского на английский
  2. Бот, который проверяет статус заказа в базе данных
  3. Бот, который генерирует Instagram-посты
  4. Бот, который каждое утро собирает новости и отправляет дайджест в Telegram
Ответ 1. **Чат-бот** — перевод = текстовая задача, инструменты не нужны 2. **Агент** — нужен инструмент для доступа к базе данных 3. **Чат-бот** — генерация текста, инструменты не нужны (если не сохранять в файл) 4. **Агент** — нужны инструменты: поиск новостей, суммирование, отправка в Telegram

Задание 2: Придумай инструменты

Допустим, нужен бот-монитор для Telegram-чата, который ищет потенциальных клиентов и записывает их в таблицу. Какие инструменты (tools) ему нужны? Напиши список с описанием.

Пример ответа
tools = [
    {"name": "read_chat_messages", "description": "Читать новые сообщения из Telegram-чата"},
    {"name": "classify_message", "description": "Определить, является ли сообщение лидом"},
    {"name": "add_to_sheets", "description": "Добавить строку в Google Таблицу"},
    {"name": "send_notification", "description": "Отправить уведомление владельцу"},
]

Задачки на закрепление

Задача 1: Чем агент отличается от чат-бота в одном предложении?

Ответ Агент имеет инструменты и может выполнять действия во внешнем мире (API, базы данных, файлы), а чат-бот только генерирует текст.

Задача 2: Что такое agentic loop?

Ответ Цикл, в котором агент работает: получает задачу → думает → вызывает инструмент → получает результат → думает снова → вызывает следующий инструмент → и так пока задача не выполнена.

Задача 3: Claude сам вызывает функции на твоём компьютере?

Ответ Нет. Claude говорит: "Я хочу вызвать функцию X с параметрами Y". Твой код выполняет функцию и отправляет результат обратно Claude. Claude не имеет прямого доступа к твоей системе.

Задача 4: Что означает stop_reason == "tool_use" в ответе Claude?

Ответ Claude остановился не потому что закончил, а потому что хочет вызвать инструмент. Нужно выполнить запрошенную функцию, отправить результат обратно, и Claude продолжит работу.

Главное


Глоссарий

Термин Что значит
Чат-бот Программа, которая принимает текст и возвращает текст, без выполнения действий во внешнем мире.
AI-агент Программа на основе LLM, которая умеет планировать и выполнять действия с помощью инструментов для достижения цели.
Agentic loop (агентный цикл) Цикл, в котором агент повторяет шаги «думает → действует → наблюдает» до тех пор, пока задача не будет выполнена.
Инструмент (tool) Функция, которую ты описываешь для Claude, и он сам решает, когда её вызвать.
stop_reason Поле в ответе API, которое показывает, почему Claude остановил генерацию — закончил ответ или хочет вызвать инструмент.
end_turn Значение stop_reason, означающее, что Claude закончил свой ответ и больше ничего не хочет делать.
tool_use Значение stop_reason, означающее, что Claude хочет вызвать инструмент и ждёт от тебя результат его выполнения.
Цикл «думает → действует → наблюдает» Основной паттерн работы агента: сначала анализирует задачу, потом вызывает инструмент, потом смотрит на результат и решает, что делать дальше.
Оркестрация Управление процессом работы агента: какие инструменты доступны, в каком порядке вызываются и когда остановиться.

Что дальше?

В следующем уроке — Tools: руки агента. Ты напишешь свои инструменты и создашь агента, который умеет выполнять реальные действия — работать с файлами, искать информацию, отправлять данные.

← ПРЕДЫДУЩИЙ СЛЕДУЮЩИЙ →