3,583 papers
arXiv:2610.18157 78 13 окт. 2026 г. FREE

OAR (Ownership-Aware Routing): выбор между параллельным опросом и эстафетой по тому, у скольких владельцев лежат нужные таблицы

КЛЮЧЕВАЯ СУТЬ
Когда ответ лежит в таблицах разных отделов, параллельный опрос даёт всего 0–4% верных ответов. Эстафета на тех же вопросах выдаёт до 48%. Метод OAR позволяет агенту-координатору самому решать, как опрашивать владельцев данных: всех сразу или по очереди. Агент пишет черновик SQL-запроса только по названиям таблиц и колонок, считает владельцев и выбирает маршрут. Черновик никто не выполняет, это один лишний вызов модели. Правило без настроек и без дообучения: два владельца и больше — эстафета, один — веер.
Адаптировать под запрос
⚡

TL;DR

OAR — приём для агента-координатора, который собирает данные у нескольких владельцев (отделов, команд, систем). Владельцы выполняют запросы к своим таблицам, но сами таблицы не отдают. Перед опросом агент пишет черновик SQL-запроса только по схеме, то есть по названиям таблиц и колонок, без строк данных. Затем он считает, сколько владельцев нужно для этого запроса. Если один, он опрашивает всех параллельно («веер», fan-out). Если два и больше, он идёт по цепочке («эстафета», relay): опрашивает владельцев по очереди и подставляет полученные значения в следующий запрос. Черновик никогда не выполняется. Это один дополнительный вызов модели.

Главная находка: способ опроса решает, ответит агент вообще или нет. Когда нужные таблицы у одного владельца, веер точнее. Когда вопрос требует связать таблицы разных владельцев, веер почти не отвечает: от 0 до 4% верных ответов, а эстафета даёт до 48%. Причина простая. Чтобы выбрать нужные строки у второго владельца, нужны ключи (например, номера заказов) от первого. При параллельном опросе владельцы друг друга не видят, и ключи до второго не доходят. Агент в итоге пишет «не могу ответить». Если у эстафетного планировщика спрятать уже полученные строки, его точность падает с 23% до 5%.

Метод решает проблему тремя шагами: черновик по схеме, подсчёт владельцев, выбор протокола. Правило без настраиваемых параметров: ≥2 владельцев → эстафета, иначе веер. Обучение не нужно. На PeopleJoin OAR обошёл оба фиксированных протокола, а на BIRD остался почти вровень с лучшим.


🔬

Схема метода

ШАГ 1: Агент пишет ОДИН черновик SQL по публичной схеме (без данных) → SQL или пусто
ШАГ 2: Считает владельцев, чьи таблицы есть в FROM/JOIN → число κ
ШАГ 3: Маршрут:
        κ ≥ 2            → ЭСТАФЕТА (по очереди, ключи передаются дальше)
        κ = 1 / пусто    → ВЕЕР (параллельно, каждый отвечает сам)

Шаг 1 и шаг 2 можно сделать в одном промпте. Шаг 3 — это уже работа самого агента с инструментами.

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

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


🚀

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

Задача: Вы руководитель аналитики на маркетплейсе. Агент-аналитик ходит в два отдела. Логистика держит таблицу deliveries (order_id, pvz_city, delay_days). Маркетинг держит таблицу promos (order_id, promo_code). Ни тот, ни другой не выгружает таблицы целиком, они только выполняют запросы. Вопросы приходят разные:

  • «Сколько заказов в Казани доставлено с опозданием больше 3 дней?» — нужна только логистика.
  • «Какая средняя задержка доставки у заказов с промокодом ВЕСНА25?» — нужны обе таблицы.

Промпт (координатор):


Ты — координатор данных. Владельцы данных выполняют запросы к своим таблицам,
но строки не отдают. Тебе доступен публичный каталог (только названия таблиц и колонок).



Владелец "Логистика": deliveries(order_id, pvz_city, delay_days)
Владелец "Маркетинг": promos(order_id, promo_code)



