Архив рубрики ~Лента новостей~

Инженерное вскрытие RAG — почему векторный поиск слеп и как мы починили его старыми алгоритмами

Инженерное вскрытие RAG — почему векторный поиск слеп и как мы починили его старыми алгоритмами
Инженерное вскрытие RAG — почему векторный поиск слеп и как мы починили его старыми алгоритмами

В сентябре прошлого года на внутреннем аудите базы документации по радиоэлектронике произошел показательный сбой.

Инженер ввел запрос: «Рабочий ток срабатывания варистора СН2-1А при 430 вольтах».

Система на базе ChromaDB и флагманской модели эмбеддингов выдала уверенный ответ: «Рабочий ток составляет 25 ампер, время срабатывания 15 наносекунд». Прибор с такими параметрами сгорел бы на стенде за две секунды.

Когда мы заглянули в поисковую выдачу по служебным инструкциям, выяснилось: реальная таблица с характеристиками варистора СН2-1А получила от векторной базы смехотворный скор 0.61 и осталась на 48-м месте. А на первое место с оценкой 0.86 вылез кусок описания мощного промышленного разрядника Р-27 просто потому, что в нем семь раз встречались слова «ток», «напряжение», «защита» и «срабатывание».

Большие векторные модели не умеют искать точные технические данные. Они ищут похожие по настроению и теме тексты.

Кстати, если вы хотите протестировать все самые свежие модели уровня Claude Sonnet 5, GPT-5.6 или Gemini 3 в одном удобном месте и сравнить их ответы без костылей с иностранными картами — на платформе SYNTX.AI это можно сделать за пару кликов.

По промокоду NEIROSKUF дадут 15% скидку на все тарифы.

Ниже подробный разбор того, почему геометрия многомерных пространств проваливается на артикулах, и как связка из алгоритма 1994 года и тяжелого реранкера полностью убирает галлюцинации из поиска.

Геометрический парадокс: почему косинусное сходство врёт

Чтобы понять причину сбоя, нужно посмотреть, как устроен Bi-Encoder.

Модель эмбеддингов берет текст из двухсот слов и сжимает его в одну точку в пространстве из 1024 измерений. В этом пространстве направление вектора задается общим смысловым полем документа.

Если в документе много слов об электробезопасности, реле и трансформаторах, вектор документа улетает в кластер «электротехника». Когда пользователь задает вопрос, вектор вопроса летит в тот же самый кластер.

Но маркировка детали «СН2-1А» для модели эмбеддингов — это просто редкая последовательность из трех субтокенов. Она весит меньше одного процента от общей длины вектора. Векторное пространство проглатывает эту деталь: документ с похожими рассуждениями об электричестве, но с другой деталью внутри, оказывается к вопросу ближе, чем сухая табличная строчка с точным артикулом.

Плотный векторный поиск принципиально не различает «Договор 48-А» и «Договор 48-Б», «ГОСТ 12.1.004» и «ГОСТ 12.1.005», «винт М3» и «винт М8». Для геометрии векторов это статистический шум.

Реабилитация классики: зачем ИИ нужен алгоритм BM25

Когда в 2023 году все бросились строить векторные базы, индустрия выбросила на свалку тридцать лет наработок классического информационного поиска. И совершенно зря.

Алгоритм BM25 (Best Matching 25), разработанный еще в девяностые годы, работает на базе инвертированного индекса. Ему плевать на семантику и философский контекст. Он считает точные совпадения редких слов.

Если пользователь спросил про «СН2-1А», BM25 мгновенно понимает, что токен «СН2-1А» встречается во всей базе из ста тысяч страниц ровно два раза. Это придает документу гигантский вес по шкале IDF (Inverse Document Frequency).

Идеальный первый шаг поиска — не выбирать между смыслом и ключевыми словами, а запускать их параллельно.

Мы поднимаем два независимых поисковых движка: BM25 для вылова точных артикулов и дат, и плотные эмбеддинги для понимания синонимов и перефразировок.

Результаты объединяются через алгоритм слияния рангов (Reciprocal Rank Fusion):

RRF_score = (1 / (60 + позиция_в_BM25)) + (1 / (60 + позиция_в_векторах))

Если документ попал в верхние строчки обоих списков, его финальный балл взлетает. Если он найден только по точному артикулу через BM25, он все равно гарантированно попадает в топ-20 кандидатов.

Тяжелая артиллерия: Cross-Encoder против Bi-Encoder

После первого этапа у нас на руках оказывается двадцать разношерстных кандидатов. Доверять их языковой модели еще нельзя: среди них полно мусора.

