Когда 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% результата делает подготовка данных. Модель — только последний и самый простой шаг.
· вчера
Зацепило, что начали с документации, а не со смены модели. А вопросы для следующей проверки будете брать из реальных обращений коллег?
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· вчера
Думаю да, будем тестировать на реальных запросах (в боевом режиме). Что касается работы с документацией, даже большая модель на некорректных данных будет давать бредовые ответы. Как говорится "garbage in garbage out"
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён