Как научить ИИ понимать «ништяки»
Корпоративная вики — это кладбище. Туда сваливают регламенты, приказы, политику отпусков. Хоронят как положено: потом никто не приходит. Формально знания есть. Практически — нет.
Найти может только тот, кто уже знает, что ищет.
У нас даже такого кладбища не было. Подняли Wiki.js с нуля.
Два языка
Первый сбой случился на демо для руководства.
База знаний тогда была ещё моя. Я сам переносил туда статьи, сам форматировал. В голове сидели правильные слова. Положил инструкцию по заказу корпоративного транспорта — пошёл показывать.
«Как заказать транспорт?» — пошаговый ответ. Кайф.
Потом попросил то же сделать руководителя. Он спросил: «Как заказать машину?». Модель: «Такая информация отсутствует в базе знаний».
Оказалось, не все думают моим словарём. Это я узнал ровно в ту секунду.
Второй случай добил. Спрашиваю админа, можно ли завести почтовый ящик на отдел. Он: «Можно, пиши служебку, инструкция такая-то, пункт 6.2».
Полез в вики проверить. Нашлась. Мало того — положение пересмотрели, и теперь это пункт 9.4, а не 6.2. Система знала свежую версию лучше, чем живой админ. Я возгордился. Слишком рано.
На показе начальству воспроизвести не вышло. Тема одна, запросы — другие: «почта отдела», «общий ящик», «email на команду». Каждый ответ мимо. Нужный фрагмент выдавался только на точную фразу «почтовый ящик», в которую я случайно попал с первого раза. На публике добивался с десятой попытки. Кринж.
Один сотрудник говорит «ништяки» и имеет в виду ДМС и фитнес. Другой тот же ДМС и фитнес описывает как «социальные гарантии в рамках коллективного договора». Между этими формулировками — пропасть. Через пропасть обычно перекидывают ИИ-ассистента.
Железо
Нам выдали две Nvidia Tesla M60. На каждой — два GPU по 8 ГБ, суммарно 32 ГБ VRAM. Карты из эпохи, когда GPT ещё не умел в двузначные числа.
Модель — Qwen 3.5 4B. Маленькая, быстрая, в длинном контексте плывёт.
Без облака, без H100, без бюджета на чужой ум в аренду.
Поиск важнее модели
Фокус не в модели. Фокус — во входе.
Поиск ходит тремя дорогами параллельно:
- векторный — ловит смысл (BGE-M3, dense 1024 + sparse);
- полнотекстовый — ловит имена, коды, номера приказов (PostgreSQL FTS, русская морфология);
- триграммный — ловит опечатки.
Один промахнётся — подстрахует другой. Сверху кросс-энкодер bge-reranker-v2-m3 пересобирает топ по релевантности вопросу. Reranker живёт на CPU — VRAM бережём под генератор.
Модель эмбеддингов выбрана по ruMTEB — обзор на vc.ru, бенчмарк на arxiv.
Три лица одного вопроса
Qwen переписывает запрос тремя способами: синонимы, другие части речи, разговорный вариант. Вместе с оригиналом — четыре формулировки.
«Как заказать машину?» может стать:
- «заказ автомобиля для командировки» — именная форма;
- «как оформить транспорт на работу» — глагольная;
- «где взять тачку по служебным делам» — разговорная.
По каждой формулировке параллельно идёт векторный поиск. Fulltext и триграммный — только по оригиналу: они ловят точные имена, коды, номера и опечатки, парафраз им не нужен.
Результаты всех ветвей сливаются через RRF, дубликаты по странице и чанку схлопываются.
Follow-up — отдельный случай. «А какой у него email?» сам по себе не ищется. Модель сначала разворачивает местоимения по истории диалога («email Иванова, директора продаж»), и только потом парафразит.
Обычный query expansion. Просто сделанный аккуратно.
Чанки и перестановка
Статьи режем по заголовкам markdown, дальше — по 300 слов с перекрытием 75. На каждый чанк — dense + sparse вектор BGE-M3.
4B-модели мешает «lost in the middle»: в длинном контексте середина выпадает из внимания. Два трюка:
- Перестановка. Самый релевантный чанк уходит в конец, ближе к вопросу.
- Приоритезация. Модели прямо сказано, где в списке важное.
Отраслевой сленг — через словарь синонимов (synonyms.json). Без дообучения. Просто «почта / ящик / мыло → email».
Диалог
— Какие ништяки положены?
— ДМС, фитнес, обучение. Раздел «Льготы и бонусы».
— Как оформить тачку для поездки?
— Командировка. Регламент «Транспортная политика», по шагам.
На следующей неделе включаем на живых пользователях. «Ништяки» модель выучила. Что из остального корпоративного диалекта окажется для неё непереводимым — узнаем в понедельник.