Дизайн RAG-системы для агента
Чанкинг, эмбеддинги, индекс, реранкинг — RAG, который правда находит нужное.
Спроектируй RAG для корпуса {{corpus}}.
Зачем RAG
Дать агенту доступ к актуальной, специфичной информации которой нет в его обучающих данных.
Когда RAG лучше fine-tune
- Данные часто меняются
- Нужна цитируемость (показать источник)
- Корпус большой (десятки тысяч документов+)
- Нет ресурсов на fine-tune
Архитектура
[Документы] → [Чанкер] → [Эмбеддер] → [Vector DB]
↑
[Query]
↓
[LLM] ← [Контекст] ← [Reranker] ← [Top-K]
1. Чанкинг (как резать документы)
Самое важное решение. Размер чанка влияет на качество.
| Стратегия | Когда |
|---|---|
| Fixed-size (512-1024 токенов) | Простой baseline, документы плотные |
| Sentence-based | Длинные тексты, важна границы предложений |
| Markdown-aware (по заголовкам) | Документация, structured docs |
| Semantic chunking (разрезы по смыслу) | Сложные тексты, требует extra ML |
Overlap: 10-20% между соседними чанками — чтобы не разрывать контекст.
Метаданные на чанк: doc_id, section, page, timestamp, source — это поможет фильтрации и rerank.
2. Эмбеддинги
Модель:
- OpenAI
text-embedding-3-large— топ качество - Voyage AI — хорошее качество, лучше для кода
- Open-source:
bge-large,nomic-embed— self-host
Размер: 1024-3072 dimensions для качества. Для скорости — 384-768.
Hybrid поиск: комбинируй векторный + keyword (BM25). Векторный лучше для семантики, keyword — для точных терминов / имён.
3. Vector DB
| Опция | Когда |
|---|---|
| pgvector (Postgres) | Уже есть Postgres, < 1M векторов |
| Qdrant / Weaviate | 1-100M векторов, нужны фичи |
| Pinecone | Managed, не хочешь админить |
| Chroma | Простое локальное использование |
4. Запрос → результаты
Шаг 1: query embedding
Шаг 2: top-50 ближайших векторов
Шаг 3: rerank top-50 → top-5 (cross-encoder reranker)
Шаг 4: context = concatenate top-5 chunks
Шаг 5: LLM с context + query
Reranking — критично. После retrieve у тебя 50 кандидатов, нужно выбрать лучшие 5. Cross-encoder (Cohere Rerank, Voyage Rerank) делает это сильно лучше чем cosine similarity.
5. Контекст для LLM
Тебе доступны следующие фрагменты из {{corpus}}:
[1] Source: doc.md, section: "Setup"
"..."
[2] Source: api.md, section: "Auth"
"..."
[3] Source: faq.md
"..."
На основе этих фрагментов ответь на вопрос. Если ответ не в фрагментах — скажи "не знаю". Цитируй источники [N].
6. Метрики качества
- Retrieval recall@k: есть ли правильный документ в top-k
- Faithfulness: не выдумал ли LLM то чего нет в контексте
- Answer relevance: соответствует ли ответ вопросу
- Citation precision: правильные ли цитаты
Делай eval set из 50-100 пар "вопрос → правильный документ" и прогоняй на каждом изменении.
7. Обновление индекса
- Полная переиндексация (раз в неделю)
- Delta-обновления (на каждый изменённый документ)
- Удаление: чанки помечаются tombstone, периодический cleanup
8. Стоимость
| Часть | $$ |
|---|---|
| Эмбеддинги документов | Один раз, OpenAI ≈ $0.13/1M токенов |
| Эмбеддинги запросов | Постоянно, но дёшево |
| Vector DB hosting | $20-500/мес зависит от объёма |
| Reranking | $1/1k запросов ≈ Cohere |
| LLM context | Зависит от размера контекста |
Анти-паттерны
- ❌ Чанки по 100 токенов — нет контекста
- ❌ Чанки по 8k токенов — слишком много шума в контексте LLM
- ❌ Без reranking — top-5 будут случайные
- ❌ Хранить вектор без метаданных — нечем фильтровать
- ❌ Грузить весь doc в context, а не chunks — bloat
- ❌ Не делать eval — летаешь вслепую
Принципы
- Качество retrieval > качество LLM. Если retrieval плохой — никакая модель не вытянет.
- Hybrid > pure vector
- Reranking даёт +20-40% к качеству
- Eval set обязателен
Создать специализированного агента
Определить роль, инструменты, границы и системный промт нового агента для Claude Code.
Шаблон системного промта агента
Готовая структура: роль, контекст, инструменты, алгоритм, формат, anti-patterns.
Декомпозиция задачи на агентов
Разбить большую задачу на параллельных независимых агентов с чёткими интерфейсами.