Структурный парсинг вопросов в RAG: как questiondf повышает точность ответов
Сцена: Менеджер продукта открывает дашборд своей 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»
- Выберите один тип вопроса (например, «какова премия по полису X на 01.01.2025?»).
- Сформируйте
question_df‑строку с ключевыми словами (premium,policy X), область (insurance), формой (exact value), разложением (single‑value) и уточнением (date). - Запустите парсер (скрипт из репозитория) и посмотрите, какие значения попали в
lines_before_anchorиlines_after_anchor. - Сравните два результата:
* Naive — top‑k по вектору без ограничения.
* Structured — поRetrievalQueryс окном, полученным изquestion_df. - Оцените метрику «полнота ответа» (получил ли 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 + контекст в промпте. |
Какое решение принять уже сейчас
- Определите цель: нужна ли вам точность > 90 % для конкретных бизнес‑вопросов (например, ценообразование, комплаенс).
- Запустите быстрый пилот по одному‑двум типам запросов, используя готовый скрипт из
doc‑intel/notebooks‑vol1. - Сравните метрики (полнота, время, количество запросов). Если улучшение ощутимо и затраты приемлемы, планируйте расширение
question_dfна все типы вопросов. - Закрепите процесс: создайте шаблон
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 по точности и времени?
- [ ] Принято решение о масштабировании (да/нет) и зафиксировано в задаче проекта.
Источники
- The Untaught Lessons of RAG Question Parsing: Structure Before You Search
- GitHub репозиторий doc‑intel/notebooks‑vol1
Что почитать дальше
- AI-фотографии 2026: как работает генерация изображений, где применять и какие ограничения
- Code-as-policy для робототехники: как AI-агент удешевляет пилот и где проверить риск перед стартом
- DeepEval 4.0 для AI-агентов: автоматическая оценка кода вместо ручных тестов
- Gemini в России: стоит ли подключать, если уже есть ChatGPT?
- LLM Wiki: как построить личную базу знаний с Obsidian и Codex вместо RAG