Шаг 1. По вопросу напиши ОДИН черновик SQL-запроса по каталогу.
Черновик НЕ выполняй и никому не отправляй. Если безопасного запроса нет — оставь пустым.
Шаг 2. Выпиши таблицы из FROM и JOIN и укажи владельца каждой.
Посчитай число разных владельцев: κ.
Шаг 3. Если κ ≥ 2 → протокол RELAY. Если κ = 1, черновик пуст или таблица неизвестна → FAN-OUT.



Опрашивай владельцев по очереди, максимум 5 запросов, до 20 строк в каждом.
Сначала получи небольшой отфильтрованный набор ключей у первого владельца.
Подставь эти значения в запрос следующему владельцу.
Отвечай только по реально полученным строкам.



Отправь вопрос каждому владельцу параллельно. Каждый сам пишет один локальный запрос.
Собери ответ из результатов. Если данных нет — скажи, что вопрос неотвечаем.


Вопрос: Какая средняя задержка доставки у заказов с промокодом ВЕСНА25?
Сначала покажи шаги 1–3, затем действуй по выбранному протоколу.

Результат: Модель покажет черновик SQL с JOIN двух таблиц, список владельцев (Логистика и Маркетинг) и κ = 2. Она выберет эстафету. Сначала запросит у маркетинга order_id заказов с нужным промокодом, потом вставит эти номера в запрос к логистике. Для первого вопроса про Казань черновик будет использовать одну таблицу, κ = 1, и агент выберет веер.


🧠

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

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

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

Как метод это использует. Черновик показывает «владельческую структуру» вопроса за один вызов. По ней жёсткое правило выбирает протокол. Эстафету запускают только там, где она реально нужна, поэтому на простых вопросах агент не теряет точность веера.

Рычаги управления: - Лимит запросов и строк (5 запросов × 20 строк) → увеличь для длинных цепочек и больших выборок, уменьши для экономии токенов. - Условие маршрута (κ ≥ 2) → замени на своё: например, «есть JOIN между таблицами разных владельцев». - Пустой черновик → веер → поменяй на «спросить уточнение у человека», если не хочешь, чтобы агент гадал. - Инструкция «сначала возьми небольшой набор ключей» → это ядро эстафеты, не убирай.


📋

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


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



Владелец "{владелец_1}": {таблица_1}({колонки})
Владелец "{владелец_2}": {таблица_2}({колонки})
{...другие владельцы}



Шаг 1. Напиши ОДИН черновик SQL по каталогу для вопроса. Не выполняй его.
Если безопасного запроса нет — оставь пустым.
Шаг 2. Выпиши таблицы из FROM и JOIN, укажи владельца каждой, посчитай число
разных владельцев: κ.
Шаг 3. κ ≥ 2 → RELAY. Иначе → FAN-OUT.



Опрашивай владельцев по очереди, не более {число_запросов} запросов,
до {число_строк} строк в каждом. Сначала получи небольшой отфильтрованный
набор ключей, затем подставь эти значения в запрос следующему владельцу.
Отвечай только по реально полученным и неусечённым строкам.



Отправь вопрос каждому владельцу параллельно. Каждый пишет один локальный запрос.
Собери ответ из результатов. Если ответа нет в данных — скажи, что вопрос неотвечаем.


Вопрос: {вопрос}
Сначала покажи шаги 1–3, затем действуй по выбранному протоколу.

Подставляйте: реальных владельцев, таблицы и колонки из каталога, лимиты запросов и строк, вопрос пользователя.

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

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

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

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


⚠️

Ограничения

⚠️ Нужны владельцы с отдельными таблицами. Метод про данные, которые лежат у разных владельцев и доступны только через их запросы. Если у агента одна база без разделения, выбирать нечего.

⚠️ Нужна настройка инструментов. Сам по себе промпт не опросит владельцев. Агенту нужны инструменты вроде «выполнить запрос у владельца X». В статье это реализовано кодом.

⚠️ Абсолютная точность невысокая. Даже лучший вариант на BIRD даёт около трети верных ответов. OAR выбирает лучший протокол, но не делает вопросы лёгкими.

⚠️ Только SQL-вопросы. Проверено на запросах к таблицам. Перенос на документы, поиск или произвольные инструменты авторы не проверяли.

