---
title: "Как научить ИИ понимать «ништяки»"
date: 2026-04-18
category: "Инженерия"
tags: ["RAG", "LLM", "Поиск", "Оптимизация"]
description: "RAG-система на слабом железе: трёхуровневый поиск, query expansion и переранжирование вместо дообучения."
canonical: https://avdeev.blog/notes/2026-04-18-smart-rag-on-weak-hardware/
---

# Как научить ИИ понимать «ништяки»

Корпоративная вики — это кладбище. Туда сваливают регламенты, приказы, политику отпусков. Хоронят как положено: потом никто не приходит. Формально знания есть. Практически — нет.

Найти может только тот, кто уже знает, что ищет.

У нас даже такого кладбища не было. Подняли 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](https://huggingface.co/BAAI/bge-reranker-v2-m3) пересобирает топ по релевантности вопросу. Reranker живёт на CPU — VRAM бережём под генератор.

Модель эмбеддингов выбрана по ruMTEB — [обзор на vc.ru](https://vc.ru/ai/2730372-embedddingi-dlya-russkogo-yazyka-v-2026), [бенчмарк на arxiv](https://arxiv.org/abs/2408.12503).

## Три лица одного вопроса

Qwen переписывает запрос тремя способами: синонимы, другие части речи, разговорный вариант. Вместе с оригиналом — четыре формулировки.

«Как заказать машину?» может стать:

- «заказ автомобиля для командировки» — именная форма;
- «как оформить транспорт на работу» — глагольная;
- «где взять тачку по служебным делам» — разговорная.

По каждой формулировке параллельно идёт векторный поиск. Fulltext и триграммный — только по оригиналу: они ловят точные имена, коды, номера и опечатки, парафраз им не нужен.

Результаты всех ветвей сливаются через RRF, дубликаты по странице и чанку схлопываются.

Follow-up — отдельный случай. «А какой у него email?» сам по себе не ищется. Модель сначала разворачивает местоимения по истории диалога («email Иванова, директора продаж»), и только потом парафразит.

Обычный query expansion. Просто сделанный аккуратно.

## Чанки и перестановка

Статьи режем по заголовкам markdown, дальше — по 300 слов с перекрытием 75. На каждый чанк — dense + sparse вектор BGE-M3.

4B-модели мешает «lost in the middle»: в длинном контексте середина выпадает из внимания. Два трюка:

- **Перестановка.** Самый релевантный чанк уходит в конец, ближе к вопросу.
- **Приоритезация.** Модели прямо сказано, где в списке важное.

Отраслевой сленг — через словарь синонимов (`synonyms.json`). Без дообучения. Просто «почта / ящик / мыло → email».

## Диалог

— Какие ништяки положены?

— ДМС, фитнес, обучение. Раздел «Льготы и бонусы».

— Как оформить тачку для поездки?

— Командировка. Регламент «Транспортная политика», по шагам.

На следующей неделе включаем на живых пользователях. «Ништяки» модель выучила. Что из остального корпоративного диалекта окажется для неё непереводимым — узнаем в понедельник.