3,583 papers
arXiv:2608.22651 73 23 авг. 2026 г. FREE

ReAct-SQL: сначала разведка данных, потом сборка запроса по шагам — вместо генерации всего сразу

КЛЮЧЕВАЯ СУТЬ
LLM путает 'Metformin' и 'metformin' не по глупости — она физически не может свериться с реальными данными, только угадывает. Метод ReAct-SQL позволяет генерировать рабочие SQL-запросы к реальным базам без угадывания названий, форматов и структуры. Сначала модель прощупывает настоящие значения в таблицах, потом собирает запрос маленькими проверяемыми шагами из 15 операций — вместо того чтобы выдать всё одним куском и надеяться на удачу. Ошибка ловится на середине сборки, а не всплывает только в финальном результате.
Адаптировать под запрос

TL;DR

ReAct-SQL — техника, где модель не пишет готовый запрос к базе данных сразу, а строит его пошагово через маленький набор проверяемых операций: загрузить таблицу → отфильтровать → объединить → посчитать. Перед этим модель может "прощупать" базу — заглянуть в реальные значения колонок, — а не угадывать их по названию.

Модель ошибается в SQL-запросах по двум разным причинам. Первая: она не знает, как на самом деле называются данные внутри — путает регистр (metformin vs Metformin), не понимает сокращённые названия таблиц вроде chartevents. Вторая: задача сама по себе сложная, с кучей вложенных условий — и модель просто теряется, выдавая кривой, нерабочий запрос. Это две разные болячки, и лечить их одним и тем же способом бесполезно.

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

🔬

Схема метода

ШАГ 1: Думает → анализирует вопрос, планирует подход (текстовый блок рассуждения)
ШАГ 2: Действует → вызывает операции из ограниченного набора (загрузить таблицу, отфильтровать, объединить, "прощупать" значения) → структурированный вызов
ШАГ 3: Наблюдает → получает результат каждой операции: успех/ошибка/превью данных → обратная связь
ШАГ 4: Повтор шагов 1-3, пока не готов ответ
ШАГ 5: Финальное оформление → выбор или синтез итогового результата из истории шагов

Всё происходит в рамках одного многошагового диалога (агентский цикл), не в одном сообщении.

🚀

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

Задача: Аналитик в компании выгрузил из Битрикс24 CRM таблицы deal, contact, company и просит ChatGPT собрать запрос: "сколько сделок закрыто успешно за квартал по каждому менеджеру". Проблема — он не уверен, как именно называются статусы сделок в базе, в каком формате даты, и запрос многосоставной.

Промпт:

У меня есть выгрузка из CRM Битрикс24. Вот структура таблиц и примеры значений:
[приложить примеры строк из deal, contact, company]

Задача: посчитать количество успешно закрытых сделок за 3 квартал 2024 
по каждому менеджеру.

Не давай сразу финальный SQL-запрос. Сделай так:
1. Изучи примеры значений в колонках статуса сделки и даты — 
   опиши, что понял (какое значение значит "успешно закрыта", 
   в каком формате дата).
2. Разбей построение запроса на пронумерованные шаги: 
   какие таблицы нужны, как их соединить, какой фильтр по дате 
   и статусу, как сгруппировать по менеджеру. 
   После каждого шага кратко проверь его логику.
3. Собери финальный запрос только после того, как все шаги проверены.
   Покажи мне план и финальный запрос отдельно.

Результат: Модель сначала разберёт примеры данных и явно скажет, что, например, статус "WON" означает успешную сделку, а дата хранится в формате YYYY-MM-DD. Потом покажет план из 4-5 пронумерованных шагов с проверкой каждого. В конце — готовый SQL-запрос, собранный из уже проверенной логики, а не угаданный с первого раза.

🧠

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

Модель не может свериться с реальными данными "в голове" — она угадывает названия статусов, форматы дат, регистр букв. Эти ошибки тихие: запрос выглядит правильным, но выдаёт неверный результат, потому что модель искала "Won", а в базе было "won".

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

