# Действия: как агент взаимодействует с окружающей средой

> [HTML-версия](https://learnvibecoding.ru/publiclessons/deystviya-kak-agent-vzaimodeystvuet-s-okruzhayushchey-sredoy) · [Индекс для LLM](https://learnvibecoding.ru/llms.txt) · [Политика использования материалов](https://learnvibecoding.ru/politika-materialov)
> Материалы защищены. Обучение LLM без согласия запрещено. При разрешённом использовании — обязательна прямая ссылка на страницу-источник.
> В этом разделе мы рассмотрим конкретные шаги, которые выполняет AI-агент

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

В этом разделе мы рассмотрим **конкретные шаги**, которые выполняет AI-агент, чтобы взаимодействовать с миром.

Мы разберём:

- как агент представляет свои действия (в формате JSON или кода),
- почему важен подход **“Stop and Parse” (Останови и Разбери)**,
- и какие бывают типы агентов по способу выполнения действий.

---

## Что такое Action (Действие)

**Действие** — это конкретный шаг, который выполняет агент, чтобы достичь своей цели.

Это может быть что угодно:

- поиск информации в интернете,
- выполнение вычислений,
- управление устройством,
- или взаимодействие с пользователем.

Например, агент службы поддержки может:

- получить данные клиента,
- предложить подходящую статью,
- или передать обращение человеку.

---

## Типы агентов по способу выполнения действий

| Тип агента | Описание |
| --- | --- |
| **JSON Agent** | Определяет действие в формате JSON. |
| **Code Agent** | Генерирует исполняемый код (например, на Python). |
| **Function-calling Agent** | Подвид JSON-агента, обученный вызывать функции через отдельные сообщения. |

---

## Типы действий

| Тип действия | Пример |
| --- | --- |
| **Сбор информации** | Поиск в интернете, запрос к базе данных, получение документов. |
| **Использование инструментов** | API-вызовы, вычисления, выполнение скриптов. |
| **Взаимодействие со средой** | Управление интерфейсами, устройствами, программами. |
| **Коммуникация** | Диалог с пользователем или другими агентами. |

---

## Как агент «передаёт» действие

LLM сама **не выполняет** действия — она **описывает** их текстом.

Она генерирует инструкцию в виде, который потом обрабатывается внешним кодом.

Чтобы агент работал корректно, важно, чтобы модель **остановила генерацию**

после завершения описания действия.

Это ключевой момент — иначе LLM может продолжить писать текст,

и результат станет непригоден для обработки.

---

## Подход Stop and Parse (Останови и Разбери)

Это базовый механизм, который обеспечивает точное выполнение действий.

### 🔹 Шаг 1. Генерация структурированного вывода

Модель выдаёт действие в заранее заданном формате — например, JSON или код.

### 🔹 Шаг 2. Остановка генерации

После того как действие полностью описано, модель **останавливается**.

Это предотвращает ошибки и “лишний текст”.

### 🔹 Шаг 3. Парсинг вывода

Внешняя программа читает форматированный ответ,

определяет, **какой инструмент вызвать**, и **с какими параметрами**.

---

### Пример: агент проверяет погоду

```
Thought: Нужно узнать текущую погоду в Нью-Йорке.
Action:
{
  "action": "get_weather",
  "action_input": {"location": "New York"}
}

```

После этого фреймворк просто **распознаёт имя функции** (`get_weather`)

и **аргументы** (`location = "New York"`),

а затем вызывает соответствующий инструмент.

Такой формат делает работу агента **надёжной, читаемой и автоматизируемой**.

> Примечание: Function-calling агенты работают схожим образом —
> 
> 
> каждый вызов оформляется как отдельное сообщение, содержащее имя функции и аргументы.
> 

---

## Code Agents (Агенты, генерирующие код)

Альтернативный подход — **Code Agents**.

Вместо JSON они генерируют **исполняемый код**, чаще всего на Python.

### Преимущества Code Agents:

- **Выразительность:**
    
    Код может содержать сложную логику — циклы, условия, функции.
    
- **Модульность:**
    
    Генерируемые блоки можно переиспользовать в других задачах.
    
- **Отладка:**
    
    Ошибки в коде проще находить и исправлять.
    
- **Интеграция:**
    
    Код напрямую взаимодействует с библиотеками, API и данными.
    

> ⚠️ Важно: выполнение сгенерированного LLM кода может быть небезопасным
> 
> 
> (риск prompt injection, вредоносных команд и т. п.).
> 
> Поэтому такие агенты рекомендуется запускать **в песочнице или фреймворке**
> 
> (например, smolagents), где встроены механизмы защиты.
> 

---

### Пример кода от Code Agent

```python
# Пример: агент получает данные о погоде
def get_weather(city):
    import requests
    api_url = f"https://api.weather.com/v1/location/{city}?apiKey=YOUR_API_KEY"
    response = requests.get(api_url)
    if response.status_code == 200:
        data = response.json()
        return data.get("weather", "No weather information available")
    else:
        return "Error: Unable to fetch weather data."

# Выполняем функцию и формируем итоговый ответ
result = get_weather("New York")
final_answer = f"The current weather in New York is: {result}"
print(final_answer)

```

В этом примере агент:

1. Получает данные о погоде через API,
2. Обрабатывает ответ,
3. Выводит готовый результат.

Код также следует принципу **Stop and Parse**:

он чётко ограничен, завершает выполнение и выдаёт финальный результат через `print()`.

**У большинства современных LLM (OpenAI, Anthropic, Mistral, DeepSeek, Gemini и т.д.) уже встроен механизм “function calling” или “tool use”**.

Тогда действительно может казаться:

> “Зачем вообще всё это — JSON-агенты, Stop & Parse, код-агенты — если LLM уже умеет вызывать функции?”
> 

Разберёмся спокойно 👇

---

## 1. Почему “function calling” ≠ полноценный агент

Функционал **function calling** — это только **низкоуровневый интерфейс**.

Он говорит модели:

> «Если ты хочешь что-то сделать, напиши вот такой JSON с именем функции и аргументами».
> 

Но!

Модель **сама не выполняет функцию**, **не проверяет результат** и **не принимает новых решений** после вызова.

Этим занимается **внешний агент** — кусок кода, который:

1. **читает JSON,**
2. **выполняет действие,**
3. **передаёт результат обратно модели,**
4. и запускает новый цикл reasoning.

👉 То есть “function calling” — это кирпичик.

А “Actions” (в смысле, как в уроке) — это **архитектура**, которая оборачивает этот кирпичик в **полноценный цикл мышления и действия**.

---

## 2. В чём разница на практике

| Что делает LLM | Что делает агент |
| --- | --- |
| Формирует JSON с вызовом функции (function calling) | Получает JSON, вызывает реальную функцию |
| Может описать действие, но не выполнит его | Выполняет действие в реальном мире (API, база, код) |
| Не знает результат вызова | Получает результат (Observation) и думает, что делать дальше |
| Работает один цикл “запрос → ответ” | Работает в цикле “Думай → Действуй → Наблюдай” |

---

## 3. Когда встроенного function calling **достаточно**

- Когда ты делаешь **простого ассистента**: “Скажи курс валюты”, “Сделай SQL-запрос”, “Проверь погоду”.
- Когда ты **сам вручную** решаешь, как обрабатывать вызовы модели.
- Когда агент не должен “думать”, а просто “реагировать” на один запрос.

➡️ В таких случаях function calling — действительно достаточно.

---

## 4. Когда нужны **Actions и Stop & Parse**

Когда ты строишь **автономного агента**, который:

- выполняет **несколько шагов** подряд,
- **планирует** (например, сначала ищет данные, потом анализирует),
- **взаимодействует** с несколькими источниками,
- **обновляет контекст** и **сам решает, когда закончить**.

Например:

> “Подготовь мне дайджест новостей по AI за неделю, вытащи источники, посчитай частоту тем и оформи отчёт.”
> 

Такой агент:

1. сам решит, какие инструменты использовать,
2. вызовет их один за другим,
3. соберёт результат,
4. сформирует итоговый ответ.

⚙️ Здесь уже важны:

- **структурированные Actions** (чтобы система знала, что выполнять),
- **Stop & Parse** (чтобы отделить “команду” от “болтовни”),
- и **цикличный контроль** (чтобы агент не завис или не ушёл в галлюцинации).

---

## 5. Проще говоря

- `function calling` — это **API-протокол общения** между моделью и инструментами.
- `Actions` — это **логика поведения агента**, которая говорит, **когда**, **какое действие**, **зачем**, **в каком порядке**, **с какими аргументами**.

> Function calling = руки.
> 
> 
> **Actions = мозг, который решает, что этими руками делать.**
> 

---

## 6. Для чего тебе это нужно, если ты создаёшь продукты

Если ты делаешь:

- **AI-бота для бизнеса** (который анализирует отчёты, CRM, базы)
- **внутреннего помощника в компании**,
- **RAG или аналитического агента**,
- **обучающий симулятор** (например, ментор, ассистент для сотрудников),

тебе нужен **агентный слой**, который управляет тем, **как и когда** LLM вызывает инструменты,

а не просто “реактивный” LLM с одной функцией.

---

## Итог

- **Actions (Действия)** — это мост между рассуждениями агента и реальным миром.
- Они описывают, **что нужно сделать** и **какие параметры** использовать.
- Формат действий (JSON, код, вызов функции) делает возможной автоматическую обработку.
- Подход **Stop and Parse** обеспечивает стабильность и безопасность работы агента.

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