Здесь вступает модель второго уровня — Cross-Encoder (например, bge-reranker-v2-m3).

В отличие от модели эмбеддингов, Cross-Encoder не сжимает тексты в отдельные векторы. Он принимает на вход склеенную строку [Вопрос] + [Кандидат] и прогоняет их через механизм полного внимания трансформера одновременно.

Каждый токен вопроса напрямую сопоставляется с каждым токеном документа. Реранкер видит, что в вопросе запрошен ток «при 430 вольтах», а в кандидате указано «при 220 вольтах», и мгновенно штрафует этот кусок, опуская его в подвал рейтинга.

Прогнать всю базу через Cross-Encoder невозможно: это потребовало бы часов вычислений на каждый запрос. Но переранжировать двадцать кандидатов занимает всего 35 миллисекунд.

Ампутация контекста: как правильный чанкинг спасает таблицы

Даже идеальный гибридный поиск выдаст кашу, если документ нарезан на куски по количеству символов.

Если разрезать PDF-файл посередине таблицы, кусок превращается в бессмысленный набор цифр: «250 | 5 | 120 | Да». Поиск найдет этот кусок, но модель не поймет, к какой колонке относится каждое число.

Мы внедрили метод связанных родительских контекстов (Parent-Child Indexing).

Документ нарезается на два слоя:

  • Дочерние микро-фрагменты (150 токенов): используются только для поисковых индексов BM25 и векторной базы.
  • Родительские смысловые блоки (800-1200 токенов): содержат таблицу целиком вместе с заголовком главы и пояснениями.

Когда поиск находит совпадение в маленьком дочернем фрагменте, в промпт модели отдается не огрызок строки, а родительский блок целиком. Модель видит шапку таблицы, единицы измерения и ограничения.

Живой замер в консоли: наивный RAG против гибридного конвейера

Вот реальный прогон на тестовом запросе по каталогу компонентов: «Укажи артикул и напряжение варистора СН2-1А».

import numpy as np from rank_bm25 import BM25Okapi from sentence_transformers import SentenceTransformer, CrossEncoder # База документов corpus = [ "Разрядник промышленный Р-27. Рабочее напряжение 380В. Обеспечивает защиту от импульсных перенапряжений.", "Варисторы оксидно-цинковые. Общие технические условия и правила монтажа в распределительные щиты.", "Паспорт изделия: Варистор СН2-1А. Классификационное напряжение 430В, артикул ЭЛ-8924. Допуск 10%.", "Техника безопасности при обслуживании высоковольтных варисторов и разрядных устройств подстанций." ] # 1. Индексация BM25 tokenized_corpus = [doc.lower().split() for doc in corpus] bm25 = BM25Okapi(tokenized_corpus) # 2. Индексация Dense dense_model = SentenceTransformer("BAAI/bge-m3") doc_embeddings = dense_model.encode(corpus, normalize_embeddings=True) # 3. Реранкер reranker = CrossEncoder("BAAI/bge-reranker-v2-m3") query = "Укажи артикул и напряжение варистора СН2-1А" # Прогон 1: Наивный векторный поиск q_vec = dense_model.encode(query, normalize_embeddings=True) dense_scores = np.dot(doc_embeddings, q_vec) naive_top1 = corpus[np.argmax(dense_scores)] # Прогон 2: Гибридный конвейер (BM25 + Dense + Cross-Encoder) bm25_ranks = np.argsort(bm25.get_scores(query.lower().split()))[::-1] dense_ranks = np.argsort(dense_scores)[::-1] # Слияние RRF rrf = {i: 0.0 for i in range(len(corpus))} for r, idx in enumerate(bm25_ranks): rrf[idx] += 1.0 / (60.0 + r + 1) for r, idx in enumerate(dense_ranks): rrf[idx] += 1.0 / (60.0 + r + 1) candidates = sorted(rrf.keys(), key=lambda x: rrf[x], reverse=True)[:3] pairs = [[query, corpus[i]] for i in candidates] rerank_scores = reranker.predict(pairs) hybrid_top1 = corpus[candidates[np.argmax(rerank_scores)]] print("— НАИВНЫЙ ВЕКТОРНЫЙ ПОИСК (ТОП-1) —") print(naive_top1) print("n— ГИБРИДНЫЙ ПОИСК + РЕРАНКЕР (ТОП-1) —") print(hybrid_top1)

Вывод в консоли:

— НАИВНЫЙ ВЕКТОРНЫЙ ПОИСК (ТОП-1) — Варисторы оксидно-цинковые. Общие технические условия и правила монтажа в распределительные щиты. — ГИБРИДНЫЙ ПОИСК + РЕРАНКЕР (ТОП-1) — Паспорт изделия: Варистор СН2-1А. Классификационное напряжение 430В, артикул ЭЛ-8924. Допуск 10%.

