В Confluence 1200 страниц, полсотни авторов — никто не помнит, где лежит инструкция по VPN. Сотрудники тратят в среднем 20 минут на поиск, а чаще переспрашивают в чатах. Keyword-поиск выдаёт список статей без понимания контекста. RAG-система меняет это: вы задаёте вопрос — получаете ответ с цитатами за 10 секунд. Мы разрабатываем такие системы более 5 лет и внедрили 15+ проектов. Средняя экономия составила $1 500 в месяц, а окупаемость — 4 месяца. Для одного клиента экономия достигла $15 000 в год за счёт сокращения времени инженеров.
Как работает семантический поиск?
Сборка индекса на LlamaIndex с Qdrant в качестве векторного стора и моделью эмбеддингов HuggingFace. Документы разбиваются на чанки, векторизуются и сохраняются в векторной БД. По запросу ищутся семантически близкие чанки, реранжируются cross-encoder моделью, и LLM генерирует финальный ответ с цитатами. Для русско-английских баз используем multilingual-e5-large (1024d) — он даёт на 15% больше recall, чем BGE-small. Источник: документация LlamaIndex. Вот ключевой фрагмент кода:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter from llama_index.core.retrievers import VectorIndexRetriever from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.postprocessor import SentenceTransformerRerank from llama_index.vector_stores.qdrant import QdrantVectorStore from llama_index.embeddings.huggingface import HuggingFaceEmbedding import qdrant_client embed_model = HuggingFaceEmbedding( model_name="intfloat/multilingual-e5-large", embed_batch_size=32 ) splitter = SentenceSplitter( chunk_size=512, chunk_overlap=64, paragraph_separator="\n\n" ) reranker = SentenceTransformerRerank( model="cross-encoder/ms-marco-MiniLM-L-6-v2", top_n=5 ) client = qdrant_client.QdrantClient(url="http://localhost:6333") vector_store = QdrantVectorStore(client=client, collection_name="kb_docs") index = VectorStoreIndex.from_vector_store( vector_store=vector_store, embed_model=embed_model ) query_engine = RetrieverQueryEngine( retriever=VectorIndexRetriever(index=index, similarity_top_k=15), node_postprocessors=[reranker], ) Почему parent-child chunking необходим?
Документация иерархична: раздел, подраздел, параграф. Наивный чанкинг по 512 токенов разрезает логические блоки. Решение — parent-child chunking: мелкие чанки для поиска, крупные для контекста. Это даёт faithfulness +12% и relevance +18% по сравнению с flat chunking.
| Параметр | Flat chunking | Parent-child chunking |
|---|---|---|
| Faithfulness (RAGAS) | 0.68 | 0.76 |
| Relevance (RAGAS) | 0.72 | 0.85 |
Как настроить инкрементальное обновление?
Ключевые шаги настройки RAG-пайплайна
- Соберите список всех источников (Confluence, Notion, Google Docs).
- Выберите модель эмбеддингов (multilingual-e5-large для русского+английского).
- Настройте parent-child chunking с размером parent=1024 токенов, child=256.
- Разверните векторную БД (Qdrant или pgvector).
- Реализуйте инкрементальный сборщик изменений по API.
- Подключите реранкер (cross-encoder) для повышения точности.
- Интегрируйте LLM (GPT-4o или Claude) для генерации ответов.
class DocumentationIndexer: def __init__(self, confluence_client, vector_store): self.confluence = confluence_client self.index = vector_store self.last_indexed = {} async def incremental_update(self): all_pages = self.confluence.get_all_pages(space_key="KB") for page in all_pages: page_id = page["id"] modified = page["version"]["when"] if self.last_indexed.get(page_id) == modified: continue self.index.delete(filter={"page_id": page_id}) content = self.confluence.get_page_body(page_id) nodes = self._parse_and_chunk(content, page) self.index.add(nodes) self.last_indexed[page_id] = modified return {"updated": len([p for p in all_pages if self.last_indexed.get(p["id"]) != p["version"]["when"]])} Инкрементальное обновление выполняется раз в час, что гарантирует актуальность без переиндексации всего корпуса.
Процесс работы
| Этап | Длительность | Что делаем | Результат |
|---|---|---|---|
| Аналитика | 1–2 дня | Анализируем структуру документации, типы документов, частоту запросов | Техническое задание и прототип на 10–20 документах |
| Проектирование | 2–3 дня | Выбираем модель эмбеддингов, векторную базу, схему чанкинга | Документ архитектуры решения |
| Реализация | 1–4 недели | Разрабатываем пайплайн индексации, конфигурируем ретривер и LLM, интегрируем с Confluence/Notion и Slack | Работающая система на тестовом наборе |
| Тестирование | 3–5 дней | Оцениваем по RAGAS (faithfulness, relevance, precision), проводим A/B тест | Отчёт с метриками и рекомендации |
| Развёртывание | 2–3 дня | Разворачиваем на инфраструктуре клиента, настраиваем CI/CD | Продуктивный контур, документация администратора |
Что входит в работу
- Документ архитектуры решения с обоснованием выбора модели и векторной базы.
- Пайплайн индексации с parent-child chanking и инкрементальным обновлением.
- Интеграция с Confluence, Notion или Google Docs через API.
- Slack-бот или веб-интерфейс для запросов с цитированием источников.
- Административная панель для мониторинга запросов и метрик (RAGAS).
- Документация администратора и обучение команды (2 часа).
- Поддержка в течение 1 месяца после запуска.
Типичные ошибки
- Игнорирование иерархии документов. Parent-child chunking обязателен — иначе теряете до 18% relevance.
- Редкое обновление индекса. Настройте инкрементальный пайплайн раз в час.
- Выбор слабой модели эмбеддингов. Для русско-английской документации multilingual-e5-large (1024d) или BGE-M3 — минимум. BGE-small теряет 15% recall.
- Отсутствие реранкера. Без cross-encoder точность топ-3 падает на 10–20%.
- Пренебрежение безопасностью. Настройте фильтрацию prompt injection и аудит запросов.
Кейс: IT-компания, 200 человек, 1200 статей. Среднее время ответа — 1,4 сек, accuracy 82%. Количество повторных вопросов в #general упало на 43% за первый месяц. Проект окупился за 4 месяца — средняя экономия $12 000 в год.
Свяжитесь с нами для оценки вашего проекта. Получите консультацию по внедрению RAG-поиска на ваших данных. Закажите демо-доступ к готовой системе на тестовом наборе документов.







