Лаборатория ИИ «Честного знака» строит «Честного помощника» — систему, которая ищет информацию в Confluence, Jira и GitLab, обрабатывает документы и генерирует тексты для сотрудников. После первого MVP на Naive RAG стало очевидно: узкое место не в языковой модели и не в векторной базе, а в том, как документы готовятся к индексации и как обрабатываются запросы до и после поиска.

Advanced RAG решает именно эту проблему. В отличие от Naive RAG — прямолинейного пайплайна «запрос → поиск → генерация» — он добавляет два слоя. Pre-retrieval охватывает всё, что происходит до поиска: переформулировку запроса, расширение аббревиатур, маршрутизацию. Post-retrieval — фильтрацию, перестановку и ранжирование найденных фрагментов, чтобы в LLM попадало только релевантное.

kCosine SimSoft PrecisionSoft RecallSoft F1
100.830.850.700.77
200.830.820.790.80
300.840.760.850.80
400.840.720.900.80

Команда переработала весь пайплайн нарезки документов. Вместо стандартного сплиттера теперь используется двухэтапная схема: MarkdownHeaderTextSplitter сначала делит документ по заголовкам, сохраняя структуру страницы, затем RecursiveCharacterTextSplitter режет секции по токенам. Таблицы и блоки кода обрабатываются отдельно, чтобы не разрезать их посередине. Техника Small-2-Big позволяет делать эмбеддинг на уровне отдельных предложений, а при нахождении релевантного — расширять контекст до более крупного фрагмента. Sliding Window добавляет перекрывающиеся чанки, страхуя от потери информации на границах фрагментов. К каждому чанку прикрепляются метаданные: название статьи, автор, пространство Confluence.

Команда сменила эмбеддер с ИИ-sage/Giga-Embeddings-instruct на intfloat/multilingual-e5-large — меньший по размеру, но более стабильный на русскоязычных текстах.

Для оценки качества поиска команда собрала датасет вручную: реальные пользователи каждого Confluence-пространства формулировали запросы и вручную отмечали ID статей, которые должны присутствовать в ответе. Получилось около 100 вопросов на каждое пространство. Такой подход принципиально отличается от синтетических датасетов — он отражает реальные информационные потребности.

Результаты измерений показали: при k=10 система находит 70% нужной информации (Recall), при k=40 — уже 90%. Precision при этом остаётся стабильной в диапазоне 0.72–0.85. F1 выходит на плато при k=20–40 и держится на уровне 0.80. Практический вывод команды: оптимально извлекать 30–40 чанков, ранжировать их через bi-encoder и передавать в модель топ-10–15. Отдавать все 40 чанков напрямую в LLM нецелесообразно — шум в контексте снижает качество ответа.

Параллельно команда провела масштабное тестирование bi-encoder моделей на доменном датасете и сменила эмбеддер: вместо ИИ-sage/Giga-Embeddings-instruct теперь используется intfloat/multilingual-e5-large. Несмотря на меньший размер, она показала лучший баланс между качеством поиска, скоростью векторизации и стабильностью на разнородных русскоязычных текстах. Переход к чанковому поиску вместо передачи полных статей сократил потребление контекста LLM вдвое: с ~120 000 токенов до ~60 000. Значение 60k — внутренний лимит безопасности; реальные запросы в production потребляют значительно меньше.

Следующий шаг в эволюции системы — переход от монолитного пайплайна к модульной архитектуре на основе LLM-агентов. Агент в этом контексте — языковая модель с доступом к набору инструментов: поиску в векторной базе, интерпретатору кода, внешним сервисам. Такая система самостоятельно принимает решения о том, какой инструмент вызвать, и минимально нагружает пользователя уточняющими вопросами. Именно в этом направлении команда «Честного знака» развивает «Честного помощника» сейчас.