3,583 papers
arXiv:2512.18622 68 21 дек. 2025 г. FREE

MATS: мультиагентная декомпозиция для генерации SQL запросов

КЛЮЧЕВАЯ СУТЬ
MATS — фреймворк, который разделяет задачу генерации SQL между пятью специализированными агентами: один фильтрует схему БД и находит релевантные значения колонок, второй генерирует SQL пошагово (что выбрать → какие условия → какие таблицы), третий проверяет результат выполнения запроса, четвёртый исправляет ошибки, пятый выбирает лучший вариант из кандидатов. Каждый агент — это отдельная языковая модель, fine-tuned под свою подзадачу.
Адаптировать под запрос

TL;DR

MATS — фреймворк, который разделяет задачу генерации SQL между пятью специализированными агентами: один фильтрует схему БД и находит релевантные значения колонок, второй генерирует SQL пошагово (что выбрать → какие условия → какие таблицы), третий проверяет результат выполнения запроса, четвёртый исправляет ошибки, пятый выбирает лучший вариант из кандидатов. Каждый агент — это отдельная языковая модель, fine-tuned под свою подзадачу.

Малые модели (1-3B параметров) плохо справляются со сложными задачами вроде Text2SQL — путаются в большых схемах БД (до 65 таблиц, 455 колонок), неточно связывают вопрос с колонками, делают ошибки в логике запросов. Одна модель пытается держать в голове всю схему, рассуждать о выборе таблиц, генерировать синтаксически корректный SQL и проверять логику — получается каша. Причина: ограниченная "память" модели (контекст) и слабые способности к глубоким рассуждениям.

MATS использует divide-and-conquer: каждый агент делает одну узкую задачу, не перегружая контекст. Агенты обучаются через Reinforcement Learning with Execution Feedback (RLEF) — модель генерирует несколько SQL, выполняет их в базе данных, получает результаты (пустой ответ, ошибка, данные) и учится на реальных последствиях, а не на ручной разметке. Результат: точность как у GPT-4o при использовании моделей в 9B параметров вместо сотен миллиардов.

🔬

Схема метода

АГЕНТ 1 (Schema Insight): Фильтрация схемы БД
├─ Ранжирование таблиц и колонок по релевантности к вопросу
└─ Поиск конкретных значений в колонках через BM-25 → схема + примеры значений

АГЕНТ 2 (Planner): Генерация SQL пошагово
├─ ШАГ 1: Что выбирать (цель SELECT)
├─ ШАГ 2: Какие условия (логика WHERE)
├─ ШАГ 3: Какие таблицы нужны (FROM/JOIN)
└─ Генерирует K вариантов SQL (1 greedy + K-1 с temperature) → набор кандидатов

АГЕНТ 3 (Validator): Проверка результата выполнения
├─ Validator Selection: правильные ли колонки выбраны?
├─ Validator Condition: правильные ли условия (если результат пустой → проблема в WHERE)
└─ Фидбек: где ошибка и как исправить

АГЕНТ 4 (Fix): Исправление на основе фидбека
└─ Берёт SQL + фидбек валидатора → генерирует исправленный SQL

АГЕНТ 5 (Selection): Выбор лучшего SQL
└─ Сравнивает результаты выполнения всех кандидатов → индекс лучшего

Все агенты работают последовательно, каждый запрос требует отдельного обращения к модели.

🚀

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

⚠️ Метод требует: доступ к базе данных, выполнение SQL, технические навыки. Не для "обычного чата" — скорее для разработчиков или аналитиков, которые работают с БД через API LLM.

Задача: У вас база данных интернет-магазина (таблицы: users, orders, products, order_items, reviews). Нужно найти email пользователей, которые оставили отзывы на товары из категории "Электроника" со средней оценкой выше 4, но сами ни разу не купили товары из этой категории.

Промпт (концептуально — для разработчика системы):

[Входные данные для агента 1]
Вопрос: Найди email пользователей, которые писали отзывы на электронику с оценкой >4, но сами не покупали электронику

Схема БД: [полная схема с 15 таблицами]

[Агент 1 фильтрует → оставляет users, reviews, products, order_items]
[Агент 1 находит значения в products.category: "Ноутбуки", "Смартфоны", "Наушники"]

[Входные данные для агента 2]
Отфильтрованная схема + примеры значений
→ Генерирует 3 варианта SQL с разными подходами (подзапросы, CTE, JOIN)

[Агент 3 выполняет SQL в БД]
→ Вариант 1: пустой результат
→ Вариант 2: 15 строк
→ Вариант 3: ошибка синтаксиса