Наивный поиск подсунул общую воду без конкретных цифр, из-за чего языковая модель полезла придумывать параметры.

Гибридный пайплайн с первой попытки положил в контекст точный паспорт изделия с нужным артикулом ЭЛ-8924 и напряжением 430В.

Векторные базы отлично подходят для поиска похожих картинок или рекомендаций музыки.

Но когда речь заходит о чертежах, артикулах деталей, договорах и финансовых таблицах, слепая вера в косинусное расстояние гарантированно ведет к галлюцинациям. Старый добрый обратный индекс и точечный Cross-Encoder решают проблему за сорок миллисекунд без переобучения моделей.

Инженерное вскрытие RAG - почему векторный поиск слеп и как мы починили его старыми алгоритмами
1telegram.metelegram.me

Источник: vc.ru

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Архив рубрики ~Коротко из Telegram~ Anthropic объявила о повышении лимитов Claude… которое на самом деле… Архив рубрики ~Коротко из Telegram~ ✔️ Twitch добавил опцию отказа от обучения ИИ на контенте… Архив рубрики ~Коротко из Telegram~ Вышла версия GLM-5.3 Flash без цензуры На Hugging Face появилась… Архив рубрики ~Коротко из Telegram~ Palantir запатентовала автономную войну: от обнаружения до удара без человека… Новости робототехники Сообщается: Nvidia приобретет репозиторий моделей ИИ Hugging Face за 13 миллиардов долларов. Новости робототехники США возводят барьеры против беспилотников и роботов, но Китай обладает достаточными масштабами, чтобы их обойти. Архив рубрики ~Коротко из Telegram~ ❗️ Web-прокси для Телеграма появилось в Android-версии — это полный… Архив рубрики ~Коротко из Telegram~ Huawei решила проблему ОГРОМНЫХ смартфонов — теперь интерфейс сам тянется… Новости робототехники Не верь чувствам своим Роботу можно внушить фантомное прикосновение, не… Архив рубрики ~Коротко из Telegram~ 💻 Cursor убрал последний барьер Раньше чтобы работать с Cloud… Архив рубрики ~Коротко из Telegram~ С 1 сентября 2026 года крупнейшие банки должны предоставить своим… Архив рубрики ~Коротко из Telegram~ С 1 сентября 2026 года в отели с фондом от… Архив рубрики ~Коротко из Telegram~ OpenAI представила первые результаты тестирования собственного ASIC-чипа Jalapeño, разработанного специально… Архив рубрики ~Коротко из Telegram~ Локальная ИИ-студия для музыки — бесплатная альтернатива Suno Pinokio представил… Архив рубрики ~Коротко из Telegram~ Anthropic объявила о повышении лимитов Claude… которое на самом деле… Архив рубрики ~Коротко из Telegram~ ✔️ Twitch добавил опцию отказа от обучения ИИ на контенте… Архив рубрики ~Коротко из Telegram~ Вышла версия GLM-5.3 Flash без цензуры На Hugging Face появилась… Архив рубрики ~Коротко из Telegram~ Palantir запатентовала автономную войну: от обнаружения до удара без человека… Новости робототехники Сообщается: Nvidia приобретет репозиторий моделей ИИ Hugging Face за 13 миллиардов долларов. Новости робототехники США возводят барьеры против беспилотников и роботов, но Китай обладает достаточными масштабами, чтобы их обойти. Архив рубрики ~Коротко из Telegram~ ❗️ Web-прокси для Телеграма появилось в Android-версии — это полный… Архив рубрики ~Коротко из Telegram~ Huawei решила проблему ОГРОМНЫХ смартфонов — теперь интерфейс сам тянется… Новости робототехники Не верь чувствам своим Роботу можно внушить фантомное прикосновение, не… Архив рубрики ~Коротко из Telegram~ 💻 Cursor убрал последний барьер Раньше чтобы работать с Cloud… Архив рубрики ~Коротко из Telegram~ С 1 сентября 2026 года крупнейшие банки должны предоставить своим… Архив рубрики ~Коротко из Telegram~ С 1 сентября 2026 года в отели с фондом от… Архив рубрики ~Коротко из Telegram~ OpenAI представила первые результаты тестирования собственного ASIC-чипа Jalapeño, разработанного специально… Архив рубрики ~Коротко из Telegram~ Локальная ИИ-студия для музыки — бесплатная альтернатива Suno Pinokio представил…

Оставить комментарий