# Retrieval-Augmented Generation (RAG) и построение Agentic RAG систем

> [HTML-версия](https://learnvibecoding.ru/publiclessons/retrieval-augmented-generation-rag-i-postroenie-agentic-rag-sistem) · [Индекс для LLM](https://learnvibecoding.ru/llms.txt) · [Политика использования материалов](https://learnvibecoding.ru/politika-materialov)
> Материалы защищены. Обучение LLM без согласия запрещено. При разрешённом использовании — обязательна прямая ссылка на страницу-источник.
> Разберемся, как Retrieval-Augmented Generation помогает LLM моделям быть точнее, и научиться использовать Agentic RAG

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

## Цель урока

Разобраться, как Retrieval-Augmented Generation (RAG) помогает LLM моделям быть точнее, и научиться использовать **Agentic RAG** — расширенный подход, где агент сам ищет, проверяет и комбинирует знания.

Вы узнаете, что такое **векторная база данных**, как она создаётся и как подключается к агенту для реальной работы.

---

## Почему одной LLM недостаточно

Большие языковые модели умеют рассуждать и писать тексты, но они:

- имеют **knowledge cutoff** — не знают событий после даты обучения;
- не понимают **специализированные темы** (например, внутренние процессы компании);
- не имеют доступа к **вашим документам, почте, базам знаний**;
- не могут **цитировать источники**, что снижает доверие;
- и часто **галлюцинируют**, выдавая вымышленные данные.

Чтобы устранить эти ограничения, и был создан подход **RAG — Retrieval-Augmented Generation**.

---

## Что делает RAG

**RAG** (поиск с дополнением генерации) позволяет модели использовать внешние данные.

Когда пользователь задаёт вопрос, система не ищет ответ «из головы» модели,

а достаёт его из **реальных источников** — базы знаний, документов, сайтов — и только потом генерирует ответ.

## Преимущества RAG

- **Доступ к актуальным и приватным данным** — можно подключать базы знаний, новости, соцсети, CRM и другие источники.
- **Больше доверия** — можно сохранять ссылки на источники.
- **Контроль и прозрачность** — вы управляете тем, откуда берётся контекст и как он используется.
- **Гибкость и экономия** — RAG дешевле, чем fine-tuning или дообучение модели.
- **Безопасность** — можно фильтровать, авторизовывать и логировать обращения к данным.

## Когда RAG особенно полезен

| Сценарий | Применение |
| --- | --- |
| Корпоративные ассистенты | Ответы на вопросы из внутренних документов |
| Customer support | Быстрый доступ к актуальным справкам и политике |
| Аналитика и отчётность | Обогащение модели данными из CRM, ERP, SQL |
| Образовательные системы | Динамическая генерация ответов с факт-чекером |
| Финтех / Медтех | Проверка актуальных регуляций и норм |

---

## Как работает RAG — 4 шага

| Этап | Что происходит | Пример |
| --- | --- | --- |
| **1️⃣ Ingestion (загрузка данных)** | Подготовка и загрузка документов в векторную базу данных | Загружаем PDF, wiki, письма, CRM-записи |
| **2️⃣ Retrieval (извлечение)** | Поиск релевантных документов по смыслу | Агент находит раздел политики отпусков |
| **3️⃣ Augmentation (дополнение)** | Комбинирует найденные фрагменты с вопросом | Формирует промпт: вопрос + контекст |
| **4️⃣ Generation (генерация)** | LLM генерирует ответ, опираясь на достоверные данные | “Заявление подаётся через HR-портал” |

---

## Что такое векторная база данных

**Векторная база данных** — это место, где хранятся не тексты, а **их смысл в числовом виде**.

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

Пример:

```
"кофе" → [0.31, 0.72, -0.11, ...]
"капучино" → [0.33, 0.75, -0.09, ...]

```

Теперь можно измерять **смысловую близость** между фразами.

Поэтому векторные базы позволяют искать **по смыслу, а не по словам**.

---

## Как создаётся векторная база (пошагово)

### 🔹 1. Сбор данных

Вы собираете источники знаний: PDF, Notion, wiki, CRM, письма, сайт компании.

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

### 🔹 2. Разбиение на фрагменты

Документы делятся на логические части (например, по 500–1000 символов).

Это важно: модели работают лучше, если куски небольшие и контекст точный.

### 🔹 3. Эмбеддинг (vectorization)

Каждый фрагмент проходит через **embedding-модель** (например, `text-embedding-3-small` от OpenAI),

которая превращает текст в **вектор — массив чисел**, отражающий смысл.

### 🔹 4. Загрузка в векторную базу

Векторы записываются в базу — например:

- 🪐 **Pinecone** — облачная, готовая для продакшена
- 💎 **Chroma** — open-source
- 🧠 **Weaviate** — с расширениями для AI
- ⚙️ **Milvus** — подходит для больших массивов данных
- 💻 **FAISS** — локальная библиотека от Meta

### 🔹 5. Поиск и интеграция

Когда пользователь задаёт вопрос, его запрос тоже превращается в вектор.

Система ищет **самые близкие по смыслу фрагменты** и возвращает их как контекст модели.

LLM затем формирует ответ, опираясь на эти данные.

---

## 🔍 Пример: векторный поиск по смыслу

**Классический поиск:**

> “Как оформить отпуск?”
> 
> 
> → ищет точные совпадения по словам.
> 

**RAG-поиск (с векторной базой):**

> “Как взять выходные?”
> 
> 
> → находит документ “Заявление на отпуск подаётся через HR-портал.”
> 

Даже если слова разные — смысл совпадает.

---

## RAG в агентных системах

RAG становится особенно мощным, когда его **используют AI-агенты**.

Вместо одного «одношагового» запроса, агент может:

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

### Агент как оркестратор RAG

Агент выполняет цикл:

```
1. Думай → сформулируй уточнённый вопрос
2. Действуй → используй поисковый инструмент
3. Наблюдай → оцени релевантность результата
4. Повтори → при необходимости скорректируй запрос
5. Ответь → создай финальный ответ
```

## Agentic RAG — развитие идеи

Традиционный RAG делает один поиск и один ответ.

**Agentic RAG** добавляет «мозг» — **агента**, который может:

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

Это делает ответы **точнее, гибче и проверяемее**.

---

## Пример Agentic RAG с DuckDuckGo и smolagents

```python
from smolagents import CodeAgent, DuckDuckGoSearchTool, InferenceClientModel

search_tool = DuckDuckGoSearchTool()
model = InferenceClientModel()

agent = CodeAgent(model=model, tools=[search_tool])

response = agent.run(
    "Search for luxury superhero-themed party ideas, including decorations, entertainment, and catering."
)
print(response)

```

Агент:

1. анализирует запрос (“вечеринка в стиле супергероев”);
2. выполняет поиск;
3. объединяет найденную информацию в единый ответ;
4. сохраняет контекст в памяти для следующих шагов.

---

## Пример с собственной базой знаний

Добавим кастомный инструмент, который ищет не в интернете, а во **внутренней векторной базе**:

```python
from langchain.docstore.document import Document
from langchain.text_splitter import RecursiveCharacterTextSplitter
from smolagents import Tool
from langchain_community.retrievers import BM25Retriever
from smolagents import CodeAgent, InferenceClientModel

class PartyPlanningRetrieverTool(Tool):
    name = "party_planning_retriever"
    description = "Searches ideas for Alfred’s superhero-themed party."
    inputs = {"query": {"type": "string"}}
    output_type = "string"

    def __init__(self, docs, **kwargs):
        super().__init__(**kwargs)
        self.retriever = BM25Retriever.from_documents(docs, k=5)

    def forward(self, query: str) -> str:
        docs = self.retriever.invoke(query)
        return "\nIdeas:\n" + "".join(
            [f"\n\nIdea {i}:\n{doc.page_content}" for i, doc in enumerate(docs)]
        )

# База идей
party_ideas = [
    {"text": "A superhero-themed masquerade ball with gold decor.", "source": "Decor"},
    {"text": "Hire a DJ playing themes from Batman & Wonder Woman.", "source": "Music"},
    {"text": "Serve dishes like 'Iron Man's Power Steak'.", "source": "Catering"},
]

source_docs = [Document(page_content=doc["text"]) for doc in party_ideas]
splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
docs_processed = splitter.split_documents(source_docs)

retriever_tool = PartyPlanningRetrieverTool(docs_processed)
agent = CodeAgent(model=InferenceClientModel(), tools=[retriever_tool])

response = agent.run("Find ideas for luxury superhero party.")
print(response)

```

Такой агент может:

- искать по внутренним документам,
- комбинировать результаты с веб-поиском,
- сохранять контекст и извлекать память,
- фильтровать нерелевантные ответы.

---

## Расширенные возможности Agentic RAG

| Метод | Что делает |
| --- | --- |
| **Query Reformulation** | Агент переформулирует запрос для лучшего совпадения |
| **Query Decomposition** | Делит сложный вопрос на несколько простых |
| **Query Expansion** | Создаёт несколько вариантов запроса |
| **Reranking** | Пересортировывает результаты по смысловой близости |
| **Multi-Step Retrieval** | Делает несколько итераций поиска |
| **Source Integration** | Объединяет разные источники (веб + база знаний) |
| **Result Validation** | Проверяет точность и релевантность данных |

---

## Как использовать это на практике

1. **Подготовьте данные** — соберите нужные документы, очистите, структурируйте.
2. **Создайте векторную базу** — загрузите тексты через embedding-модель.
3. **Интегрируйте базу с агентом** — добавьте инструмент для поиска по ней.
4. **Добавьте LLM (например, GPT-4)** — она будет интерпретировать результаты и формировать ответы.
5. **Настройте цикл Reasoning (Thought → Action → Observation)** — чтобы агент умел думать, искать и проверять.
6. **Добавьте память и валидацию** — чтобы агент не повторял ошибки и мог адаптироваться.

---

## Итог

| Технология | Что делает | Результат |
| --- | --- | --- |
| **RAG** | Добавляет контекст из внешних данных | Ответы с реальными фактами |
| **Agentic RAG** | Позволяет агенту думать, уточнять и проверять | Осознанные и точные ответы |
| **Векторная база** | Хранит смысл текста в числовом виде | Поиск по смыслу, а не по словам |

> 💬 В 2025 году RAG стал не просто технологией поиска,
> 
> 
> а фундаментом для **умных, адаптивных и ответственных AI-агентов**,
> 
> которые опираются на реальные знания, а не на догадки.
>

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