[Валидатор анализирует]
→ Вариант 1: "Пустой результат — возможно, слишком строгие условия в WHERE"
→ Вариант 2: проверяет колонки и условия → "Корректно"
→ Вариант 3: "Синтаксическая ошибка в JOIN"

[Агент 4 исправляет варианты 1 и 3]

[Агент 5 выбирает лучший SQL из всех исправленных и оригинальных]

Результат:

Система выдаст финальный SQL запрос, который прошёл через все проверки: схема отфильтрована до релевантных таблиц, логика разбита на шаги (кого ищем → что проверяем → откуда берём), запрос проверен на реальных данных, ошибки исправлены. В процессе вы увидите промежуточные рассуждения каждого агента, результаты выполнения кандидатов и обоснование выбора финального запроса.

🧠

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

Слабость малых моделей: контекст переполняется при больших схемах БД. Модель в 1-3B параметров пытается одновременно помнить 65 таблиц, рассуждать о связях, генерировать синтаксис SQL и проверять логику — результат: путаница в колонках, неправильные JOIN, логические ошибки в WHERE. Одна модель = все задачи сразу = overload.

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

Механика MATS: разделяет нагрузку между агентами — каждый видит только свой кусок задачи. Schema Insight фильтрует до 5-10 релевантных таблиц вместо 65 → Planner получает компактный контекст. Planner разбивает рассуждение на три явных шага (SELECT → WHERE → FROM) вместо генерации SQL "в лоб" → проще не запутаться. Validator не пытается угадать правильность, а смотрит на факт: SQL вернул пустой результат? Значит, условие слишком строгое или не та колонка. Fix получает точный фидбек ("условие X неверное"), а не размытое "что-то не так". Selection сравнивает конкретные результаты выполнения, а не пытается "представить" какой SQL лучше.

Ключевой принцип: execution feedback — модель не гадает, а видит последствия. SQL выполнился в БД → пустой результат → валидатор анализирует → фиксер корректирует → снова выполнение. Это loop обучения, где модель учится на реальных ошибках, а не на абстрактных правилах.

Рычаги управления (для разработчиков системы):

  • K (число кандидатов от Planner) → больше K = больше вариантов для выбора, но дороже по токенам. Уменьши для простых схем.
  • Temperature T → выше = разнообразнее SQL, ниже = консервативнее. Для стандартных запросов снижай.
  • Типы валидаторов → можно добавить валидатор на JOIN (проверяет правильность связей таблиц) или на агрегацию (COUNT, AVG).
  • Условие выбора в Selection Agent → сейчас по execution response, можно добавить критерий "читаемость SQL" или "минимум JOIN".
📋

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

⚠️ Этот метод НЕ для обычного чата. Требует инфраструктуры: база данных, выполнение SQL, интеграция агентов через API. Шаблоны ниже — концептуальные, для разработчиков систем на основе LLM.

⚠️

Для пошагового планирования SQL (применимо в чате с ограничениями):

Задача: сгенерировать SQL для вопроса "{вопрос}"

Схема БД:
{список_таблиц_и_колонок}

Рассуждай пошагово:

ШАГ 1 — Цель выборки (SELECT):
Что именно нужно получить? Какие колонки или агрегаты? Из какой таблицы главный результат?

ШАГ 2 — Условия (WHERE):
Какие фильтры применить? Какие значения или диапазоны? Нужна ли проверка на NULL?

ШАГ 3 — Таблицы и связи (FROM/JOIN):
Какие таблицы нужны? Как они связаны? Какие JOIN (INNER/LEFT/RIGHT)?

Финальный SQL:
[генерируй только после завершения всех шагов]

Плейсхолдеры: - {вопрос} — вопрос на естественном языке - {список_таблиц_и_колонок} — схема БД (релевантные таблицы с описаниями колонок)

📌

Для валидации через execution feedback (требует выполнения SQL):

SQL запрос:
{sql_запрос}

Результат выполнения:
{execution_response}

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

Проверь:
1. Правильные ли колонки выбраны для ответа на вопрос?
2. Если результат пустой или содержит None — какие условия могут быть слишком строгими?
3. Все ли необходимые таблицы включены в JOIN?

Фидбек:
[укажи конкретные ошибки и как исправить]

Плейсхолдеры: - {sql_запрос} — сгенерированный SQL - {execution_response} — результат выполнения (данные, пустой результат, ошибка) - {исходный_вопрос} — вопрос пользователя

🚀 Для продвинутых пользователей:

