3,583 papers
arXiv:2512.12694 74 14 дек. 2025 г. FREE

Hybrid RAG: расширение запроса и строгие constraints для работы с зашумлёнными источниками

КЛЮЧЕВАЯ СУТЬ
Поиск по зашумлённым документам хрупок: ищешь «электронная коммерция» — в тексте «онлайн-ритейл», OCR превратил «рост» в «ро@т». Один запрос = один шанс промахнуться. Метод позволяет находить информацию даже через OCR-ошибки, архаизмы и вариации терминов — особенно в исторических архивах, сканах документов, старых отчётах. Фишка: не бороться с шумом напрямую, а размножить запрос. LLM генерирует 5 вариаций (синонимы, архаизмы, переформулировки) → ищешь по каждой → собираешь контекст → генерируешь ответ с жёсткими constraints («только из источников», явный отказ если данных нет). Один промах не роняет систему — если «Первая мировая» не нашла, «Великая война» или «мировой конфликт 1914-1918» вытянут.
Адаптировать под запрос

TL;DR

Исследователи создали RAG-систему для исторических газет с OCR-ошибками и устаревшей орфографией. Проблема: стандартный поиск по таким текстам проваливается — современный запрос "Первая мировая война" не находит архивную статью с текстом "Вѣликая Война" или "Borld W@r" (OCR-мусор). Система комбинирует расширение запроса через LLM (генерирует 5 вариаций: синонимы, архаизмы, переформулировки) и строгий промпт для генерации ответа (только из источников, явный отказ если данных нет).

Главная находка: расширение запроса через вариации смягчает провалы поиска. Если один вариант запроса промахнулся из-за OCR-шума, другие вытягивают релевантные документы. В чистом виде эта RAG-система требует векторные базы и код, но два принципа применимы в чате: (1) генерируй несколько формулировок запроса перед поиском по документам, (2) используй жёсткие constraints в промпте при работе с источниками — "только из контекста" и "откажись если нет данных".

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


🔬

Схема метода (оригинальная система)

ФАЗА 1: Расширение запроса

Запрос пользователя 
→ LLM генерирует 5 вариаций (синонимы, архаизмы, переформулировки)
→ Получаем 6 версий запроса (оригинал + 5 вариаций)

ФАЗА 2: Поиск (требует RAG-инфраструктуру)

6 запросов → параллельный поиск по векторной базе
→ Fusion результатов через Reciprocal Rank Fusion
→ Топ-K релевантных документов

ФАЗА 3: Генерация с constraints

Структурированный контекст (документы + метаданные + разделители)
→ Промпт с жёсткими constraints
→ Ответ (только из источников) ИЛИ отказ

🚀

Пример применения

Задача: Готовишь аналитическую записку для клиента. У тебя 15 PDF-сканов отраслевых отчётов — качество среднее, OCR накосячил, термины менялись ("электронная коммерция" → "e-commerce" → "онлайн-торговля"). Нужно найти данные по динамике рынка 2019-2023.

Промпт (шаг 1 — расширение запроса):

Переформулируй этот запрос 5 способами для поиска в отраслевых отчётах 2019-2023. Используй разные термины, синонимы, аббревиатуры:

"Какая была динамика роста рынка электронной коммерции в России 2019-2023?"

Требования:
- Сохраняй смысл
- Варьируй термины (e-commerce, онлайн-торговля, интернет-ритейл)
- Краткость
- По одной строке
- Без нумерации

Результат (шаг 1): Модель выдаст 5 вариаций — разные синонимы, аббревиатуры, формулировки. Дальше ты вручную ищешь по каждой вариации в своих документах (Cmd+F в PDF или через поиск по загруженным файлам в Claude). Собираешь найденные фрагменты.

Промпт (шаг 2 — генерация с constraints):

Ты эксперт по отраслевой аналитике. Ответь на вопрос используя ИСКЛЮЧИТЕЛЬНО информацию из предоставленных ниже отчётов.

Отчёты:
[вставить найденные фрагменты с указанием источника]

Вопрос: Какая была динамика роста рынка электронной коммерции в России 2019-2023?

