3,583 papers
arXiv:2610.25096 80 18 окт. 2026 г. FREE

RetailRAG: агент для вопросов поверх таблиц и текстов — схема перед планом, цепочка с переменными, ремонт только упавшего шага

КЛЮЧЕВАЯ СУТЬ
Обнаружено: агенты по данным ломаются не из-за слабого ума модели, а на переходе между источниками. Качество падает с ростом числа источников у всех десяти проверенных моделей, и у крупных, и у мелких. Метод RetailRAG позволяет отвечать на вопросы, которые требуют и таблицу, и тексты. Например: «у какого продавца лучший товар и сколько он заработал». Фишка: агенту дают справку по структуре данных до планирования, а при сбое чинят только один упавший шаг. План пишется целиком, и результат одного шага подставляется в следующий. Это цепочка с переменными. Ошибка на первом шаге перестаёт молча портить всё остальное. Главный вывод авторов: масштаб модели эту проблему не лечит, помогает только явная организация перехода между источниками.
Адаптировать под запрос
⚡

TL;DR

RetailRAG — каркас для агента, который отвечает на вопросы сразу по базе данных (заказы, товары) и по текстам (отзывы, обращения клиентов). Работает в три хода: сначала агенту выдают справку по структуре данных, потом он целиком пишет цепочку шагов, где результат одного шага подставляется в следующий. Если шаг упал, чинят только его, а не весь план.

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

Метод решает это тремя приёмами. (1) Перед планированием в промпт кладут сжатую справку: какие есть источники, допустимые значения полей, по каким ключам они связаны, как считаются метрики. (2) План пишется одним проходом: у каждого шага указан источник, запрос и зависимость от предыдущих. (3) При сбое запускается диагностика (что именно сломалось) и перепись одного шага.

🔬

Схема метода

ШАГ 0: Справка по данным (один раз на базу) → 4 блока: схема / допустимые значения / ключи связи / формулы метрик
ШАГ 1: Роутер: вопрос простой? → один вызов инструмента. Сложный? → в планирование
ШАГ 2: План целиком, одним проходом → шаги: источник + запрос + зависимость ({результат_шага_1})
ШАГ 3: Выполнение: каждый шаг идёт в свой инструмент, значения из прошлых шагов подставляются в следующие
ШАГ 4: Сбой шага (пусто, нули) → диагноз с типом причины → переписать ТОЛЬКО этот шаг

Шаги 0–2 и 4 можно задать инструкцией агенту. Шаг 3 (подстановка значений) в статье делается кодом.

🚀

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

Задача: Вы аналитик у селлера на Ozon. Есть выгрузка заказов (SQLite-таблица) и папка с текстами отзывов. Вы работаете в Claude Code или Cursor. Руководитель просит: «Найди наш товар с самым низким средним рейтингом, посмотри, на что жалуются в отзывах, и скажи, сколько мы на нём заработали».

Это цепочка из трёх источников. Рейтинг лежит в таблице отзывов, жалобы в тексте, выручка в таблице заказов.

Промпт:


Ты аналитик магазина на Ozon. Отвечаешь только на основе наших данных.