Если у вас есть доступ к БД и API LLM: 1. Попроси LLM отфильтровать схему БД до релевантных таблиц 2. Попроси сгенерировать SQL пошагово по шаблону выше 3. Выполни SQL в БД, получи результат 4. Верни результат в LLM с промптом валидации 5. Если найдена ошибка — попроси исправить 6. Повтори до правильного результата

Это ручная имитация MATS в цикле запросов.

⚠️

Ограничения

⚠️ Требует инфраструктуры: Метод работает только при наличии базы данных для выполнения SQL и получения feedback. Без реального выполнения запросов — теряется ключевая механика обучения и валидации.

⚠️ Множество запросов к LLM: 5 агентов + генерация K кандидатов + итерации исправлений = десятки запросов на один финальный SQL. Дорого по токенам, медленно по времени. Для простых запросов — overkill.

⚠️ Технический барьер: Нужны навыки работы с БД, API интеграции, понимание SQL. Не для "обычного пользователя ChatGPT" — скорее для разработчиков data-intensive приложений.

⚠️ Узкая задача: Метод заточен под Text2SQL. Принцип мультиагентности универсален, но конкретная реализация (Schema Insight, SQL validation через execution) применима только для работы с базами данных.

⚠️ Fine-tuning обязателен: В оригинале каждый агент fine-tuned на своей задаче. Без дообучения малые модели не справляются с ролью агентов так же эффективно. Большие модели (GPT-4, Claude) могут имитировать агентов в промптах, но тогда теряется смысл использования "малых" моделей.

🔍

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

Команда взяла два известных бенчмарка для Text2SQL — Spider (простые схемы, 10-20 таблиц) и BIRD (сложные реальные БД, до 65 таблиц, 455 колонок) — и протестировала MATS против baseline: GPT-4o с Chain-of-Thought, CHESS (state-of-the-art для Text2SQL на больших моделях), и различные fine-tuned open-source модели (CodeLlama, DeepSeek-Coder).

Суть эксперимента: для каждого вопроса система генерирует SQL, выполняет его в реальной БД, сравнивает результат с ground truth (правильным ответом). Метрика — Execution Accuracy: совпадает ли результат выполнения SQL с ожидаемым (не синтаксис SQL, а именно данные). Это жёсткий критерий — даже если SQL выглядит правильно, но вернул не те строки, считается ошибкой.

Удивительное открытие: MATS с моделями Qwen2.5-Coder-3B (всего 9B параметров на всех агентов) достиг 54.6% точности на BIRD — это сравнимо с GPT-4o (55-60%), но GPT-4o содержит сотни миллиардов параметров. На графике (Fig. 1) видно: MATS — левее всех (меньше параметров), но на уровне или выше топовых решений.

Почему так получилось: разделение на агентов позволило малым моделям не захлёбываться в контексте. Schema Insight уменьшил среднюю длину схемы БД в промпте на 70% (с 455 колонок до 20-30 релевантных) → Planner получает компактный input. Validator с реальным execution feedback поймал 40% ошибок, которые Planner пропустил (неправильные JOIN, слишком строгие WHERE). Fix Agent исправил 68% помеченных ошибок — это значит, что точный фидбек ("колонка X неверная") работает лучше, чем переделывать SQL с нуля.

Инсайт для практики: execution feedback (результат выполнения в БД) — мощнее, чем "думай правильно ли SQL". Модель видит пустой результат → понимает "условие слишком строгое". Видит синтаксическую ошибку → знает где искать. Это не абстрактная валидация, а конкретный сигнал. Такой подход можно использовать не только в SQL, но везде, где есть objective feedback: код (запустил → работает/не работает), вычисления (ответ → проверяемый результат), API запросы (response → анализ ошибок).

💡

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

📌

Принцип для других задач

Extractable principle: мультиагентная декомпозиция + feedback loop

Применимо в чате для задач с проверяемым результатом:

Пример 1: Генерация Python кода

АГЕНТ 1 (понимание задачи):
Разбей задачу "{задача}" на шаги: какие данные на входе, какие операции, что на выходе.

АГЕНТ 2 (генерация кода):
На основе шагов выше, напиши Python код. Генерируй 3 варианта с разными подходами.

АГЕНТ 3 (валидация):
Я выполнил код, результат: {execution_output}
Ожидалось: {expected_output}
Проанализируй расхождения. Где ошибка?

АГЕНТ 4 (исправление):
Исправь код на основе фидбека: {validator_feedback}

АГЕНТ 5 (выбор):
Какой из исправленных вариантов лучше по: читаемости, эффективности, корректности?

Важно: нужно выполнять код между запросами и возвращать результат.

Пример 2: Анализ данных с проверкой

