Схема RAG-пайплайна с дополнительным шагом парсинга вопроса в структурированные поля

Структурный парсинг вопросов в RAG: как questiondf повышает точность ответов

ИИ-инструменты 5 июля 2026 г.

Сцена: Менеджер продукта открывает дашборд своей RAG‑системы и видит, что ответы на запросы клиентов часто «залипают» в половине предложения или вовсе не дают нужных цифр.

Источник: towardsdatascience.com

Факт: В статье The Untaught Lessons of RAG Question Parsing предлагается вместо простого поиска‑по‑вектору использовать таблицу question_df с пятью типизированными полями (ключевые слова, область, форма, разложение, уточнение) и двумя вспомогательными бриффами (RetrievalQuery, GenerationBrief).

Последствие: Такой подход заставляет систему понимать, что вопрос — это не просто строка‑поиска, а запрос с определённой структурой, что в продакшене уменьшает «тихие» ошибки и повышает точность ответов.

Что проверить: Нужно решить, стоит ли внедрять question_df в ваш pipeline — какой будет выгода, какие ресурсы потребуются и какие риски есть у нового метода.


Что реально даёт репозиторий doc‑intel/notebooks‑vol1

  • Таблица question_df со столбцами keywords, scope, shape, decomposition, clarification.
  • Два бриффа — RetrievalQuery (формирует запрос к векторному хранилищу) и GenerationBrief (передаёт контекст генератору).
  • Контроль окна через столбцы lines_before_anchor и lines_after_anchor, измеряемый в строках — это гораздо точнее, чем ограничение по символам или страницам.
  • Примеры трёх типовых вопросов (факт, да/нет, список) показывают, как меняется размер окна в зависимости от shape и decomposition.

Эти артефакты позволяют построить RAG‑pipeline, где каждый запрос проходит через один дополнительный «кирпич» — парсинг вопроса — и только потом ищет релевантные куски текста.


Где это вписывается в ваш текущий AI‑процесс

Текущий шаг Что делает question_df Как меняется поток
Получение строки от пользователя Строка сразу отправляется в векторный поиск (top‑k). Строка сначала разбирается на пять полей question_df.
Поиск в векторном хранилище Возвращает k самых похожих фрагментов без учёта структуры вопроса. По RetrievalQuery запрашивается только тот диапазон строк, который нужен (например, 2 строки до и 5 строк после якоря).
Генерация ответа LLM получает набор фрагментов и пытается собрать ответ. GenerationBrief передаёт LLM уже отфильтрованный контекст — меньше «шума», больше релевантных данных.
Контроль качества Оценка происходит пост‑фактум, часто с пропущенными ошибками. Параметры shape и decomposition позволяют заранее задать, нужен ли точный числовой ответ или список, что упрощает автоматический контроль.

Таким образом, question_df становится «переходным» звеном между пользовательским запросом и поиском, делая процесс более предсказуемым.


Как протестировать без превращения в «toy‑project»

  1. Выберите один тип вопроса (например, «какова премия по полису X на 01.01.2025?»).
  2. Сформируйте question_df‑строку с ключевыми словами (premium, policy X), область (insurance), формой (exact value), разложением (single‑value) и уточнением (date).
  3. Запустите парсер (скрипт из репозитория) и посмотрите, какие значения попали в lines_before_anchor и lines_after_anchor.
  4. Сравните два результата:
    * Naive — top‑k по вектору без ограничения.
    * Structured — по RetrievalQuery с окном, полученным из question_df.
  5. Оцените метрику «полнота ответа» (получил ли LLM точную цифру без лишних предложений).

Если разница в точности превышает 10 % и время обработки не выросло более чем на 15 %, метод считается готовым к более широкому тестированию.


Какие риски проверить перед внедрением

Риск Как проверить Что делать, если риск подтвердится
Сложность настройки — парсер требует описания 5 полей для каждого типа вопроса. Проведите пилот на 2‑3 типах запросов, измерьте время подготовки question_df. Если время > 2 часов на запрос, сократите набор полей до ключевых (например, keywords + shape).
Зависимость от качества аннотаций — неправильный shape может привести к слишком узкому окну. Сравните ответы с правильным и искажённым shape. Внедрите автоматический валидатор, который проверяет, что lines_before_anchor и lines_after_anchor не отрицательны.
Увеличение нагрузки на векторный поиск — многократные запросы к разным окнам. Замерьте количество запросов к хранилищу в пилоте. При росте > 30 % перейдите к кэшированию RetrievalQuery для часто задаваемых шаблонов.
Сложность интеграции в существующий pipeline — нужен дополнительный слой между UI и поиском. Оцените количество строк кода, которые нужно добавить. Если > 200 строк, рассмотрите вариант «wrapper‑service», который будет скрывать парсинг от основной логики.
Отсутствие поддержки в текущих LLM‑провайдеров — не все модели умеют принимать «брифы». Проверьте, принимает ли ваш LLM GenerationBrief в промпте. Если нет, используйте простую конкатенацию RetrievalQuery + контекст в промпте.

Какое решение принять уже сейчас

  1. Определите цель: нужна ли вам точность > 90 % для конкретных бизнес‑вопросов (например, ценообразование, комплаенс).
  2. Запустите быстрый пилот по одному‑двум типам запросов, используя готовый скрипт из doc‑intel/notebooks‑vol1.
  3. Сравните метрики (полнота, время, количество запросов). Если улучшение ощутимо и затраты приемлемы, планируйте расширение question_df на все типы вопросов.
  4. Закрепите процесс: создайте шаблон question_df в репозитории, обучите команду писать новые строки и автоматизируйте проверку lines_before_anchor/lines_after_anchor.

Если результаты пилота не оправдывают ожиданий, оставьте naive pipeline и продолжайте искать альтернативные способы улучшения качества (например, переподготовка эмбеддингов или файн‑тюнинг LLM).


Практический чек‑лист (что проверить на этой неделе)

  • [ ] Есть ли у вас хотя бы один тип вопроса, где текущий ответ часто неполный?
  • [ ] Скачан ли репозиторий doc‑intel/notebooks‑vol1 и установлен Python с зависимостями?
  • [ ] Сформирована ли question_df‑строка для выбранного вопроса (5 полей + 2 бриффа)?
  • [ ] Запущен ли парсер и получено ли окно lines_before_anchor/lines_after_anchor?
  • [ ] Сравнены ли ответы naive и structured по точности и времени?
  • [ ] Принято решение о масштабировании (да/нет) и зафиксировано в задаче проекта.

Источники

Что почитать дальше

Теги