🧠NAS как ИИ-сервер
📚
Фаза 8 · RAGГодится

Поиск по документам (RAG)

«Что там было в договоре про сроки?» Чтобы LLM отвечала по твоим документам, а не по памяти, нужны две вещи. Поиск находит нужные куски, а модель отвечает по ним. Проверили обе части на русской Википедии.

Берём bge-m3 для поиска, Qwen3.5-4B для ответов — 83% верно, ~6 секунд на вопрос
Сухие цифры и методика →

RAG — это «поиск + ответ». Документы заранее режут на фрагменты, и для каждого считают вектор-«смысл» (эмбеддинг). На вопрос система находит самые близкие по смыслу фрагменты и подсовывает их LLM: «ответь по этому тексту». Мы проверили, какие модели лучше ищут по-русски и насколько хорошо Qwen3.5-4B отвечает по найденному.

99.3%нужный абзац попал в топ-3
83%верных ответов по найденному
4%без документов — модель гадает
~6 сна ответ

Как это выглядит

Кто больше записал на свой счет мешков в команде в этом сезоне?

правильный ответ: Кейван Шорт

без документовДанные не предоставлены
по найденному (топ-3)Кейван Шорт
по правильному абзацуКейван Шорт

Сколько перехватов приписывают защите Пэнтерс в 2015 году?

правильный ответ: 24

без документов12
по найденному (топ-3)24
по правильному абзацу24

Сколько очков уступила защита Пэнтерс?

правильный ответ: 308

без документов10
по найденному (топ-3)308 очков
по правильному абзацу308 очков

Сколько лет было Пейтону Мэннингу, когда он играл в Суперкубке 50?

правильный ответ: 39

без документов28
по найденному (топ-3)В тексте нет информации о возрасте Пейтона Мэннинга на момент игры в Суперкубке 50
по правильному абзацуВ тексте нет информации о том, сколько лет было Пейтону Мэннингу, когда он играл в Суперкубке 50

Без документов модель честно гадает (или нечестно — «12 перехватов» вместо 24). С документами отвечает точно. Слабое место видно в последнем примере: возраст надо вычислить из даты рождения, а модель предпочитает сказать «в тексте нет информации».

300 вопросов по статьям Википедии. «Верно» — с точностью до окончаний: «308 очков» и «308» засчитываются оба.

Поиск почти ничего не теряет: по трём найденным абзацам модель отвечает верно в 83% случаев, по заведомо правильному — в 87%. Разница — это вопросы, где нужный абзац нашёлся, но не первым, и модель отвлеклась на соседние.

Какой поиск взять

Qwen3-Embedding на большом корпусе MIRACL не досчитали: за 3 часа индекс не успел построиться.

bge-m3 ищет лучше всех на большом корпусе. EmbeddingGemma-300M отстаёт на 4 пункта, но вдвое быстрее индексирует. На маленьком XQuAD все модели почти одинаковые: найти нужный абзац среди 240 легко.

Сколько это займёт

Сам поиск мгновенный: 50–120 мс на запрос. Время уходит на индексацию — каждый фрагмент нужно один раз прогнать через модель.

Посчитано по измеренной скорости: делим 50 тысяч фрагментов на «фрагментов в секунду». Индекс строится один раз, потом дописываются только новые документы.

На практике

10 тысяч страниц документов — это ночь работы bge-m3 (~2.5 часа) или пара часов EmbeddingGemma-300M. Делается один раз, дальше дописываются только новые документы.

Qwen3-Embedding здесь не годится

На бумаге Qwen3-Embedding-4B лучший, но на этом iGPU он индексирует 0.4 фрагмента в секунду. 50 тысяч фрагментов — это полтора дня. Большой корпус MIRACL он за 3 часа не осилил.

А реранкер?

Реранкер — вторая модель, которая внимательно перечитывает найденные фрагменты попарно с вопросом и пересортировывает их точнее.

MIRACL, 200 вопросов: реранкер пересортировывает 20 лучших фрагментов от bge-m3. В подписи — время на вопрос.

bge-reranker-v2-m3 действительно чаще ставит нужное первым: nDCG@10 88.1 вместо 84.3. Но цена кусается — 8.6 секунды на каждый вопрос, больше, чем сам ответ LLM. А для RAG по трём фрагментам выигрыш почти незаметен: нужный абзац и так попадает в топ-3 в 99% случаев. Qwen3-Reranker-0.6B не помог вовсе и работает ещё медленнее.

Вывод

Для домашнего RAG реранкер не нужен. Он имеет смысл, если важно, чтобы самый правильный документ оказался именно первым в выдаче, например в поиске для человека, а не для LLM. Тогда лучше пересортировывать топ-10, а не топ-20: так вдвое быстрее.

Ограничения