Метод использует это: сначала даёт модели "посмотреть" на реальные данные, а потом заставляет строить логику маленькими проверяемыми кусками. Ошибка ловится на промежуточном шаге, а не всплывает только в готовом результате.

Рычаги управления: - Число шагов разведки → для простых задач с понятными данными можно урезать до нуля - Список допустимых операций → сузь или расширь под свою задачу (для текста договора: "добавить пункт", "изменить формулировку", "удалить пункт") - Условие завершения → замени "финальный ответ" на "покажи 2 варианта и жди подтверждения"

📋

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

Я работаю с {тип данных/задачи}. Вот структура/примеры: {данные}.
Задача: {задача}.

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

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

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

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

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

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

⚠️

Ограничения

⚠️ Узкая специализация: метод проверен на генерации SQL-запросов. Для творческих или субъективных задач (тексты, идеи, оценка стиля) декомпозиция на "проверяемые шаги" работает слабо — там нет объективного критерия "правильно/неправильно" на каждом шаге.

⚠️ Без реальных данных разведка бесполезна: если не приложить примеры значений (файл, выгрузку, таблицу), модель просто гадает так же, как и без метода — шаг "посмотреть на данные" ничего не даёт.

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

🔍

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

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

Результат удивил: простой цикл "думай-действуй-смотри" с ограниченным набором из 15 операций показал точность на уровне сложных систем с десятками вызовов модели, но работал в 3-8 раз быстрее. А главный инсайт вылез из отдельного эксперимента: на медицинских данных с непонятными названиями возможность "прощупать" реальные значения дала прирост точности на 26 пунктов, а сам ограниченный набор операций почти ничего не добавил. На обычных бизнес-запросах — наоборот: разведка почти не помогла, а ограниченный набор операций дал +5 пунктов. Вывод: разные типы ошибок модели лечатся разными способами, и универсального "одного решения на всё" не существует.


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

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

LLM путает 'Metformin' и 'metformin' не по глупости — она физически не может свериться с реальными данными, только угадывает. Метод ReAct-SQL позволяет генерировать рабочие SQL-запросы к реальным базам без угадывания названий, форматов и структуры. Сначала модель прощупывает настоящие значения в таблицах, потом собирает запрос маленькими проверяемыми шагами из 15 операций — вместо того чтобы выдать всё одним куском и надеяться на удачу. Ошибка ловится на середине сборки, а не всплывает только в финальном результате.

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

Цикл работает как конвейер: думаетдействуетнаблюдает → повтор, пока не готов финальный ответ. Каждый шаг — маленькая проверяемая операция, а не абстрактная логика в одной голове модели. Из 15 разрешённых действий (загрузить таблицу, отфильтровать, объединить, посчитать, прощупать значения) модель выбирает по одному на шаг — и сразу получает обратную связь: сработало или нет.

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

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

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

Генерация SQL-запросов → конкретно когда база данных с неочевидными значениями (разный регистр, сокращённые названия таблиц, непонятные форматы дат), особенно когда запрос многосоставной с несколькими условиями и объединением таблиц. НЕ подходит для творческих задач без объективного критерия правильности — там пошаговая проверка бессмысленна.

Мини-рецепт

1. Дай реальные данные: приложи примеры строк из таблиц, а не только названия колонок — без этого разведка бесполезна.
2. Запрети спешку: попроси модель не выдавать готовый запрос сразу, а сначала разобрать значения и форматы.
3. Разбей на шаги: план из пронумерованных шагов построения запроса, после каждого — короткая проверка логики.
4. Собери финал отдельно: итоговый запрос только после того, как все шаги подтверждены, и покажи его отдельно от плана.

Примеры

[ПЛОХО] : Напиши SQL-запрос: сколько сделок закрыто успешно за квартал по менеджерам
[ХОРОШО] : Вот примеры строк из таблиц deal, contact, company: [данные]. Не давай сразу готовый запрос. Сначала разбери, что значит "успешно закрыта" в статусах и в каком формате хранится дата. Потом распиши пронумерованные шаги объединения таблиц и фильтрации, проверяя каждый шаг перед следующим. Собери финальный запрос только после этого.
Источник: Iteration Without Elaboration: A Simple ReAct Architecture Suffices for Text-to-SQL Generation
ArXiv ID: 2608.22651 | Сгенерировано: 2026-08-25 05:24