Задача: посчитать среднюю стоимость заказов клиентов из Москвы

АГЕНТ 1: Какие колонки в CSV нужны? → city, order_value
АГЕНТ 2: Как фильтровать? → city == "Москва"
АГЕНТ 3: Какую операцию? → mean(order_value)

[Выполняешь pandas код, получаешь результат]

ВАЛИДАТОР: Результат 0 — проверь:
- Точно ли "Москва", а не "Moscow" или "москва"?
- Нет ли пропусков (NaN) в order_value?

ФИКСЕР: Добавь .fillna(0) и .str.lower() для city

Ручной цикл в ChatGPT/Claude — утомительно, но принцип работает: разделяй задачу → генерируй → выполняй → анализируй результат → исправляй.

🔧 Техника: Симуляция мультиагентности в одном промпте

Если нет возможности делать execution feedback, можно попросить модель симулировать агентов:

Ты — система из 3 агентов:

АГЕНТ 1 (Planner): Разбей задачу на шаги
АГЕНТ 2 (Generator): Сгенерируй решение
АГЕНТ 3 (Critic): Найди потенциальные ошибки в решении

Задача: {твоя_задача}

Выполни последовательно роли всех агентов. После каждой роли — чёткий output в формате:

AGENT 1 OUTPUT:
[...]

AGENT 2 OUTPUT:
[...]

AGENT 3 OUTPUT:
[...]

Эффект слабее, чем реальный execution feedback, но лучше, чем один общий промпт.

🔗

Ресурсы

A Multi-agent Text2SQL Framework using Small Language Models and Execution Feedback Код и данные

Thanh Dat Hoang, Thanh Trung Huynh, Matthias Weidlich, Thanh Tam Nguyen, Tong Chen, Hongzhi Yin, Quoc Viet Hung Nguyen

Griffith University (Австралия), VinUniversity (Вьетнам), Humboldt-Universität zu Berlin (Германия), The University of Queensland (Австралия)


📖 Простыми словами

MATS: мультиагентная декомпозиция для генерации SQL запросов

arXiv: 2512.18622

Суть в том, что малые языковые модели (SLM) — это не тупые калеки, а просто узкие специалисты, которых заставляли работать за весь отдел. Когда ты скармливаешь модели в 1–3 миллиарда параметров огромную базу данных на 60 таблиц и просишь написать сложный SQL-запрос, у неё просто закипает мозг. Она пытается одновременно удержать в памяти схему БД, не напутать в синтаксисе и еще как-то связать таблицы через JOIN. В итоге модель выдает полную ахинею, потому что банально перегружена контекстом.

Это как если бы ты нанял одного стажера и заставил его быть одновременно архитектором, прорабом, сантехником и бухгалтером. Формально он что-то делает, но дом развалится еще на этапе фундамента. Фреймворк MATS меняет подход: вместо одного перегруженного бедолаги он нанимает пять специализированных агентов. Каждый из них — это отдельная маленькая модель, которую натаскали (fine-tuned) строго под одну операцию. Один только чистит схему БД, другой только пишет код, третий только проверяет ошибки.

Вся магия держится на разделении ответственности и обратной связи. Сначала агент-фильтр выкидывает лишние таблицы, оставляя только нужное, чтобы не засорять память. Затем «писатель» генерирует SQL по шагам, а не одним куском. Но самое крутое — это петля обратной связи: запрос реально выполняется в базе, и если вылетает ошибка, специальный агент-исправитель берет этот лог и латает дыры. Это не гадание на кофейной гуще, а работа по факту: упало — починили — проверили снова.

Хотя систему гоняли на SQL-запросах, этот мультиагентный паттерн — абсолютный стандарт будущего для любых сложных задач. Неважно, пишешь ли ты код, анализируешь юридические документы или планируешь логистику. Вместо того чтобы раздувать одну модель до размеров Юпитера, проще и дешевле собрать конвейер из «малышей», где каждый отвечает за свой участок. SEO для баз данных превращается в четкий алгоритм, где результат зависит не от везения, а от структуры процесса.

Короче: хватит ждать чудес от одной нейронки, какой бы умной она ни казалась. Будущее за узкой специализацией и проверкой исполнения. Если модель просто «думает» — она галлюцинирует, если она выполняет код и видит ошибку — она учится. Пять маленьких моделей, работающих в связке, выносят одну большую просто за счет того, что не пытаются объять необъятное. Кто первым перейдет на такие «артели» из агентов, тот и получит работающий софт, пока остальные будут жаловаться, что AI опять всё перепутал.

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

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

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