# Agentic RAG (агентный RAG): что это и как работает

> **Agentic RAG** (агентный RAG) — это подход, в котором поиск информации для языковой модели не идёт по жёсткому конвейеру, а управляется агентом: модель сама решает, нужен ли ей поиск, что именно искать, какие фрагменты отбросить и когда найденного хватает для ответа.

Классический [RAG](/pages/rasshirennaya-generaciya-s-poiskom-rag) устроен линейно: вопрос превращается в вектор, из базы достаётся фиксированное число фрагментов (top-k), они подставляются в промпт. Агентный вариант добавляет между этими шагами решения: поиск можно повторить с другим запросом, результаты — оценить и выбросить, а ответ — отложить до тех пор, пока контекст не станет достаточным.

## Что это {#chto-eto}

Разница не в том, что появился новый вид поиска, а в том, кто им управляет. В обычном RAG маршрут задан разработчиком и одинаков для всех вопросов. В агентном RAG маршрут выбирает модель через [вызов инструментов](/pages/tool-calling-api): она видит, что вернул поиск, и решает следующий шаг.

| | Классический RAG | Agentic RAG |
|---|---|---|
| Маршрут | запрос → top-k → ответ | цикл «план → поиск → оценка → уточнение» |
| Число поисковых запросов | один, задан заранее | столько, сколько нужно, в пределах лимита |
| Решение «данных хватает» | не принимается | принимается моделью на каждом шаге |
| Инструменты | векторная база | несколько: векторная база, веб-поиск, SQL, API |

## Как работает {#kak-rabotaet}

Цикл состоит из повторяющихся шагов:

1. **План.** Модель-контроллер разбирает вопрос и решает, нужен ли внешний поиск, а если нужен — формулирует первый запрос.
2. **Поиск.** Вызывается инструмент: поиск по векторной базе, [веб-поиск](/pages/zahvat-konteksta-context-retrieval), запрос к базе данных.
3. **Оценка.** Модель смотрит на выдачу и отвечает на вопрос: фрагменты релевантны, их достаточно, есть ли противоречия.
4. **Уточнение.** Если данных мало — переформулируется запрос, ищется другой источник или вопрос разбивается на части.
5. **Ответ.** Когда контекст признан достаточным, сильная модель формулирует ответ со ссылками на найденное.

