Лаборатория ИИ «Честного знака» строит «Честного помощника» — систему, которая ищет информацию в Confluence, Jira и GitLab, обрабатывает документы и генерирует тексты для сотрудников. После первого MVP на Naive RAG стало очевидно: узкое место не в языковой модели и не в векторной базе, а в том, как документы готовятся к индексации и как обрабатываются запросы до и после поиска.
Advanced RAG решает именно эту проблему. В отличие от Naive RAG — прямолинейного пайплайна «запрос → поиск → генерация» — он добавляет два слоя. Pre-retrieval охватывает всё, что происходит до поиска: переформулировку запроса, расширение аббревиатур, маршрутизацию. Post-retrieval — фильтрацию, перестановку и ранжирование найденных фрагментов, чтобы в LLM попадало только релевантное.
| k | Cosine Sim | Soft Precision | Soft Recall | Soft F1 |
|---|---|---|---|---|
| 10 | 0.83 | 0.85 | 0.70 | 0.77 |
| 20 | 0.83 | 0.82 | 0.79 | 0.80 |
| 30 | 0.84 | 0.76 | 0.85 | 0.80 |
| 40 | 0.84 | 0.72 | 0.90 | 0.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-агентов. Агент в этом контексте — языковая модель с доступом к набору инструментов: поиску в векторной базе, интерпретатору кода, внешним сервисам. Такая система самостоятельно принимает решения о том, какой инструмент вызвать, и минимально нагружает пользователя уточняющими вопросами. Именно в этом направлении команда «Честного знака» развивает «Честного помощника» сейчас.


