RAG Architecture: как построить проверяемый поиск по корпоративным данным
Production-архитектура RAG: парсинг и версии документов, chunking, embeddings, hybrid retrieval, reranking, citations, ACL и набор оценки качества.
RAG — это два контура, а не один prompt
Production RAG состоит из контура индексации и контура ответа. Индексация получает документы, извлекает структуру, делит содержимое на фрагменты, добавляет метаданные, вычисляет embeddings и записывает версии в поисковый индекс. Контур ответа преобразует вопрос, находит кандидатов, ранжирует их, собирает контекст и только затем вызывает LLM.
Разделение контуров необходимо для воспроизводимости. Ответ должен ссылаться на конкретную версию документа и фрагмент, а удалённый источник должен исчезать из выдачи после переиндексации. Без версий и lineage невозможно понять, модель ошиблась или поиск передал ей устаревший текст.
Ingestion и chunking
Парсер должен сохранять заголовки, таблицы, списки, номера страниц и связи между разделами. Простое извлечение сплошного текста разрушает структуру договора или регламента. Chunking лучше строить по семантическим границам с контролем максимального размера, а не разрезать каждый документ через одинаковое число символов.
Каждый chunk получает document_id, version, section, source_url, access labels, timestamps и checksum. Embedding — производная, а не первичный источник: его можно пересчитать при смене модели. Повторная индексация должна быть идемпотентной и удалять фрагменты старой версии, иначе поиск начнёт возвращать противоречивые копии.
Hybrid retrieval и reranking
Векторный поиск хорошо находит смысловую близость, но может пропустить точный артикул, номер договора или редкий термин. Полнотекстовый поиск силён в точных совпадениях, но слабее понимает переформулировки. Hybrid search запускает оба метода и объединяет кандидатов, повышая recall на смешанных корпоративных запросах.
Reranker повторно оценивает небольшой набор найденных фрагментов относительно конкретного вопроса. Он повышает precision, но добавляет задержку и стоимость, поэтому сначала извлекают умеренный пул кандидатов, затем ранжируют и передают модели только top-N. Порог релевантности нужен, чтобы система могла честно ответить «данных недостаточно».
Generation, citations и безопасность
LLM получает вопрос, инструкции и ограниченный контекст со стабильными идентификаторами источников. Ответ строится только на переданных фрагментах и возвращает citations, которые приложение проверяет перед показом. Ссылка должна вести к документу и месту, доступному текущему пользователю, а не просто содержать сгенерированное название файла.
ACL фильтруются до retrieval, а не после генерации. Иначе запрещённый документ уже попадёт в prompt и может повлиять на ответ. Отдельно защищаются инструкции: текст внутри документа считается данными, а не системной командой. Логи не должны сохранять секретный контекст без той же политики доступа и срока хранения.
Evaluation до и после запуска
Набор оценки должен содержать реальные вопросы, ожидаемые источники, допустимые формулировки и случаи без ответа. Retrieval оценивают отдельно через recall@k, precision и позицию правильного фрагмента. Генерацию проверяют на соответствие источнику, полноту, качество цитат и корректный отказ.
В production отслеживают отсутствие результатов, низкую релевантность, переходы по цитатам, feedback пользователей, задержку и стоимость. Каждое изменение chunking, embeddings, reranker или prompt сравнивается на одном регрессионном наборе. Без этого оптимизация RAG строится на нескольких эффектных demo-вопросах.
Чек-лист перед выводом RAG в промышленную эксплуатацию
- — Каждый chunk несёт document_id, version, section, source_url, access labels и checksum — не только текст
- — Реиндексация идемпотентна и удаляет фрагменты старой версии, дубликаты не накапливаются
- — ACL фильтруются до retrieval, а не после генерации ответа
- — Есть порог релевантности — система отвечает «данных недостаточно», а не придумывает
- — Citations ведут на документ и место, доступные текущему пользователю, а не на сгенерированное название файла
- — Есть регрессионный набор вопросов — каждое изменение chunking/embeddings/reranker/prompt сравнивается на нём, а не на паре demo-примеров
Метаданные chunk перед записью в индекс
{
"document_id": "policy-2026-14",
"version": 3,
"section": "4.2 Возврат средств",
"source_url": "/docs/policy-2026-14.pdf#page=6",
"access_labels": ["role:support", "role:sales"],
"checksum": "sha256:9f2a...",
"indexed_at": "2026-07-25T09:00:00Z"
} FAQ
Нужна ли RAG отдельная векторная база?
Не обязательно отдельный продукт, но нужен индекс с векторным поиском или эквивалентный механизм. На практике его стоит сочетать с полнотекстовым поиском.
Какой размер chunk лучше?
Единого значения нет. Chunk должен сохранять самостоятельный смысл и структуру документа; параметры подбирают на репрезентативном наборе вопросов.
Как уменьшить галлюцинации в RAG?
Улучшать retrieval, задавать порог отсутствия ответа, ограничивать генерацию источниками, проверять цитаты и тестировать вопросы без покрытия в данных.