DocMind: Q&A-агент над корпоративной документацией
Умная система вопросов и ответов, которая индексирует вашу техническую документацию —
PDF, Markdown, Notion, Confluence — и отвечает на вопросы с цитатами из источников.
Обычные вопросы обрабатывает за один поиск. Сложные составные — делает несколько
итераций, проверяет заземлённость ответа и умеет искать по графу связей.
Каждый модуль курса складывается в один работающий продукт.
⏱ 3–4 дня реализации🐍 Python 3.11+📦 Portfolio-ready🔗 Полный стек RAG
Зачем этот проект
Модуль 04 — самый насыщенный по количеству тем: документы, чанкинг, эмбеддинги,
векторные БД, retrieval, оценка, агентный RAG. На каждой теме пишешь изолированный пример.
Проект — это то место, где все примеры соединяются в одну систему.
Q&A-бот по документации — не учебная задача. Это первое, что просят сделать
во многих командах: «сделай нам умный поиск по вики». DocMind — полноценная реализация:
с умным роутингом, самопроверкой ответов, RAGAS-оценкой и поддержкой нескольких источников.
Всё из уроков модуля — в одном проекте.
Document Loaders → Chunking → Embeddings → Qdrant → Hybrid Search → Reranking →
Query Transformation → RAGAS → Agentic RAG → Self-RAG → Graph RAG.
Каждый урок модуля напрямую используется в системе.
Как это выглядит в работе
╔══════════════════════════════════════════════════════════════╗║DocMind · v1.0 · DataTalks.ru║╚══════════════════════════════════════════════════════════════╝Коллекция: engineering-wiki · 4 832 чанка · Qdrant localРежим: Agentic RAG · Self-RAG: on · Модель: claude-sonnet-4-6you› Что такое rate limiting и зачем он нужен?── [Retrieve?] no retrieval needed ────────────────────────────── вопрос про общую концепцию → прямая генерацияDocMind › Rate limiting — это ограничение количества запросов к API за единицу
времени. Защищает сервис от перегрузки и злоупотреблений.
Реализуется через алгоритмы Token Bucket или Sliding Window Counter.────────────────────────────────────────────────────────────────you› Какой лимит на запросы к нашему API для команды Data Science?── [Retrieve?] yes → hybrid search ──────────────────────────────🔍 hybrid_search(query="API rate limit Data Science team", k=8) → 8 чанков · BM25 + векторный · Qdrant · 45 мс── [ISREL] фильтрация ──────────────────────────────────────────── ✓ api-limits.md §3 · "Data Science quota: 500 req/min" ✓ api-limits.md §5 · "burst до 2000 req/min при согласовании" ✗ nginx-config.md · нерелевантен (rate limiting Nginx — другое)── Generate ─────────────────────────────────────────────────────── [ISGRT] fully_supported ──────────────────────────────────────DocMind › Команда Data Science имеет лимит 500 запросов/минуту [1].
При необходимости можно согласовать burst до 2000 req/min
через заявку в Platform team [2]. 📎 [1] api-limits.md, раздел 3 · Квоты по командам 📎 [2] api-limits.md, раздел 5 · Burst limits────────────────────────────────────────────────────────────────you› Какие сервисы зависят от Redis и кто за него отвечает?── [Retrieve?] yes → graph search ───────────────────────────────🕸 graph_search(entity="Redis", hops=2) → Сервис корзины —[USES]→ Redis → Сервис авторизации —[USES]→ Redis → Команда Platform —[MAINTAINS]→ Redis → Redis —[DEPLOYED_IN]→ AWS eu-west-1 (3 hop)DocMind › Redis используют 2 сервиса: корзина (сессии) и авторизация (токены) [1].
Ответственность несёт Команда Platform, развёрнуто в AWS eu-west-1 [2]. 📎 [1] architecture.md · Зависимости Redis 📎 [2] infrastructure.md · Развёртывание────────────────────────────────────────────────────────────────you› Объясни разницу Enterprise и Business тарифа и есть ли скидка на год?── Agentic: multi-step retrieval (DECOMPOSE) ────────────────────🔍 hybrid_search(query="Enterprise vs Business тариф отличия", k=6) → нашли сравнение тарифов · 3 чанка🔍 hybrid_search(query="скидка годовая подписка тарифы", k=6) → нашли политику оплаты · 2 чанка── [ISGRT] partially_supported → retry ───────────────────────── предупреждение: данные по скидке устарели (ревизия 2023)🔍 hybrid_search(query="annual discount pricing 2024", k=4) → актуальный документ pricing-2024.md── [ISGRT] fully_supported ──────────────────────────────────────DocMind ›Enterprise vs Business: Business: до 50 пользователей, базовая поддержка 9×5, SLA 99.5% [1]
Enterprise: неограниченные пользователи, поддержка 24×7, SLA 99.9%,
выделенный менеджер, кастомные интеграции [1]
Скидка при оплате на год: Business −15%, Enterprise −20% [2] 📎 [1] pricing.md · Сравнение тарифов 📎 [2] pricing-2024.md · Годовые скидки (обновлено 2024-03)you› /eval 20 Запуск RAGAS-оценки на 20 тестовых вопросах... Faithfulness: 0.91 ✓ Answer Relevancy: 0.87 ✓ Context Recall: 0.78 ↑ можно улучшить
Архитектура системы
DocMind состоит из двух независимых пайплайнов — индексирование и поиск —
плюс агентного слоя поверх поиска. Индексирование запускается один раз
(или инкрементально при обновлении документов). Поиск работает на каждый запрос.
100%
колёсико — масштаб · зажать и тянуть — перемещение
Два режима обработки запросов
Simple RAG
Когда: простой фактический вопрос, ответ в одном месте. ① [Retrieve?] = yes → hybrid_search② ISREL: фильтрация нерелевантных чанков③ Rerank: cross-encoder сортирует по релевантности④ Generate: LLM отвечает по топ-3 чанкам⑤ [ISGRT]: проверка заземлённости → возврат
Время ответа: ~500–800 мс.
Agentic RAG
Когда: составной вопрос, multi-hop, недостаточно одного поиска. ① Query transform: декомпозиция / расширение② Multi-step: 2–4 итерации с gap analysis③ Graph search: если вопрос про связи сущностей④ Self-RAG: ISREL + генерация k кандидатов + ISGRT⑤ Rank: лучший по score = ISUSE × ISGRT.weight
Время ответа: 1.5–4 сек.
Компоненты системы
DocMind строится из шести слоёв, каждый из которых соответствует одному-двум разделам модуля.
Слои независимы — можно заменить Qdrant на pgvector или добавить новый источник данных
без изменения агентного слоя.
Компонент
Что делает
Уроки модуля
DocLoader
Загружает документы из PDF (PyMuPDF), Markdown, Notion API, Confluence, веб-страниц (Firecrawl). Извлекает метаданные: источник, дату, раздел, автора.
Нарезает документы стратегией parent-child: мелкие чанки (256 токенов) для поиска, родительские (1024) для контекста LLM. Семантический чанкинг для длинных документов.
Qdrant хранит плотные векторы (nomic-embed-text) и payload-индекс для BM25. Параллельное upsert батчами по 100 чанков. Инкрементальное обновление по chunk_id hash.
NetworkX граф: сущности и отношения извлекаются LLM при индексировании. Leiden-кластеризация для community summaries (глобальный поиск). Fuzzy matching имён сущностей.
RAGAS: автоматическая генерация тест-сета через TestsetGenerator, оценка faithfulness / answer_relevancy / context_recall. Команда /eval N запускает прямо из CLI.
Шесть этапов, каждый даёт рабочую систему. На каждом этапе — конкретные файлы и тесты.
Реализацию удобно разбить на дни: этапы 1–2 за день один, 3–4 за день два, 5–6 за день три.
1
Базовый RAG-пайплайн
DocLoader для PDF и Markdown. ChunkPipeline с parent-child. Embed через nomic-embed-text.
Qdrant с dense-только поиском. CLI команда index ./docs/ и простой ask "вопрос".
Цель: система отвечает на прямые фактические вопросы.
Добавить BM25 payload-индекс в Qdrant. RRF-fusion dense + sparse. Cross-encoder reranking
через ms-marco-MiniLM. Metadata filtering по источнику и дате. Замерить разницу recall
до и после — должно быть заметно.
Gap-analysis loop: до 4 итераций с уточнением запроса. NER + relation extraction при
индексировании (кэш). NetworkX граф. Local search по 2-hop обходу.
Роутер: простой вопрос → simple, multi-hop → graph, составной → decompose.
TestsetGenerator: автоматически генерирует 50 QA-пар из корпуса
(simple / reasoning / multi-context). Команда /eval N запускает offline-оценку
и выводит метрики в таблицу. Выявляем слабые места и фиксим.