⚠️ Повтор эстафетой после «не знаю» не всегда полезен. На BIRD он добавляет 0,7–2,2 пункта, а на PeopleJoin чаще вредит: там отказ веера нередко и есть правильный ответ на неотвечаемый вопрос.

⚠️ Приватность. Значения-ключи, которые координатор вставляет в запрос, видит следующий владелец. Авторы это допускают как условие.

⚠️ Черновик ошибается. Он находит 59–91% многовладельческих вопросов. Пропущенные идут в веер и там почти всегда проваливаются, но это не катастрофа: потери относительно лучшего протокола небольшие.


🔍

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

Автор смоделировал организации, где таблицы разложены по владельцам. Владельцы публикуют схему, но не строки. Взяли два набора: PeopleJoin (имитация компаний с сотрудниками) и BIRD, где таблицы раздавали владельцам по хешу имени, то есть случайно и независимо от вопроса. Это важный ход: так можно отделить влияние «сколько таблиц в запросе» от влияния «у скольких владельцев они лежат». Тестировали три семейства моделей (DeepSeek, Claude Sonnet, Qwen) в 13 настройках, включая 600 вопросов, которых не было при разработке правила.

Результат оказался резким. Для JOIN двух таблиц на BIRD веер отвечал на 32–44% вопросов, когда обе таблицы у одного владельца, и на 1–4%, когда у двух. Эстафета в обоих случаях давала 22–39%. Структура запроса та же, меняется только распределение владельцев, значит решает именно владение. На PeopleJoin есть обратный случай: когда строки одной таблицы разбиты между двумя владельцами и JOIN не нужен, веер снова выигрывает. Удивляет, что решает не число владельцев, а именно JOIN через границу.

Механизм проверили прямо. Взяли эстафетного планировщика и выключили ему видимость полученных строк. Точность на двухвладельческих вопросах упала с 23,2% до 5,1%, а на одновладельческих осталась прежней. Вариант «заранее спланировать все запросы» тоже провалился (около 7%): ключи заранее не угадаешь. Практический вывод: эстафета выигрывает за счёт того, что читает результат предыдущего шага, а не за счёт большего числа вызовов.


💡

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

🔧 Техника: убрать «Сначала покажи шаги 1–3» → дешевле, но без контроля

Если маршрут уже стабильно выбирается правильно, замените последнюю строку на «Шаги 1–3 выполни молча и сразу действуй по выбранному протоколу». Токенов меньше, но проверить, правильно ли посчитан κ, станет труднее.

🔧 Техника: добавить в RELAY отчёт по каждому шагу → отладка

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

Экстраполяция (не из статьи): принцип для субагентов. Статья такого не проверяла, но идея переносится: если подзадача B нужна значение из результата подзадачи A, их нельзя запускать параллельно. Фрагмент для инструкции оркестратору в Claude Code или Cursor (проверьте на своих задачах):

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

🔗

Ресурсы

  • Работа: Fan Out or Relay? Ownership-Aware Routing for LLM Agents Querying Siloed Tables
  • Автор: Zhexi Feng, Department of Electrical and Computer Engineering, University of California San Diego
  • Датасеты: PeopleJoin (Jhamtani et al., 2025), BIRD (Li et al., 2023b), Spider (Yu et al., 2018)
  • Родственные идеи: ReAct (Yao et al., 2023), параллельные вызовы функций (Kim et al., 2024), полусоединения в распределённых БД (Bernstein & Chiu, 1981)

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

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

Когда ответ лежит в таблицах разных отделов, параллельный опрос даёт всего 0–4% верных ответов. Эстафета на тех же вопросах выдаёт до 48%. Метод OAR позволяет агенту-координатору самому решать, как опрашивать владельцев данных: всех сразу или по очереди. Агент пишет черновик SQL-запроса только по названиям таблиц и колонок, считает владельцев и выбирает маршрут. Черновик никто не выполняет, это один лишний вызов модели. Правило без настроек и без дообучения: два владельца и больше — эстафета, один — веер.

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