Ограничения:
- Не используй внешние знания и не делай предположений.
- Если информации недостаточно, напиши: "Не могу ответить на вопрос только на основе предоставленной информации."
- Проверяй, что извлечённые данные относятся именно к основному событию вопроса.
- Если упоминаешь актёров/компании, убедись что их связь явно описана в отчётах.
- Не ссылайся на себя как на "AI модель".

Результат (шаг 2): Модель выдаст структурированный ответ с данными по динамике, ссылаясь только на предоставленные фрагменты. Если данных нет — явно откажется. Не додумает цифры.


🧠

Почему это работает

Слабость LLM: Поиск по ключевым словам хрупок к вариациям терминологии и шуму. Если в документе написано "онлайн-ритейл", а ты ищешь "электронная коммерция" — не найдёшь. OCR-ошибки усугубляют: "рост" → "ро@т". Одна формулировка запроса = одна точка отказа.

Сильная сторона LLM: Модель отлично генерирует семантически эквивалентные вариации текста — синонимы, переформулировки, архаизмы, аббревиатуры. Она понимает что "Первая мировая" = "Великая война" = "WWI" = "мировой конфликт 1914-1918". Также модель умеет строго следовать constraints — если явно запретить выходить за рамки источников и дать формулировку отказа, она будет отказываться вместо выдумывания.

Как метод использует это: Расширение запроса размножает точки входа — 6 разных формулировок = 6 шансов найти релевантный текст даже через OCR-шум и вариации терминов. Один промах не роняет всю систему. Промпт с жёсткими constraints превращает генерацию в пересказ, блокируя параметрическую память модели. Explicit abstention clause даёт модели "выход" — не додумывать, а отказаться.

Рычаги управления:

  • Количество вариаций (5 в исследовании) → уменьши до 3 для простых задач, увеличь до 7-10 если терминология очень вариативна
  • Типы вариаций → добавь в инструкцию "с опечатками" или "на другом языке" если ожидаешь такой шум
  • Abstention clause → убери если хочешь чтобы модель пыталась выдать хоть что-то, оставь если критична точность
  • "Без внешних знаний" → замени на "используй и контекст и свои знания" если хочешь дополнений, а не чистого пересказа

📋

Шаблон промпта

Шаг 1: Расширение запроса

Переформулируй следующий вопрос {num_variations} разными способами для поиска в {тип_источников}.

Ограничения:
- Сохраняй исходный смысл
- Будь лаконичен
- Одна переформулировка на строку
- Не нумеруй переформулировки

Вопрос: {исходный_запрос}

Переформулировки:

Где: - {num_variations} — количество вариаций (обычно 3-5) - {тип_источников} — описание где ищешь ("исторические архивы", "отраслевые отчёты", "сканы документов") - {исходный_запрос} — твой вопрос

Шаг 2: Генерация с constraints

Ты эксперт по {домен}. Ответь на вопрос используя ИСКЛЮЧИТЕЛЬНО информацию из предоставленных ниже источников.

Источники:
{контекст}

Вопрос: {запрос}

Ограничения:
- Не используй внешние знания и не делай предположений.
- Если информации недостаточно, напиши: "Не могу ответить на вопрос только на основе предоставленной информации."
- Проверяй, что извлечённые данные относятся именно к основному событию вопроса, исключая упомянутые вскользь, если причинная связь не явная.
- Если упоминаешь актёров/компании/события, убедись что их связь явно описана в источниках.
- Не ссылайся на себя как на "AI модель".
- Следствие — это результат, происходящий ПОСЛЕ события. Событие-причина — не следствие.

Ответ:

Где: - {домен} — твоя область ("история", "финансы", "маркетинг") - {контекст} — найденные фрагменты с указанием источников - {запрос} — исходный вопрос


🚀 Быстрый старт — вставь в чат:

Вот шаблон для работы с зашумлёнными источниками через расширение запроса. Адаптируй под мою задачу: [опиши задачу и тип источников].

Задавай вопросы, чтобы заполнить поля.

[вставить оба шаблона выше]

Модель спросит: какой запрос расширить, сколько вариаций нужно, какой тип источников, какой домен экспертизы. Это нужно чтобы настроить генерацию вариаций под твою терминологию и контекст, а промпт для генерации — под твою роль и требования к точности.


