Когда RAG на горе свистнет | Ч.4 | Пересборка

В прошлый раз я закончил на том, что локальный RAG по справке Deswik и Whittle отвечает красиво, но иногда выдумывает несуществующие функции. Причина была не в модели. Модель просто брала то, что ей подсовывал поиск, а поиск работал по грязным и плохо нарезанным данным.

Поэтому я не стал менять модель. Я переделал всё, что стоит до неё: конвертацию, разбиение, настройки Ollama и промпт. Вот что получилось.

1. Выкинул из справки всё, что не является справкой. Родная документация — это MadCap Flare. Внутри HTML, кроме текста, лежат меню, хлебные крошки, футеры, кнопки «наверх» и блоки «связанные темы». Если конвертировать «как есть», модель учится на навигационном мусоре. Я написал скрипт, который вырезает всё это, оставляя только основной контейнер с текстом. Заодно он превращает псевдозаголовки (абзацы с CSS-классами `h2`, `h3`) в настоящие заголовки Markdown и разворачивает таблицы с огромными ячейками в читаемые блоки. Итог: 3282 HTML-страницы → 3131 чистый Markdown-файл. Без ошибок конвертации, без строк длиной в 30 тысяч символов.

2. Убил дубликаты. Во Flare одна и та же страница часто лежит в нескольких папках. У Deswik.GO из 143 страниц 69 оказались копиями. Если их не убрать, поиск будет возвращать пять одинаковых кусков. Сейчас остаётся одна копия, а все места, где она лежала, записываются в метаданные. Всего склеил 132 дубликата.

3. Настроил контекст и кэш Ollama. По умолчанию Ollama даёт 4096 токенов контекста. Для RAG это мало: в запрос входят инструкция, вопрос и несколько найденных фрагментов. Я выставил 32768, включил Flash Attention и сжатый кэш `q8_0`. На RTX A5500 (16 ГБ) модель `gemma4:12b` с таким контекстом занимает около 9.6 ГБ видеопамяти и работает полностью на GPU. Запас есть.

4. Подобрал размер чанка и порог. В Ч.3 стояли 800/150. Сейчас — 1500 символов с перекрытием 200. Порог Min Score снизил с 0.5 до 0.3. Это компромисс: слишком высокий порог отрезает правильные русские вопросы к английской справке, слишком низкий тащит мусор. После смены чанка индекс пересобирается с нуля.

5. Написал жёсткий системный промпт. Три главных правила: отвечать только*по найденным фрагментам; если ответа нет — сказать это одной фразой; всегда указывать, из какого продукта взято утверждение (Deswik.CAD, Deswik.GO, Whittle). Плюс отдельное правило про названия кнопок: их нельзя переводить, даже если ответ на русском.

Что в итоге. Ассистент перестал «фантазировать» на пустом месте. На вопрос про несуществующее поле «Maximum haul distance» он честно говорит, что в документации этого нет. На вопрос про цену лицензии Whittle — тоже отказ. Там, где ответ есть, он ссылается на страницу и не переводит UI-термины.

Но главное: я до сих пор не измерял качество количественно. Сейчас на руках 10 стартовых вопросов, из них 5 — «ловушки» на отказ. Полноценный эталонный набор (30–50 вопросов) и метрики попадания в топ-5 — следующий шаг.

Локальный RAG — это не «поставил модель и работает». Это конвейер, где 80% результата делает подготовка данных. Модель — только последний и самый простой шаг.

Когда RAG на горе свистнет | Ч.4 | Пересборка | Сетка — социальная сеть от hh.ru