Две схемы опроса. Веер (fan-out): вопрос уходит всем владельцам одновременно, каждый отвечает сам. Эстафета (relay): опрашиваешь по очереди и подставляешь полученные номера в следующий запрос. Это как крикнуть в зал «кто знает?» против передачи палочки от бегуна к бегуну. Крик быстрый, но если ответ собирается из кусков, палочку надо передавать. Выбор протокола решает черновик: сколько разных владельцев стоит в нём за FROM и JOIN. Один владелец — веер. Два и больше — эстафета. Черновик пустой — тоже веер.

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

Чтобы выбрать строки у второго владельца, нужны ключи от первого, например номера заказов. При параллельном опросе владельцы друг друга не видят. Ключи до второго не доходят, и агент пишет «не могу ответить». Заранее придумать эти ключи модель не может. Поэтому «спланировать все запросы вперёд» почти не помогает. Жесть: если спрятать от эстафетного планировщика уже полученные строки, точность падает с 23% до 5%. Значит, вся сила в том, что он видит прошлые ответы и берёт из них значения. Эстафета нужна не всегда: на простых вопросах веер точнее. Поэтому её включают только там, где черновик показал несколько владельцев. На PeopleJoin OAR обошёл оба фиксированных протокола. На BIRD он остался почти вровень с лучшим.

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

Агенты-координаторы, которые собирают данные из нескольких отделов, систем или баз. Владельцы выполняют запросы, но таблицы не отдают. Особенно когда вопросы идут вперемешку: одни про один отдел, другие требуют связать два-три. Например: «средняя задержка доставки у заказов с промокодом» (логистика плюс маркетинг). НЕ подходит, если вся база у одного владельца: выбирать нечего. Не проверено на документах и поиске, только на SQL. Ждать чудес тоже не стоит: даже лучший вариант на BIRD даёт около трети верных ответов.

Мини-рецепт

1. Опиши каталог: кто владеет какой таблицей, какие у неё колонки. Только названия, без данных.
2. Заставь написать черновик: один SQL-запрос по каталогу. Не выполнять и никому не отправлять. Нет безопасного запроса — оставить пустым.
3. Посчитай владельцев: выписать таблицы из FROM и JOIN, указать хозяина каждой. Число разных владельцев — κ.
4. Выбери маршрут: κ ≥ 2 — эстафета, иначе веер.
5. Настрой эстафету: максимум 5 запросов, до 20 строк в каждом. Сначала небольшой набор ключей у первого владельца, потом подстановка во второго. Для длинных цепочек лимиты подними.
6. Запрети гадать: отвечать только по реально полученным и неусечённым строкам.
7. Подключи инструменты: агенту нужна функция «выполнить запрос у владельца X». Одним промптом это не сделать.
8. Реши, что делать с пустым черновиком: веер или уточняющий вопрос человеку.

Примеры

[ПЛОХО] : Отправь вопрос «Какая средняя задержка доставки у заказов с промокодом ВЕСНА25?» и логистике, и маркетингу параллельно и собери ответ (Логистика не знает, какие заказы с промокодом. Маркетинг не знает про задержки. Итог: «не могу ответить».)
[ХОРОШО] : Шаг 1. Напиши один черновик SQL по каталогу, не выполняй. Шаг 2. Выпиши таблицы из FROM и JOIN, укажи владельцев, посчитай число разных: κ. Шаг 3. κ ≥ 2 — опрашивай по очереди: сначала у Маркетинга возьми order_id с промокодом ВЕСНА25 (до 20 строк), потом подставь их в запрос к Логистике. Отвечай только по полученным строкам. (Черновик покажет JOIN двух таблиц, κ = 2, и агент пойдёт эстафетой.) А вот вопрос «Сколько заказов в Казани доставлено с опозданием больше 3 дней?» нужна только таблица логистики. Черновик даст κ = 1, и агент опросит всех веером, без лишней возни.
Источник: Fan Out or Relay? Ownership-Aware Routing for LLM Agents Querying Siloed Tables
ArXiv ID: 2610.18157 | Сгенерировано: 2026-10-14 23:40

Проблемы LLM

