TL;DR
SheetBrain — метод для точной работы LLM со сложными Excel-таблицами через три этапа: понять структуру → выполнить через код → проверить результат. Вместо того чтобы сразу пытаться ответить на вопрос, система сначала создаёт резюме таблицы (цель, связи между листами, структура данных) и выделяет важные для задачи части. Затем решает задачу через Python-код в песочнице с pandas, храня данные в переменных вместо текстового описания. В конце проверяет корректность ответа и при ошибках перезапускает с учётом фидбека.
Главная находка: LLM используют два подхода к таблицам — neural dataflow (описывают данные текстом и держат в контексте) и symbolic dataflow (хранят в переменных типа DataFrame и работают кодом). Для больших таблиц neural подход проваливается — контекст переполняется. Например, нужно отфильтровать 100,000 строк и посчитать среднее: засунуть всю таблицу в контекст невозможно, а код справляется парой строк. Для малых таблиц со сложной иерархией neural иногда лучше — LLM видит всю структуру сразу и распознаёт паттерны без пошагового разбора кодом. Ещё одна проблема: при пошаговом выполнении агент зацикливается на локальных деталях из одного шага и теряет глобальный контекст. Например, правильно извлёк числа, но не заметил иерархию "родитель → подкатегории" и посчитал суммарно родителя И его детей — двойной подсчёт.
Суть метода: SheetBrain делит работу на три модуля. (1) Understanding — анализирует таблицу и создаёт резюме со структурой и инсайтами для задачи (например, "каждый пользователь занимает отдельный многострочный блок → итерируй по блокам, а не по строкам"). (2) Execution — решает задачу через Python-код в песочнице, используя pandas и кастомные инструменты для Excel (поиск с опечатками, извлечение формул, проверка форматирования ячеек). Работает итеративно: код → результат → новый код → результат, до завершения задачи. (3) Validation — проверяет логику решения и ответ по чек-листу (правильность извлечения данных, полнота, соответствие вопросу). При провале даёт фидбек модулю Execution для переделки.
Схема метода
ЭТАП 1 [Understanding]: Анализ таблицы
│
├─ Шаг 1.1: Резюме таблицы → [цель таблицы, связи между листами, структура]
└─ Шаг 1.2: Инсайты для задачи → [какие строки/столбцы важны, рекомендации]
ЭТАП 2 [Execution]: Решение через код (итеративно)
│
└─ Цикл: Рассуждение → Код Python → Выполнение → Результат → повтор
(до завершения задачи)
ЭТАП 3 [Validation]: Проверка
│
├─ Оценка: логика + корректность данных + соответствие вопросу
└─ Если провал → фидбек в Execution → новая итерация
Все три этапа выполняются в одном промпте (с многошаговой генерацией), но можно разбить на отдельные запросы для лучшего контроля.
Пример применения
⚠️ Ограничения метода: Требует использования Code Execution (Python с pandas). Для простых таблиц, которые полностью помещаются в контекст, может быть избыточен — прямой neural reasoning иногда эффективнее.
Задача: Ты финансовый аналитик в российской компании. Из 1С выгрузили огромную таблицу транзакций (150,000 строк) по всем филиалам. Табель сложный — в нём есть и обычные строки, и строки-детализации типа "из них: НДС", "в т.ч. комиссия". Нужно посчитать общую выручку по Московскому филиалу за Q4 2024, но не задваивая суммы из детализирующих строк.
Промпт:
Загрузи файл transactions_q4.xlsx в pandas DataFrame.
ШАГ 1 — ПОНИМАНИЕ СТРУКТУРЫ:
Сначала проанализируй таблицу и создай резюме:
- Какая цель этой таблицы? (например, учёт транзакций)
- Как организованы данные? (есть ли иерархия, подкатегории, связанные листы)
- Для моей задачи (выручка Москва Q4 2024): какие колонки/строки важны?
- ВАЖНО: проверь, есть ли строки-детализации (типа "из них", "в т.ч.") — их нельзя суммировать с родительскими строками, иначе будет двойной подсчёт
ШАГ 2 — ВЫПОЛНЕНИЕ ЧЕРЕЗ КОД:
Напиши Python-код с pandas:
1. Отфильтруй строки: филиал = "Москва", период = Q4 2024
2. КРИТИЧНО: исключи строки-детализации (начинаются с "из них", "в т.ч.", "в том числе" и т.п.)
3. Посчитай сумму по колонке "Выручка"
Покажи промежуточные результаты: сколько строк осталось после фильтрации, какие категории вошли в сумму.
ШАГ 3 — ПРОВЕРКА:
Перед финальным ответом проверь:
- Не включил ли детализирующие строки в сумму? (иначе задвоение)
- Корректно ли определён период Q4 (октябрь-декабрь)?
- Соответствует ли результат вопросу?
Если есть ошибка — исправь код и пересчитай.
Финальный ответ: одно число — выручка Московского филиала за Q4 2024 (в рублях).
Результат:
Модель выполнит три этапа:
- Понимание: Покажет структуру таблицы — обнаружит, что есть строки "Выручка всего" и подстроки "из них: НДС", "в т.ч.: комиссия". Определит, что для Q4 нужны месяцы 10-12, а не квартал в бухгалтерском смысле.
- Выполнение: Выведет код на Python с пояснениями — фильтр по филиалу, периоду, исключение детализаций. Покажет промежуточные результаты: "Исходно 150к строк → после фильтра 3,200 строк → после исключения детализаций 1,890 строк основных категорий". Даст сумму.
- Проверка: Убедится, что в итоговую сумму не попали строки "из них" или "в т.ч.", подтвердит корректность периода. Если найдёт ошибку (например, забыл исключить "в том числе") — перезапустит код с исправлением.
Финальный ответ: точное число в рублях, например "Выручка Московского филиала за Q4 2024: 47,325,891 ₽".
Почему это работает
Слабость LLM: При работе с большими таблицами модель не может удержать все данные в контексте. Если пытаться описать 100,000 строк текстом — контекст переполняется, модель теряет детали, начинает галлюцинировать цифры. При пошаговой работе модель зацикливается на локальной информации из одного шага (например, "вот числа из этих строк") и теряет глобальный контекст (например, что эти строки — детализация родительской категории, и их нельзя суммировать вместе). Ещё одна слабость: подход "покажи первые 5 строк" (df.head()) даёт урезанное представление о структуре — модель может не заметить иерархию, подкатегории, нестандартные заголовки.
Сильная сторона LLM: Модель отлично генерирует код и следует структурированным инструкциям. Если данные хранятся в переменной (DataFrame), модель пишет точный код для фильтрации, группировки, подсчёта — без потери информации. Модель умеет распознавать паттерны в структуре (например, "строки с отступом — это детализация") и итеративно уточнять решение, если дать фидбек.
Как метод использует сильную сторону: SheetBrain переносит данные из текстового описания в символьное представление (код + переменные). Вместо "опиши таблицу словами и держи в контексте" → "загрузи в DataFrame и работай кодом". Это убирает ограничение на размер контекста. Перед началом работы метод создаёт глобальное понимание структуры через резюме — это заменяет слепой df.head() и помогает заметить иерархии, связи между листами, нестандартные форматы. Итеративный цикл "код → результат → новый код" позволяет модели корректировать стратегию на ходу вместо одноразового выполнения. Финальная валидация с глобальным контекстом (а не только локальными деталями из последнего шага) ловит ошибки типа двойного подсчёта или игнорирования структуры.
Рычаги управления:
- Глубина резюме структуры — можешь попросить более детальное описание ("опиши каждый лист отдельно") или краткое ("только ключевые моменты") в зависимости от сложности таблицы.
- Детализация промежуточных шагов — добавь "покажи результат после каждого фильтра" для отладки или убери для краткости.
- Строгость проверки — можешь указать конкретные критерии валидации ("проверь, что сумма не превышает X") или оставить общую проверку.
- Стратегия выполнения — для малых таблиц со сложной структурой можешь попросить neural reasoning ("распознай паттерн в структуре напрямую, без кода"), для больших — только код.
Шаблон промпта
Загрузи файл {название_файла} в pandas DataFrame.
ШАГ 1 — ПОНИМАНИЕ СТРУКТУРЫ:
Проанализируй таблицу и создай резюме:
- Какая цель этой таблицы?
- Как организованы данные? (листы, иерархия, связи)
- Для задачи "{твоя_задача}": какие колонки/строки важны?
- {специфичные_для_задачи_вопросы} (например: "Есть ли строки-детализации?")
ШАГ 2 — ВЫПОЛНЕНИЕ ЧЕРЕЗ КОД:
Напиши Python-код с pandas:
{шаги_решения}
Покажи промежуточные результаты: {что_показать}.
ШАГ 3 — ПРОВЕРКА:
Перед финальным ответом проверь:
{критерии_проверки}
Если ошибка — исправь и пересчитай.
Финальный ответ: {формат_ответа}
Плейсхолдеры:
{название_файла}— имя файла таблицы (например, "sales_data.xlsx"){твоя_задача}— описание задачи своими словами (например, "посчитать выручку по филиалам за квартал"){специфичные_для_задачи_вопросы}— дополнительные вопросы для понимания структуры под твою задачу (опционально){шаги_решения}— конкретные шаги кода (например, "1. Отфильтруй по дате 2. Исключи детализации 3. Посчитай сумму"){что_показать}— какие промежуточные результаты нужны (например, "сколько строк осталось после фильтра"){критерии_проверки}— на что обратить внимание при проверке (например, "нет двойного подсчёта"){формат_ответа}— в каком виде нужен результат (число, таблица, список)
Ограничения
⚠️ Требует Code Execution: Метод работает только в окружении с возможностью запуска Python-кода (ChatGPT Code Interpreter, Claude с включённым Code Execution). В обычном чате без Code Execution не применим.
⚠️ Избыточен для простых таблиц: Если таблица маленькая (до 1000 строк) и полностью помещается в контекст, трёхэтапный подход может быть избыточен — прямой neural reasoning (LLM видит всю таблицу и распознаёт паттерны) иногда быстрее и эффективнее.
⚠️ Барьер для новичков: Нужно понимать базовые концепции работы с таблицами в pandas (DataFrame, фильтрация, группировка). Если пользователь не знаком с этим, придётся либо учиться, либо полностью доверять коду модели.
⚠️ Кастомные инструменты недоступны: В исследовании использовались специальные функции для поиска в Excel с опечатками, извлечения формул, проверки форматирования ячеек — эти инструменты не доступны в стандартном Code Execution. Часть функционала придётся воссоздавать вручную через стандартные методы pandas.
Как исследовали
Исследователи протестировали SheetBrain на 4 бенчмарках: MultiHiertt (численные вычисления над иерархическими таблицами с текстом), RealHiTBench (реальные сложные таблицы из практики), SpreadsheetBench (манипуляции с таблицами — редактирование, формулы, изменение структуры) и собственный SheetBench (69 кейсов со сложными, большими, многолистовыми таблицами). Сравнивали с vanilla LLM (GPT-4.1, o4-mini, DeepSeek-R1, Qwen-3) и другими агентами (StructGPT, SheetAgent). Для fair comparison все агенты использовали одну и ту же базовую модель — GPT-4.1.
Почему пришли к таким выводам: SheetBrain обогнал vanilla GPT-4.1 на 9.1% в MultiHiertt, на 8.3% в RealHiTBench, особенно сильно в задачах fact-checking (+10%) — это показало, что модуль валидации критичен именно для проверки консистентности и перекрёстных ссылок. В SpreadsheetBench (редактирование таблиц) SheetBrain обогнал SheetAgent на 15%, причём ещё сильнее на cell-level задачах — это подтвердило, что symbolic dataflow (код с переменными) точнее neural dataflow (текстовое описание) для детальных манипуляций. На собственном SheetBench результаты были самыми показательными: SheetBrain решил 55 из 69 задач, vanilla GPT-4.1 — 34, BizChat (проприетарный агент Microsoft) — 47. Разрыв особенно заметен на категории "Large Sheets" (большие таблицы): SheetBrain — 11/20, vanilla GPT-4.1 — 1/20, BizChat — 9/20. Это прямо подтвердило главный тезис: для больших таблиц symbolic подход (код в песочнице) критичен, neural подход (текст в контексте) проваливается из-за переполнения контекста.
Что удивило: В одном из Case Analysis (Case 4) neural reasoning выиграл у symbolic на малой таблице со сложной иерархией. Symbolic подход пропустил важную деталь структуры ("of which breakdown items" — подкатегории в заголовках строк), потому что парсил таблицу пошагово через код. Neural подход, видя всю таблицу в контексте, распознал этот паттерн холистически и дал правильный ответ. Это показало, что стратегия должна адаптироваться: для больших таблиц — код, для малых со сложной структурой — прямой neural reasoning. Исследователи подтвердили это экспериментально: добавление "подумай, какую стратегию использовать (код vs neural) в зависимости от размера и структуры таблицы" улучшило точность.
Инсайт для практики: Слепой подход "просто загрузи df.head() и начни работать" — это главная причина провалов ChatGPT и других агентов на сложных таблицах. Они видят первые 5 строк, упускают иерархию, не замечают нестандартные заголовки — и вся дальнейшая работа идёт насмарку. SheetBrain решает это через comprehensive overview перед началом: модель анализирует всю структуру (хотя бы на уровне метаданных — количество листов, диапазоны данных, типы колонок), создаёт резюме, и только потом начинает работать. Это как разница между "вбежал в незнакомое здание и начал искать комнату" vs "сначала посмотрел на план этажей". Второй вариант эффективнее.
Адаптации и экстраполяции
💡 Адаптация для работы без Code Execution — упрощённый двухэтапный подход:
Если у тебя нет доступа к Code Execution, но таблица достаточно мала, чтобы поместиться в контекст, можешь использовать упрощённый двухэтапный подход из метода:
Шаг 1 — Понимание структуры (отдельный промпт):
Вот таблица [вставить таблицу или описание]. Проанализируй её структуру и дай резюме: - Какая цель этой таблицы? - Как организованы данные? (есть ли иерархия, группировки, нестандартные заголовки) - Для задачи "{твоя_задача}": какие строки/колонки важны? - Есть ли подводные камни? (детализирующие строки, вложенные категории, особое форматирование) НЕ решай задачу сейчас, только дай понимание структуры.Шаг 2 — Решение задачи с учётом структуры (новый промпт):
Вот таблица: [вставить] Вот понимание структуры из предыдущего шага: [вставить резюме] Теперь реши задачу: {твоя_задача} Перед финальным ответом проверь: - Не пропустил ли важные детали структуры? - Нет ли двойного подсчёта или других ошибок? Если нашёл ошибку — исправь и дай правильный ответ.Разделение на два промпта имитирует модульность SheetBrain и помогает избежать "слепого" решения без понимания структуры.
🔧 Техника: Явное указание стратегии (code vs neural) → адаптивный подход
Как показало исследование, для разных таблиц эффективны разные подходы. Можешь явно указывать стратегию в промпте:
Перед решением задачи определи, какой подход использовать: - Если таблица БОЛЬШАЯ (>10,000 строк) или задача требует сложных вычислений → используй CODE (загрузи в DataFrame, работай через pandas) - Если таблица МАЛАЯ (<1,000 строк) и имеет СЛОЖНУЮ СТРУКТУРУ (многоуровневые заголовки, нестандартная иерархия) → используй NEURAL REASONING (распознай паттерн структуры холистически, без кода) Сообщи, какой подход выбрал и почему.Это заставляет модель саморефлексировать о стратегии вместо автоматического выбора одного подхода для всех случаев.
🔧 Техника: Добавление промежуточных "контрольных точек" → прозрачность + отладка
В оригинальном методе модель показывает промежуточные результаты на каждом шаге кода. Можешь усилить это:
После каждого шага фильтрации/преобразования данных выведи: - Сколько строк/записей осталось - Какие категории/значения попали в результат - Примеры (первые 3-5 записей) Это поможет проверить, что фильтрация работает правильно, и заметить ошибки на ранних этапах.Это особенно полезно при работе с незнакомыми данными — видишь "ага, после фильтра осталась только одна запись, хотя ожидал сотни" → сразу понятно, что фильтр слишком строгий.
Ресурсы
SheetBrain: A Neuro-Symbolic Agent for Accurate Reasoning over Complex and Large Spreadsheets
Авторы: Ziwei Wang (Carnegie Mellon University), Jiayuan Su (Zhejiang University), Mengyu Zhou (Microsoft Research), Huaxing Zeng (Brown University), Mengni Jia (University of Cambridge), Xiao Lv, Haoyu Dong, Xiaojun Ma, Shi Han, Dongmei Zhang (Microsoft Research)
Код: https://github.com/microsoft/SheetBrain
Бенчмарк SheetBench включён в репозиторий