⚠️

Ограничения

⚠️ Требует RAG-инфраструктуру для полной реализации: Оригинальная система использует векторные базы, embedding models, Reciprocal Rank Fusion — это всё требует код. В чате применимы только два элемента: расширение запроса и структурированный промпт для генерации.

⚠️ Query expansion не заменит качественный поиск: Вариации запроса помогают против шума, но не творят чудеса. Если OCR полностью уничтожил ключевые слова или источники не содержат информации — расширение не поможет. Это смягчение провалов, не их устранение.

⚠️ Ручной workflow: Без RAG-системы придётся вручную искать по каждой вариации запроса (Cmd+F в документах или поиск в чате по загруженным файлам), затем собирать контекст для второго промпта. Это работает, но трудозатратно при большом объёме источников.

⚠️ Abstention не всегда срабатывает: Несмотря на явную инструкцию отказываться, модели иногда всё равно пытаются выдать ответ на основе параметрической памяти. Чем сильнее модель "знает" ответ из обучающих данных, тем выше риск, что проигнорирует constraint. Проверяй output на соответствие источникам.


🔍

Как исследовали

Команда из французских университетов взяла MIRACL dataset — 689 тысяч текстовых чанков на французском и английском из Википедии с размеченной релевантностью. Это НЕ настоящие исторические газеты с OCR-ошибками (использовали как прокси для многоязычности и вариаций терминологии). Протестировали три компонента раздельно:

1. NER-модели (4 штуки) — сравнивали по скорости, количеству найденных сущностей и синтаксической релевантности (извлекают ли полные слова или фрагменты вроде "##iste allemand"). Победила wikineural — баланс скорости и качества, выдаёт чистые entities без мусора.

2. Embedding модели (5 штук) — мерили Top-5 similarity rate (сколько из топ-5 результатов релевантны), confidence drop (разрыв между 1-м и 2-м результатом) и время индексации. E5-модели обошли всех (>90% Top-5 rate), но SFR-Embedding-Mistral и linq-embed-mistral оказались в 17-50 раз медленнее при сопоставимом качестве. Выбрали multilingual-e5-large — лучший Top-5 rate (91.34%) при приемлемой скорости и структуре латентного пространства (кластеры семантически разделены).

3. Hybrid retrieval — сравнивали single-query (один запрос) vs multi-query + RRF (5 вариаций + fusion). Multi-query показал более стабильный recall — если одна формулировка промазала, другие вытянули. RRF сгладил разброс производительности между запросами.

Интересная находка: Модель bert-base-historical-multilingual-cased, специально обученная на исторических текстах, ПРОИГРАЛА обычному bert-base-multilingual-cased по качеству NER. Доменная предтренировка без явной оптимизации под задачу не гарантирует выигрыш — иногда создаёт дополнительный оверхед без роста точности.

Логика результатов: Query expansion работает потому что размножает шансы на попадание — каждая вариация ищет своим путём, fusion объединяет. Один промах не роняет recall. Structured prompting работает потому что explicit constraints блокируют параметрическую память — модель не додумывает, следует инструкциям. Abstention clause даёт "легальный выход" — отказаться лучше чем соврать.


💡

Адаптации и экстраполяции

🔧 Техника: Расширение для визуального контента → улучшенный поиск изображений

Оригинальное исследование расширяло текстовые запросы. Тот же принцип применим к поиску изображений в большой библиотеке (скриншоты, фото продуктов, референсы). Генерируешь 5 вариаций описания изображения (разные углы, детали, термины), затем ищешь по каждой. Особенно полезно если названия файлов неинформативны или метаданные зашумлены.

Опиши это изображение 5 способами для поиска похожих в библиотеке:
- С акцентом на композицию
- С акцентом на цветовую гамму
- С акцентом на объекты/элементы
- С акцентом на стиль/настроение
- Краткое техническое описание

[загрузить изображение]

🔧 Техника: Убрать "без внешних знаний" → режим дополнения и контекста

Если нужно дополнить фрагментарные источники, замени constraint. Вместо "только из контекста" → "используй контекст как основу, дополни своими знаниями там где контекст неполон, явно помечай дополнения". Получишь полный ответ с разметкой что из источников, что додумано.