ПроблемаСутьКак обойти
Параллельный опрос источников почти не отвечает на вопросы, где данные нужно связатьВопросу нужны данные из двух источников. Второй запрос зависит от результата первого, например от номеров заказов. При параллельном опросе источники друг друга не видят. Ключи до второго не доходят. Модель не может выдумать их заранее. Агент отвечает «не могу ответить». Планирование всех запросов вперёд почти не помогает. Проблема касается любых агентов с несколькими закрытыми источникамиОпрашивай источники по очереди. Сначала возьми у первого небольшой отфильтрованный набор ключей. Подставь эти значения в запрос ко второму. Пусть агент видит все прошлые запросы и строки. Если спрятать полученные строки, точность сильно падает. Добавь в промпт: «Отвечай только по реально полученным строкам»

Методы

МетодСуть
Пробный черновик запроса — выбор между параллельным опросом и цепочкойЧто делать. Перед опросом попроси модель написать один черновик запроса только по схеме: названия таблиц и колонок, без данных. Черновик не выполняется. Затем модель выписывает таблицы из FROM и JOIN, указывает владельца каждой и считает число разных владельцев. Правило: 2 владельца и больше — опрос по цепочке. Один владелец или пустой черновик — параллельный опрос. Синтаксис: Шаг 1. Напиши ОДИН черновик SQL по каталогу. Не выполняй его. Если безопасного запроса нет — оставь пустым. Шаг 2. Выпиши таблицы из FROM и JOIN, укажи владельца каждой, посчитай число разных владельцев. Шаг 3. Если владельцев ≥ 2 → по очереди, иначе → параллельно. Почему работает: Структуру вопроса видно по черновику без всяких данных. Модель хорошо читает схему и пишет по ней SQL. Дорогую цепочку включаешь только там, где она нужна. На простых вопросах параллельный опрос остаётся точнее и быстрее. Стоит один дополнительный вызов модели. Когда да: несколько источников с закрытыми данными, вопросы разной сложности, есть публичный каталог схем. Когда нет: одна база без разделения, нет инструментов для запросов к источникам, вопросы не про таблицы. Для документов и поиска метод не проверен. Ограничения: Черновик пропускает часть многоисточниковых вопросов. Они уходят в параллельный опрос и там чаще проваливаются. Поэтому вместо пустого черновика можно попросить уточнение у человека. Условие «≥ 2 владельцев» можно заменить своим, например «есть JOIN между разными источниками»
📖 Простыми словами

Fan Out or Relay? Ownership-Aware Routing forLLMAgentsQuerying Siloed Tables

arXiv: 2610.18157

Когда AI-агент лезет в закрытые базы разных отделов, он жестко тупит на стыке данных. Обычный агент либо спамит всех сразу через параллельный опрос, либо строит громоздкий план, который рушится в 9 случаях из 10. Проблема в том, что команды не отдают таблицы целиком, а модель физически не может угадать чужие связующие ключи из воздуха. Без этих ключей любая координация превращается в полный провал.

Это как готовить ужин вскладчину с незнакомцами вслепую. Ты кричишь одновременно в две комнаты: «Купи соус к мясу, которое взял первый!», хотя первый еще даже не дошел до мясника. Формально ты раздал задачи, но на деле никто ничего не сделает: второй отдел просто не знает, к чему привязаться, и система ловит глухой облом.

Метод OAR чинит это на корню. Механика простая: агент сначала набрасывает черновой SQL-запрос только по схеме колонок, вообще не трогая строки. Этот черновик никогда не выполняется — он нужен ради одного дополнительного вызова модели, чтобы сосчитать число задетых владельцев. Если база одна — летит быстрый веер (fan-out). Если две и больше — включается эстафета (relay), где реальные данные первого отдела поэтапно подставляются в запрос второму.

Тестировали на маркетплейсе со связкой логистики и маркетинга, но принцип универсален. Любая enterprise-система с изолированными микросервисами, коммерческой тайной или параноидальным GDPR устроена именно так. Отделы никогда не сольют свои базы в общий котел, поэтому опрашивать их через динамическую цепочку — единственный адекватный путь без утечки сырых данных.

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

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

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

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