Проблемы LLM

ПроблемаСутьКак обойти
Модель угадывает реальные данные вместо того, чтобы на них посмотретьМодель не видит содержимое базы, файла, таблицы. Она предполагает названия, регистр букв, формат дат по общим шаблонам. Ошибка тихая: структура ответа выглядит правильно, но результат неверный, потому что модель искала "Won", а в данных было "won"Перед тем как просить готовый ответ, дай модели реальные примеры значений (строки таблицы, фрагмент файла). Попроси сначала описать, что она поняла из примеров, и только потом строить логику
Сложная многошаговая задача целиком ломает модельКогда в задаче много вложенных условий (несколько таблиц, фильтров, группировок), модель пытается выдать готовый результат сразу целиком. Ошибка прячется внутри большого ответа и не видна пока не проверишь итогРазбей задачу на пронумерованные маленькие шаги. После каждого шага проси модель кратко проверить его логику, прежде чем переходить к следующему

Методы

МетодСуть
Разведка данных перед сборкой ответаПеред основной задачей попроси модель изучить реальные примеры (значения колонок, форматы, сокращения) и явно описать, что она поняла. Только после этого — переходить к построению логики. 1. Разведка 2. План по шагам с проверкой каждого 3. Финал. Работает потому что модель не может свериться с данными "в голове" — она может только угадывать, если не дать ей посмотреть на примеры. Когда применять: есть реальные данные с непонятными названиями/форматами (базы данных, конфиги, выгрузки). Когда не работает: нет доступа к примерам данных — тогда шаг разведки бессмысленен, модель гадает как и раньше
Пошаговая сборка с проверкой каждого шагаВместо одного большого готового ответа проси модель строить его маленькими именованными действиями из ограниченного набора операций (загрузить, отфильтровать, объединить, посчитать). После каждого шага — короткая проверка логики, прежде чем двигаться дальше. Работает потому что ошибка ловится на промежуточном шаге, а не всплывает только в финале. Когда применять: составная задача с несколькими условиями и объективным критерием правильности на каждом шаге. Когда не работает: задача простая и однозначная (разбивка тратит время без выигрыша), или задача творческая/субъективная без критерия "верно/неверно" на шаге
📖 Простыми словами

Iteration Without Elaboration: A Simple ReAct Architecture Suffices for Text-to-SQL Generation

arXiv: 2608.22651

Когда нейросеть пишет сложный SQL-запрос с одного захода, она почти всегда лажает на скрытых деталях. В голове у модели нет твоей базы: она видит названия колонок и тупо угадывает, как именно внутри записан статус — 'Won', 'won' или вообще цифра 1. В итоге на выходе получается синтаксически идеальный код, который возвращает абсолютно бредовые цифры.

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

Архитектура ReAct-SQL решает проблему через простую разведку боем. Модель не рожает гигантский запрос целиком, а идёт по цепочке из базовых операций: прощупать реальные значения, профильтровать нужные строки, склеить таблицы и посчитать сумму. Если в базе статусы забиты строчными буквами, LLM видит это на первом шаге и не допускает скрытых ошибок.

В исследовании гоняли связки таблиц из CRM, но паттерн универсален для любого продакшена. Будь то аналитика в ClickHouse, PostgreSQL или кривая выгрузка из 1С, где логику полей писали как бог на душу положит. Чем грязнее схема данных, тем сильнее ReAct уничтожает ваншот-генерацию.

Короче: перестань требовать от LLM готовый скрипт за один промпт — это прямой путь к тихому факапу в метриках. Дай модели возможность делать маленькие шаги и подглядывать в реальные данные. Простые итерации вместо сложной магии спасут отчёты, пока конкуренты гадают, куда у них пропала половина выручки.

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

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

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