Ограничения:
- Используй предоставленные источники как основу
- Если информация неполная, дополни из общих знаний, но ЯВНО ПОМЕТЬ: "[Дополнение]"
- Разделяй факты из источников и общеизвестную информацию

🔧 Техника: Комбинация с Chain-of-Thought → прозрачная верификация

Добавь CoT перед генерацией ответа: модель сначала выписывает все релевантные фрагменты из источников, затем генерирует ответ. Видишь КАК она пришла к выводу, легче проверить на галлюцинации.

Шаг 1: Выпиши все фрагменты из источников, релевантные вопросу.
Шаг 2: На основе ТОЛЬКО этих фрагментов сформулируй ответ.
Шаг 3: Если фрагментов недостаточно — напиши: "Не могу ответить..."

🔗

Ресурсы

Hybrid Retrieval-Augmented Generation for Robust Multilingual Document Question Answering

Код: https://anonymous.4open.science/r/RAGs-C5AE/

Anthony Mudet (L3i-lab, La Rochelle Université), Souhail Bakkali (IRISA, Univ Rennes, CNRS)


📋 Дайджест исследования

Ключевая суть

Поиск по зашумлённым документам хрупок: ищешь «электронная коммерция» — в тексте «онлайн-ритейл», OCR превратил «рост» в «ро@т». Один запрос = один шанс промахнуться. Метод позволяет находить информацию даже через OCR-ошибки, архаизмы и вариации терминов — особенно в исторических архивах, сканах документов, старых отчётах. Фишка: не бороться с шумом напрямую, а размножить запрос. LLM генерирует 5 вариаций (синонимы, архаизмы, переформулировки) → ищешь по каждой → собираешь контекст → генерируешь ответ с жёсткими constraints («только из источников», явный отказ если данных нет). Один промах не роняет систему — если «Первая мировая» не нашла, «Великая война» или «мировой конфликт 1914-1918» вытянут.

Принцип работы

Не «один запрос — один шанс», а «6 формулировок — 6 точек входа». Размножаешь способы спросить одно и то же — модель генерирует вариации с разными терминами, синонимами, аббревиатурами. Ищешь по каждой вариации. Если прямой запрос промахнулся из-за OCR-мусора («Borld W@r»), другие формулировки («конфликт 1914-1918», «Великая война», «WWI») найдут релевантные фрагменты. Затем собираешь найденное в контекст и генерируешь ответ со строгими constraints — модель пересказывает только источники или явно отказывается.

Почему работает

Поиск по ключевым словам = одна точка отказа. Вариация термина или OCR-ошибка — и система слепа. LLM хорошо понимает семантическую эквивалентность: «e-commerce» = «электронная коммерция» = «онлайн-торговля» = «интернет-ритейл». Расширение запроса создаёт избыточность — если один вариант проваливается, другие вытягивают релевантные документы. Это не идеальное решение против шума, но смягчает провалы. Жёсткие constraints в промпте («не используй внешние знания», «откажись если данных нет») блокируют параметрическую память модели — она пересказывает источники, а не выдумывает. Explicit abstention clause даёт «выход» — не додумывать, а честно сказать «не знаю».

Когда применять

Для работы с зашумлёнными или устаревшими источниками → конкретно для поиска информации в сканах документов, исторических архивах, отраслевых отчётах с OCR-ошибками, старых текстах с архаичной орфографией — особенно когда прямой поиск по ключевым словам не работает из-за вариаций терминологии. Также для строгой фактчек-генерации, когда критична точность — модель не додумывает, только пересказывает источники или отказывается. НЕ подходит если источники вообще не содержат информации — расширение запроса не создаёт данные из ничего, только смягчает провалы поиска.

Мини-рецепт

1. Размножь запрос: Попроси модель переформулировать вопрос 3-5 способами — разные синонимы, архаизмы, аббревиатуры. Пример: Переформулируй 5 способами для поиска в отраслевых отчётах: «динамика рынка электронной коммерции 2019-2023». Используй синонимы (e-commerce, онлайн-торговля, интернет-ритейл). Одна строка на вариацию.