Из чего это собрано: LLM как контроллер, набор инструментов поиска и механизм проверки достаточности контекста. Последний чаще всего реализуют отдельным дешёвым вызовом со [структурированным выводом](/pages/structured-output) — модель возвращает `{"sufficient": false, "next_query": "..."}`, и цикл продолжается. Общая логика «рассуждение и действие вперемешку» описана в работе [ReAct](https://arxiv.org/abs/2210.03629): модель чередует рассуждение и обращение к внешнему источнику, а результат предыдущего действия влияет на следующий шаг.

### Self-RAG

В работе [Self-RAG](https://arxiv.org/abs/2310.11511) модель обучают адаптивно доставать фрагменты по необходимости и критиковать и найденное, и собственный ответ с помощью специальных reflection-токенов. Так модель сама решает, нужен ли поиск, и оценивает, насколько найденное подходит и насколько хорош её собственный ответ. Идея полезна для практики даже без дообучения: похожие проверки можно задать промптом или отдельным классификатором.

### Corrective RAG (CRAG)

В [Corrective RAG](https://arxiv.org/abs/2401.15884) добавляется лёгкий оценщик качества выдачи: он возвращает степень уверенности, и от неё зависит, какое действие по поиску запустится, например дополнение результатов веб-поиском. Дополнительно документы разбираются на части и пересобираются, чтобы отбросить нерелевантное. Механизм заявлен как подключаемый к любому RAG-пайплайну.

### Итеративный поиск и multi-hop

Вопросы вида «сравните условия возврата в договорах 2024 и 2026 года» требуют нескольких поисков: сначала найти один договор, затем второй, затем сопоставить. Это называется многошаговым (multi-hop) поиском. Здесь важно ограничение: без лимита итераций цикл может ходить по кругу, переформулируя один и тот же запрос.

## Примеры {#primery}

- **Сравнение документов.** Клиент спрашивает, чем отличаются два тарифа. Агент ищет каждый тариф отдельно и сводит результат, а не надеется, что оба фрагмента попадут в один top-k.
- **Вопросы про свежие данные.** Поиск по внутренней базе устарел — агент замечает, что фрагменты относятся к прошлому году, и доходит до веб-поиска или до API.
- **Аналитика по базе данных.** Сначала SQL-запрос за цифрами, затем поиск по документации, объясняющей методику расчёта, и только потом ответ.

## Agentic RAG на RouterAI {#routerai}

RouterAI даёт OpenAI-совместимый API `https://routerai.ru/api/v1` и Anthropic Messages API `https://routerai.ru/api`: инструменты и структурированный вывод работают через стандартные поля `tools` и `response_format`, отдельный шлюз под цикл поиска не нужен. Ключ один, оплата в рублях, работа из России без VPN, модели — из [общего каталога](/models).

```python
import json
from openai import OpenAI

client = OpenAI(
    base_url="https://routerai.ru/api/v1",
    api_key="sk-xxxxxxxxxxxxxxxx",
)

TOOLS = [{
    "type": "function",
    "function": {
        "name": "search_docs",
        "description": "Поиск по базе знаний, возвращает до 5 фрагментов",
        "parameters": {
            "type": "object",
            "properties": {"query": {"type": "string"}},
            "required": ["query"],
        },
    },
}]

messages = [{"role": "user", "content": "Чем отличаются условия возврата в тарифах Basic и Pro?"}]

for step in range(4):  # лимит итераций
    resp = client.chat.completions.create(
        model="anthropic/claude-sonnet-5.5",
        messages=messages,
        tools=TOOLS,
    )
    msg = resp.choices[0].message
    messages.append(msg.model_dump())
    if not msg.tool_calls:
        print(msg.content)
        break
    for call in msg.tool_calls:
        result = search_docs(**json.loads(call.function.arguments))  # ваш поиск
        messages.append({
            "role": "tool",
            "tool_call_id": call.id,
            "content": result,
        })
```

Роли моделей в цикле удобно разделить: дорогая модель отвечает, дешёвая — оценивает выдачу и переформулирует запрос.

| Шаг цикла | Модель из каталога |
|---|---|
| Контроллер и финальный ответ | `anthropic/claude-sonnet-5.5` |
| Оценка релевантности, переформулировка | `z-ai/glm-5.3-flash` |
| Массовые дешёвые проверки | `deepseek/deepseek-v4.1-flash-1017` |
| Эмбеддинги для поиска | `qwen/qwen3-embedding-8b` |

Стоимость одного вопроса зависит от модели и объёма контекста: в агентном цикле к цене ответа добавляются все промежуточные вызовы. Актуальные цены — в [каталоге](/models).

## Плюсы и минусы {#plyusy-minusy}

**Плюсы.** Отвечает на вопросы, где один поиск проваливается: сравнения, многошаговые запросы, данные, разбросанные по разным источникам. Не тратит контекст на явно нерелевантные фрагменты. Видно, какие источники использованы — трасса вызовов остаётся в логах.

**Минусы.** На один вопрос уходит несколько вызовов модели, поэтому латентность и стоимость выше, чем у обычного RAG. Цикл может зациклиться или уйти в бесконечные уточнения. Качество зависит от описаний инструментов и от того, насколько надёжна оценка выдачи.

Ограничители, без которых систему не стоит выпускать: лимит итераций (в примере выше — 4), бюджет на запрос и таймаут, правило «если два раза подряд пришло то же самое — отвечать по тому, что есть». Подробнее о том, как не потерять контекст в длинном цикле, — в статье про [управление контекстом](/pages/upravlenie-kontekstom-neyroseti-context-management).

## Связанные термины {#svyazannye-terminy}

- [Расширенная генерация с поиском (RAG)](/pages/rasshirennaya-generaciya-s-poiskom-rag) — базовый подход, который здесь дополняется решениями агента
- [Tool Calling API](/pages/tool-calling-api) — механизм, через который модель вызывает поиск
- [AI Agent](/pages/ai-agent) — что вообще делает систему агентом
- [Structured Output](/pages/structured-output) — как получить от модели однозначный вердикт о достаточности контекста
- [Agent Harness](/pages/agent-harness) — обвязка, в которой живёт цикл поиска
- [Чанкинг текста для RAG](/pages/text-chunking-dlya-rag) — от нарезки документов зависит, что вообще найдётся

## Что почитать {#chto-pochitat}

- [Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks](https://arxiv.org/abs/2005.11401), Lewis et al. — исходная работа про RAG
- [Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection](https://arxiv.org/abs/2310.11511)
- [Corrective Retrieval Augmented Generation](https://arxiv.org/abs/2401.15884)
- [ReAct: Synergizing Reasoning and Acting in Language Models](https://arxiv.org/abs/2210.03629)