Источники:
- orders (SQL): order_id, product_id, status, price_rub, qty, created_at
- reviews_meta (SQL): review_id, product_id, rating, order_id
- reviews_text (папка ./reviews/*.txt): имя файла = review_id, внутри текст отзыва

Допустимые значения:
- orders.status ∈ {delivered, refunded, cancelled}
- reviews_meta.rating: целое 1–5

Ключи связи:
- product_id связывает orders и reviews_meta
- review_id связывает reviews_meta и файлы в ./reviews/

Метрики:
- выручка = SUM(price_rub * qty) по заказам со status = 'delivered'
- доля возвратов = заказы refunded / все заказы



Перед выполнением напиши ВЕСЬ план одним списком. Для каждого шага укажи:
- источник (SQL или текст)
- конкретный запрос или поисковое условие
- от каких шагов зависит; ссылайся на них как {step1.result}
Только после этого выполняй шаги по порядку, подставляя реальные значения.



Если шаг вернул пустой результат или нулевой агрегат:
1. Назови причину одним из типов: несовпадение схемы / слишком жёсткий фильтр / неверный ключ связи / другое.
2. Перепиши ТОЛЬКО упавший шаг: ослабь фильтр, поправь колонку или переформулируй запрос.
3. Уже выполненные шаги не трогай.


Вопрос: найди товар с самым низким средним рейтингом (минимум 10 отзывов), выпиши главные жалобы из текстов отзывов с низкими оценками и посчитай выручку по этому товару.

Результат: Агент сначала выведет план из трёх-четырёх шагов: SQL по рейтингу, затем выбор отзывов этого товара, чтение текстов, SQL по выручке. В плане будут видны ссылки между шагами. При пустом ответе (например, фильтр по статусу написан с ошибкой) агент назовёт тип причины и перепишет только этот шаг. Финальный ответ: название товара, список жалоб и число выручки в рублях.

🧠

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

Слабость. Если дать агенту вопрос «в лоб», он угадывает структуру данных по ходу. Он путает названия колонок, пропускает допустимые значения ('Delivered' вместо 'delivered') и не знает, как считается «выручка» именно у вас. Хуже всего, что ошибка на первом шаге молча портит все следующие.

Сильная сторона. Модель хорошо планирует, когда у неё перед глазами карта местности. Она умеет писать SQL и читать тексты по отдельности. Она неплохо диагностирует сбой, если ей показать сигнал: пустой результат или нулевую сумму.

Как метод это использует. Справка заранее снимает угадывание. План одним куском делает зависимости видимыми: «шаг 3 использует результат шага 1». Локальный ремонт сохраняет всё, что уже получилось, и платит за исправление один шаг, а не весь план.

Рычаги управления: - Справка по данным → самый дешёвый рычаг. Добавляйте в неё то, что агент чаще всего путает: допустимые значения, формулы метрик. - Роутер «простой/сложный» → если вопрос в один источник, пропустите планирование. Это экономит вызовы и время. - Типы причин сбоя → дополните своими. Например, «дубликаты при соединении», «не тот часовой пояс». - Правило «не трогай выполненные шаги» → уберите его, если данные могли измениться между шагами.

📋

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


Ты аналитик по теме {область}. Отвечаешь только по данным из источников ниже. Если данных нет, так и говоришь.



Источники:
- {источник_1} ({тип: SQL или текст}): {колонки или формат}
- {источник_2} ({тип}): {колонки или формат}

Допустимые значения:
- {колонка}: {список значений или диапазон}

Ключи связи между источниками:
- {ключ} связывает {источник_1} и {источник_2}

Формулы метрик:
- {метрика} = {формула через колонки}



Если вопрос укладывается в один источник — ответь одним запросом.
Если нужно несколько источников — сначала напиши весь план одним списком.
Для каждого шага укажи: источник, точный запрос, зависимость от прошлых шагов ({step1.result}).
Потом выполняй шаги по порядку, подставляя реальные значения из прошлых шагов.



Если шаг вернул пусто или ноль:
1. Определи причину: {тип_1} / {тип_2} / {тип_3} / другое.
2. Перепиши только этот шаг. Выполненные шаги не меняй.


Вопрос: {вопрос}

Что подставлять: - {область} — ваша сфера (розница, доставка, поддержка). - Блок источников — реальные названия таблиц, папок, колонок. Пример значения в скобках помогает. - {тип_1..3} — типичные причины сбоев в ваших данных. Из статьи: несовпадение схемы, слишком жёсткий фильтр.

🚀 Быстрый старт — вставь в чат или в агента с доступом к данным:

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

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

LLM спросит, какие у тебя источники, какие колонки в таблицах, чем связаны таблицы и тексты и как у вас считаются ключевые метрики. Без этого справка пустая, а именно она убирает угадывание структуры. Модель возьмёт паттерн из шаблона и заполнит его под твои данные.

⚠️

Ограничения

⚠️ Нужен агент с инструментами: Метод строится на выполнении SQL и поиска по текстам. В обычном чате без доступа к данным он превращается в написание плана, а проверить шаги нечем.

⚠️ Полный каркас требует кода: В статье роутер, подстановка значений между шагами и обнаружение сбоев по сигналам выполнения реализованы программой. Инструкцией агенту вы воспроизведёте идею, но не детерминированную подстановку.

⚠️ Данные в тесте синтетические: Бенчмарк построен на симуляции продавцов и покупателей, не на реальной базе компании. Эксперт GS Retail подтвердил реалистичность вопросов, но реальные данные грязнее.

⚠️ Цифры результатов не видны: В доступном тексте нет таблиц сравнения с базовыми системами и результатов по десяти моделям. Есть только заявление авторов, что RetailRAG выигрывает у всех и что главная проблема — переход между источниками. Размер выигрыша оценить нельзя.

⚠️ Готовых промптов нет в тексте: Авторы выложили их в приложении, но здесь его нет. Шаблон выше — реконструкция по описанию этапов, а не копия.

🔍

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

Авторам нужно было проверять агентов на корпоративных данных ритейла, но реальные данные закрыты. Они симулировали продавцов и покупателей с персонами и прогнали пять стадий: продающий питч, вопрос до покупки, заказ, вопрос после покупки, отзыв. Результат разложили в базу из 8 источников: 5 таблиц и 3 текстовых коллекции. Связаны они только общими идентификаторами, без готовых ссылок.

Потом собрали 1680 вопросов трёх уровней сложности. Сначала простые вопросы по одному источнику, затем слой за слоем их «склеивали»: имя продавца в вопросе заменялось описанием «продавец, который транслировал такой-то товар». Агенту приходится сначала разгадать это описание в одном источнике, а потом искать ответ в другом.

Качество проверяли несколько раз. Это запуск запроса на базе, два LLM-судьи, три эксперта по NLP (согласие 0,89 по коэффициенту Гвета) и эксперт GS Retail с опытом больше десяти лет. Он признал реалистичными 90% вопросов: 97,5% на первом уровне, 90% на втором, 82,5% на третьем.

Затем сравнили RetailRAG с шестью базовыми подходами, среди них ReAct, MAC-SQL, HetaRAG, TableRAG. Через RetailRAG как общий каркас прогнали десять моделей. Логика такая: если каркас слабый, он сам мешает измерить способности модели. Вывод авторов: качество падает при росте числа источников и глубины цепочки у всех моделей, и размер модели этого не исправляет. Для практики отсюда следует: агенту нужна явная организация перехода между источниками.

💡

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

🔧 Техника: сделать диагноз видимым → контроль сбоев

Добавьте в блок строку: «Перед переписыванием шага выведи: ДИАГНОЗ: [тип причины] — [сигнал, по которому понял]». Вы увидите, на чём агент спотыкается чаще всего, и сможете вписать это в справку по данным как новое правило.

🔧 Техника: справка в файле инструкций → один раз и надолго

Справку (источники, допустимые значения, ключи, формулы) вынесите в CLAUDE.md или AGENTS.md проекта. Тогда она работает для любого вопроса автоматически. В промпте остаются только план и диагностика.

Экстраполяция: справка + самопроверка перед ответом

Эта часть уже не из статьи, а комбинация с идеей проверки:

После получения итогового ответа проверь:
1. Каждое число в ответе привязано к конкретному шагу плана?
2. Статусы, значения и формулы совпадают со справкой?
Если нет — назови шаг, который нужно пересчитать, и пересчитай только его.
🔗

Ресурсы

  • Статья: Toward Agentic Retrieval-Augmented Generation for Enterprise Retail Workflows over Heterogeneous Data Sources
  • Код и данные: https://github.com/DISL-Lab/RetailBridge (промпты всех этапов — в Приложении F)
  • Авторы: Jeonghwan Choi, Jibin Hwang, Hayoon Park, Hyeonjae Cheon, Hwanjun Song
  • Организации: KAIST, Cluvion, GS Retail
  • Упомянутые базовые подходы: ReAct (Yao et al., 2023), MAC-SQL, HetaRAG, TableRAG

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

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

Обнаружено: агенты по данным ломаются не из-за слабого ума модели, а на переходе между источниками. Качество падает с ростом числа источников у всех десяти проверенных моделей, и у крупных, и у мелких. Метод RetailRAG позволяет отвечать на вопросы, которые требуют и таблицу, и тексты. Например: «у какого продавца лучший товар и сколько он заработал». Фишка: агенту дают справку по структуре данных до планирования, а при сбое чинят только один упавший шаг. План пишется целиком, и результат одного шага подставляется в следующий. Это цепочка с переменными. Ошибка на первом шаге перестаёт молча портить всё остальное. Главный вывод авторов: масштаб модели эту проблему не лечит, помогает только явная организация перехода между источниками.

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

Метод работает как маршрут с картой, а не как блуждание в тумане. 1. Справка (один раз на базу): какие есть источники, допустимые значения полей, ключи связи, формулы метрик. 2. План целиком: у каждого шага есть источник, запрос и зависимость вроде {step1.result}. 3. Выполнение: значения из прошлых шагов подставляются в следующие. 4. Сбой (пусто или ноль): назвать причину и переписать только этот шаг. Чини сломанное звено, а не выбрасывай всю цепь. Это локальный ремонт: всё, что уже получилось, остаётся нетронутым. Простые вопросы в один источник можно пускать без плана, одним запросом.

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

Без справки агент угадывает структуру на ходу. Он путает колонки, пишет 'Delivered' вместо 'delivered' и считает «выручку» не так, как у вас. Ошибка на первом шаге молча тянется дальше, и итоговый ответ выглядит уверенно, но неверен. Справка убирает угадывание заранее. План одним куском делает зависимости видимыми: «шаг 3 берёт результат шага 1». Локальный ремонт экономит силы: платишь за один шаг, а не за весь план. Модель неплохо диагностирует сбой, если показать ей сигнал: пустой результат или нулевую сумму. Честная оговорка: в доступном тексте статьи нет таблиц с цифрами. Размер выигрыша над базовыми системами оценить нельзя. Тест тоже синтетический, а реальные данные грязнее.

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

Аналитика и поддержка → вопросы, где ответ лежит сразу в таблице и в текстах (заказы плюс отзывы, обращения плюс статусы), особенно когда нужно вытащить значение из одного источника и искать его в другом. НЕ подходит для вопросов в один источник: там хватит одного запроса. НЕ подходит для обычного чата без доступа к данным: проверить шаги нечем, получится просто красивый план. Полный каркас с подстановкой значений в статье сделан кодом. Инструкцией агенту воспроизводится идея, но не жёсткая подстановка.

Мини-рецепт

1. Собери справку: выпиши таблицы, папки, колонки. Добавь допустимые значения, например status ∈ {delivered, refunded, cancelled}.
2. Укажи ключи связи: чем таблица заказов связана с отзывами и с файлами текстов.
3. Запиши формулы метрик: «выручка = SUM(price_rub * qty) по доставленным». Это самый дешёвый рычаг: именно тут агент чаще всего путается.
4. Потребуй весь план до выполнения: источник, запрос, зависимость от прошлых шагов.
5. Добавь правило ремонта: при пустом результате назвать причину и переписать только упавший шаг. Причины: несовпадение схемы, слишком жёсткий фильтр, неверный ключ связи. Допиши свои, например «дубликаты при соединении».
6. Пусти простые вопросы напрямую: если нужен один источник, план не нужен.
7. Для быстрого старта: вставь шаблон в чат и попроси модель задавать вопросы про твои данные. Пустая справка бесполезна.

Примеры

[ПЛОХО] : Найди наш товар с самым низким рейтингом, посмотри жалобы в отзывах и скажи, сколько мы на нём заработали
[ХОРОШО] : Ты аналитик магазина. Источники: orders (SQL: order_id, product_id, status, price_rub, qty), reviews_meta (SQL: review_id, product_id, rating), папка ./reviews/.txt (имя файла = review_id). Допустимо: status ∈ {delivered, refunded, cancelled}. Ключи: product_id связывает orders и reviews_meta, review_id связывает reviews_meta и файлы. Выручка = SUM(price_rub qty) по status = 'delivered'. Сначала напиши весь план: источник, запрос, зависимость вроде {step1.result}. Потом выполняй. Если шаг вернул пусто или ноль, назови причину (схема / жёсткий фильтр / ключ связи) и перепиши только этот шаг. Вопрос: найди товар с самым низким средним рейтингом (минимум 10 отзывов), выпиши главные жалобы из текстов низких оценок, посчитай выручку. Разница в том, что агент не гадает про названия колонок. Он видит связи между шагами. При ошибке в фильтре статуса он чинит один шаг, а не начинает всё заново.
Источник: Toward Agentic Retrieval-Augmented Generation for Enterprise Retail Workflows over Heterogeneous Data Sources
ArXiv ID: 2610.25096 | Сгенерировано: 2026-10-20 13:20

Проблемы LLM

ПроблемаСутьКак обойти
Ошибка на первом шаге цепочки молча портит все следующиеВопрос требует нескольких источников. Например: взять имя из таблицы, найти его в текстах, вернуться в другую таблицу. Модель делает шаги по одному и не проверяет результат. Первый шаг вернул не то, но выглядит правдоподобно. Дальше модель честно строит всё на ошибке. Итоговый ответ неверный, а причину не видно. Чаще всего ломается переход между источниками, а не отдельный запрос.Сначала пусть модель напишет весь план списком. Для каждого шага: источник, точный запрос, от каких шагов зависит ({step1.result}). Зависимости становятся видны заранее. Потом выполняй по порядку. Если шаг вернул пусто или ноль, останавливайся и чини его. Не передавай такой результат дальше.

Методы

МетодСуть
Справка по данным перед планом — меньше угадыванияПеред вопросом дай модели короткую справку из четырёх блоков. 1. Источники: таблицы, папки, колонки. 2. Допустимые значения: например status ∈ {delivered, refunded, cancelled}. 3. Ключи связи: чем таблицы и тексты соединяются. 4. Формулы метрик: выручка = SUM(price*qty) по доставленным заказам. Почему работает: без справки модель угадывает структуру на ходу. Путает названия колонок, пишет 'Delivered' вместо 'delivered', считает «выручку» по-своему. Справка убирает угадывание до первого запроса. Что класть первым: то, что модель путает чаще всего (значения полей и формулы). Когда применять: любые вопросы по базе или нескольким источникам, особенно если метрики у вас свои. Когда не нужна: один простой запрос к знакомой таблице.
Диагноз причины и ремонт одного шагаЕсли шаг вернул пусто или ноль, не переделывай весь план. 1) Пусть модель назовёт тип причины: несовпадение схемы / слишком жёсткий фильтр / неверный ключ связи / другое. 2) Пусть перепишет только этот шаг. 3) Выполненные шаги трогать нельзя. Почему работает: название типа причины сужает поиск ошибки. Модель не гадает вслепую, а выбирает среди 3–4 вариантов. Рабочие шаги сохраняются, и исправление стоит один шаг, а не весь план. Настройка: добавь свои типы причин («дубликаты при соединении», «не тот часовой пояс»). Когда не применять: данные могли измениться между шагами. Тогда выполненные шаги тоже надо перепроверить. Ограничение: сигнал сбоя должен быть явным (пусто, ноль, ошибка). Если результат неверный, но не пустой, метод его не заметит.
📖 Простыми словами

Toward Agentic Retrieval-Augmented Generation for Enterprise Retail Workflows over Heterogeneous Data Sources

arXiv: 2610.25096

Обычные AI-агенты моментально сливаются, когда им нужно одновременно копаться в таблицах заказов и читать текст отзывов. Если задать модели комплексный вопрос «в лоб», она начинает тупо угадывать схему базы данных, путает регистр в статусах вроде 'Delivered' и на ходу выдумывает формулу выручки. В итоге срабатывает эффект домино: мелкая ошибка в первом же SQL-запросе молча превращает весь итоговый отчёт в полную дезинформацию.

Это как отправить стажёра готовить блюдо на кухне, где все банки со специями без подписей. Он перепутал соль с сахаром на первом шаге, но не остановился и продолжил бодро варить карамель. На выходе получается несъедобная бурда, а виновник лишь разводит руками со словами: «ну я же строго следовал процессу».

Архитектура RetailRAG лечит эту проблему тремя приёмами. Сначала агенту выдают структурную шпаргалку с точным описанием колонок и метрик, чтобы он перестал гадать на кофейной гуще. Затем он генерирует сквозную цепочку шагов, где результат поиска по таблице передаётся в модуль анализа текстов. А если конкретный запрос падает, включается точечный ремонт: система переписывает только один проблемный шаг, не сбрасывая весь прогресс.

Эксперимент ставили на связке заказов маркетплейса и жалоб покупателей, но принцип универсален. Любая enterprise-задача, где сухие строки из PostgreSQL нужно склеить с простынями из тикетов поддержки или CRM, требует ровно такого контроля. Без разницы, крутишь ты агента через Cursor или пишешь свой скрипт: импровизация агента в БД — верный путь к провалу.

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

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

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

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