2. Ищи по каждой вариации: Бери оригинальный запрос + 5 вариаций, ищи в документах по каждой формулировке (Cmd+F в PDF или через поиск в чате по загруженным файлам). Собирай найденные фрагменты с указанием источника.

3. Генерируй со строгими constraints: Дай модели найденные фрагменты + жёсткие ограничения. Пример: Ответь используя ИСКЛЮЧИТЕЛЬНО информацию ниже. Не используй внешние знания. Если информации недостаточно, напиши: "Не могу ответить только на основе предоставленной информации." [вставить контекст] — модель пересказывает источники или явно отказывается.

Примеры

[ПЛОХО] : Найди данные по динамике рынка электронной коммерции в России 2019-2023 в документе с OCR-ошибками где термин записан как «онлайн-ритейл» и «e-comm@rce» — поиск по одной формулировке промахнётся.
[ХОРОШО] : Переформулируй 5 способами: «динамика рынка электронной коммерции 2019-2023». Вариации: e-commerce, онлайн-торговля, интернет-ритейл, цифровая торговля, электронный ритейл → ищешь по каждой → находишь через «онлайн-торговля» несмотря на OCR-мусор в других местах → собираешь контекст → Ответь используя ТОЛЬКО эти фрагменты. Если данных нет, откажись явно: [контекст с источниками] → модель пересказывает найденное или отказывается, не додумывает цифры.
Источник: Hybrid Retrieval-Augmented Generation for Robust Multilingual Document Question Answering
ArXiv ID: 2512.12694 | Сгенерировано: 2026-01-08 23:05
📖 Простыми словами

Hybrid RAG: расширение запроса и строгие constraints для работы с зашумлёнными источниками

arXiv: 2512.12694

Суть проблемы в том, что обычный поиск — это тупой сопоставитель букв. Если ты ищешь «Первую мировую», а в старой газете написано «Великая война» или вообще какой-нибудь «Вѣликая» с ятями, система тебя проигнорирует. Для нейронок это еще хуже: если при сканировании документа буква «о» превратилась в «@», стандартный алгоритм решит, что это мусорный код, а не ценная информация. В итоге база знаний превращается в кладбище данных, которые там лежат, но их никто не может достать.

Это как пытаться найти книгу в библиотеке, где пьяный библиотекарь перепутал все обложки и половину названий написал с ошибками. Ты просишь «учебник по химии», а он лежит под табличкой «х#мия». Формально книга есть, но для тебя она не существует, потому что твой запрос не совпал с тем бредом, который написан на корешке. Ты уходишь ни с чем, хотя решение проблемы было в двух метрах от тебя.

Чтобы этот хаос заработал, исследователи внедрили гибридный RAG с расширением запроса. Работает это так: когда ты спрашиваешь про «рост продаж», LLM не бежит сразу в базу, а сначала генерирует 5 вариаций вопроса. Она додумывает синонимы, архаизмы и даже возможные опечатки вроде «р@ст». Вторая фишка — жесткий фильтр генерации: модель заставляют отвечать строго по найденным кускам текста. Если в источнике данных нет или там совсем нечитаемый мусор, она честно говорит «я не знаю», вместо того чтобы начать вдохновенно галлюцинировать.

Тестировали это на древних газетах с ужасным качеством скана, но принцип универсален. Это спасение для любого бизнеса, где архивы хранятся в кривых PDF-сканах, или где терминология меняется каждые три года. Сегодня ты ищешь «маркетплейсы», завтра «e-com», а в документах десятилетней давности это вообще «дистанционная торговля». Мультиязычность и устойчивость к шуму позволяют системе видеть смысл там, где обычный поиск видит только набор сломанных символов.

Короче: один запрос — это всегда точка отказа. Если хочешь, чтобы AI реально находил инфу в реальных (грязных) данных, заставляй его сначала «размножить» твой вопрос на десяток похожих смыслов. Это превращает поиск из лотереи в рабочий инструмент, который не боится ни OCR-мусора, ни устаревших слов. Либо ты учишь систему понимать контекст и ошибки, либо твои корпоративные знания так и останутся мертвым грузом в облаке.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с