3,583 papers
arXiv:2610.34860 81 26 окт. 2026 г. FREE

Semantic Atoms (Tagging и Categorization): LLM размечает текст в колонку, а считает код

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

TL;DR

Semantic Atoms — это два «кирпичика» для анализа таблиц с текстом: разметка (Tagging) и выделение категорий (Categorization). Разметка получает N текстов и возвращает N значений, то есть новую колонку. Выделение категорий получает N текстов и возвращает M категорий, то есть справочник тем. Всё «смысловое» делает LLM, а сортировку, фильтры, средние и регрессию делает обычный код по готовой колонке.

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

Метод простой: каждый смысловой шаг записывает результат в явное место. Оценка раздражения 1–10 по каждой строке становится колонкой, и сортировка с регрессией берут именно её. Для тем действуют два шага: сначала categorize находит общий список тем, потом tag присваивает каждой строке тему из этого списка. Если строк тысячи, нарезка на пачки и сборка идут внутри инструмента, а агент ничего про это не знает.

🔬

Схема метода

ШАГ 1 (разметка):   tag(тексты, "оцени раздражение 1–10") → колонка из N значений
ШАГ 2 (категории):  categorize(тексты, "главные темы жалоб, до 8") → таблица из M категорий
ШАГ 3 (назначение): tag(тексты, "выбери тему из списка {темы}") → колонка из N значений
ШАГ 4 (точный счёт): сортировка / группировка / регрессия — кодом, по готовым колонкам

Правило: каждый смысловой вызов → результат сохранён и доступен следующим шагам.
Шаги 1–3 — разные запросы к модели, шаг 4 — Python/SQL/Excel-формулы.
🚀

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

Задача: Вы руководите качеством сервиса пунктов выдачи Wildberries в трёх городах. В выгрузке 3 000 отзывов: текст, оценка, город, срок ожидания заказа. Нужно понять, от чего люди злятся и где хуже всего, а ещё проверить, растёт ли раздражение с ожиданием.

Промпт (агенту с анализом данных: Claude Code, ChatGPT с Data Analysis, Cursor):

У меня файл reviews.xlsx: колонки «текст», «город», «дней_ожидания», «оценка».

Работай по правилам «семантических атомов»:
1. Смысловую работу над текстом делай только через два типа шагов:
   - TAG: на вход N отзывов, на выходе ровно N значений (по одному на отзыв, в том же порядке). Сохраняй результат НОВОЙ КОЛОНКОЙ в таблице.
   - CATEGORIZE: на вход N отзывов, на выходе список из M категорий (название + короткое описание). Сохраняй как ОТДЕЛЬНУЮ ТАБЛИЦУ.
2. Сортировку, группировку, средние и регрессию делай кодом по готовым колонкам. Не проси модель «отсортировать» или «посчитать».
3. Не пересчитывай уже размеченное: если колонка есть, используй её.

План:
- TAG «раздражение»: оцени от 1 до 10, где 1 — спокоен, 10 — крайне раздражён.
- CATEGORIZE: выдели до 8 главных тем жалоб.
- TAG «тема»: для каждого отзыва выбери ровно одну тему из полученного списка (или «другое»).
- Затем кодом: среднее раздражение по городам и темам, регрессия раздражения на дни ожидания и тему.

Если отзывов много — разбей на пачки по 100 с идентификатором строки и собери результат по идентификатору. Покажи мне итоговые таблицы и по 3 примера отзывов на тему.

Результат: Агент сначала добавит в таблицу колонки «раздражение» и «тема». Он покажет справочник из 6–8 тем с описаниями. Затем выдаст сводные таблицы по городам и темам и результат регрессии, посчитанные кодом. Все цифры можно проверить: оценки лежат в файле, а не растворились в ответе модели. Если спросить «а что будет, если взять только Казань», расчёт пойдёт по тем же колонкам без нового прогона по тексту.

🧠

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

Слабость LLM: модель плохо держит промежуточное состояние. Она нестабильна в точном счёте (сортировка 3 000 строк «на глаз», среднее, регрессия). Если один и тот же смысл («раздражение») нужно получить дважды, оценки разойдутся, потому что каждый вызов даёт свой ответ.

Сильная сторона: модель отлично понимает смысл одного текста с понятным заданием: оценить тон, выделить тему, выбрать из списка. Код, наоборот, идеально считает, но не понимает смысл.

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

Рычаги управления: - Шкала в запросе («1–10», «да/нет», «одна из: …») → чем жёстче формат, тем легче считать кодом. Свободный текст в колонке неудобен для агрегации. - Число категорий («до 8») → больше даёт детальнее, но дробит статистику. Начинайте с 5–8. - Размер пачки (100 строк) → меньше пачки устойчивее оценки, но больше вызовов. - Список категорий в запросе назначения → добавьте «другое», чтобы редкие темы не затирались. - Серия вызовов под колонку: для нескольких признаков (город, индекс, тон) делайте по одному вызову на каждый, а не один на всё.

📋

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

У меня таблица {файл} с колонками: {список_колонок}. Текстовая колонка: {текстовая_колонка}.

Работай по правилам «семантических атомов»:
1. Смысловую работу над текстом делай только двумя типами шагов:
   - TAG: на вход N текстов, на выходе ровно N значений, по одному на текст, в том же порядке. Результат сохраняй НОВОЙ КОЛОНКОЙ с идентификатором строки.
   - CATEGORIZE: на вход N текстов, на выходе список из M категорий (название + описание). Результат сохраняй ОТДЕЛЬНОЙ ТАБЛИЦЕЙ.
2. Точные операции (фильтр, сортировка, группировка, среднее, регрессия) делай кодом по готовым колонкам. Не поручай их модели.
3. Один смысл — один расчёт. Если колонка уже есть, не пересчитывай, а используй её.
4. Для открытой группировки: сначала CATEGORIZE, затем TAG «выбери одну категорию из списка {категории} или "другое"».
5. Несколько признаков = несколько TAG-вызовов, по одному на признак.

Мой запрос: {что_нужно_узнать}

Предложи план из шагов TAG / CATEGORIZE / код. Затем выполни его. Если строк больше {порог_пачки}, разбей на пачки с идентификаторами и собери результат по ним. В конце покажи итоговые таблицы и 3 примера строк на каждую категорию для проверки.

Что подставлять: {файл} и колонки — вашу выгрузку. {что_нужно_узнать} — цель на человеческом языке, например «понять, от чего зависит срок решения обращения». {порог_пачки} — обычно 100–200 строк.

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

Вот шаблон «семантических атомов» (разметка колонкой + справочник категорий + точный счёт кодом).
Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.

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

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

⚠️

Ограничения

⚠️ Нет нового качества: авторы прямо пишут, что атомы не добавляют возможностей. Это просто разумный дефолт: «разметь в колонку, потом считай». Качество разметки в среднем сопоставимо с готовыми семантическими операторами, а не лучше.

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

⚠️ Абсолютные шкалы хуже: операторы точнее воспроизводили абсолютные значения оценок. Атомы лучше сохраняли порядок. Оценка «7 из 10» не стабильна от прогона к прогону. Для порядка и сравнений годится, для пороговых решений («всё выше 7 — эскалировать») проверяйте на выборке.

⚠️ Экономия запросов — свойство реализации: «в 41,8 раза меньше вызовов» относится к конкретной системе авторов. Для вас это значит скорее «экономия токенов», а не рост качества.

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

⚠️ Только текст: метод проверяли на таблицах с текстовыми колонками. Это не про картинки, аудио и PDF с вёрсткой.

🔍

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

Идея была в том, чтобы поставить границу между «смыслом» и «точным счётом» в агентной системе. Авторы сделали агента TADA-Agent: сильная модель планирует анализ и пишет Python, а лёгкие модели выполняют вызовы tag и categorize внутри кода. Для проверки собрали TABench — 40 полных аналитических запросов на таблицах, например «найди темы, оцени тон, посчитай регрессию». Сравнивали с системой готовых семантических операторов, где такие вызовы упакованы в единые действия вроде «сортировка по смыслу», и с агентом без атомов.

Так как у многих запросов нет единственного правильного ответа, эталоном служил отложенный прогон самой системы, а судил LLM-судья. Поэтому авторы честно пишут, что измеряют согласие с эталоном, а не абсолютное качество. Итог: качество на уровне строки сопоставимо, сохранность итоговых файлов выше во всех пяти классах задач, запросов к модели не менее чем в 41,8 раза меньше. Отдельно проверили большие объёмы (разметка за пределами одного контекстного окна) и открытые юридические и биомедицинские бенчмарки с теми же вызовами. Вывод для практики: главное преимущество в повторном использовании и экономии, а не в «умности». Это важная поправка на фоне громких заявлений в этой области.

Анализ основан на доступной части статьи: введение, обзор литературы и раздел 3.2. Подробные таблицы результатов и приложения в тексте не вошли.

💡

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

🔧 Техника: добавить «справочник кодов» → стабильные метки в колонке

Если нужны не оценки, а ярлыки, зафиксируйте их заранее:

TAG «тип обращения»: выбери ровно один код из списка:
BILL — оплата, DELIV — доставка, QUAL — качество, SUPP — поддержка, OTH — другое.
Верни только код, без пояснений.

Эффект: колонку легко группировать и сравнивать между выгрузками разных месяцев.

Экстраполяция: чат без кода, на небольшой выборке. Если у вас нет агента с кодом, а строк до 200:

Вот 100 отзывов, каждый с номером. Шаг 1: верни таблицу «номер | раздражение 1–10».
Больше ничего не делай. Я посчитаю в Excel.

Затем в следующем сообщении: «Теперь выдели 6 тем жалоб», а после этого: «Присвой каждому номеру одну тему из списка». Сортировку и средние делайте в Excel. Это перенос принципа в ручной режим. Авторы такой вариант не проверяли.

🔗

Ресурсы

  • Semantic Atoms for Scalable Text Analysis in Data Analytics in the Era of LLM-Based Agents — Jinxiang Xie (Nanjing University), Zihao Li (Tsinghua University), Rui Ding, Bartuer Zhou, Shi Han, Dongmei Zhang (Microsoft Research).
  • Бенчмарк TABench (40 аналитических запросов); агент TADA-Agent; предшествующая работа CAST (Xie et al., 2026) о стабильности разметки и суммаризации.
  • Связанные системы: LOTUS, DocETL, Palimpzest; Programmatic Tool Calling (Anthropic, 2025).

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

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

Проблема: просишь агента «отсортируй жалобы по раздражению и найди тему каждой». Он оценивает раздражение один раз, а на следующем шаге оценивает заново, и цифры расходятся. Метод записывает каждую смысловую оценку в колонку таблицы, а сортировку и регрессию делает код по этой колонке. Он позволяет разбирать тысячи отзывов так, что любую цифру можно проверить в файле. Модель делает только разметку (N текстов → N значений) и выделение категорий (N текстов → M тем). Одна оценка живёт на всех шагах, а не пересчитывается заново.

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

Два вида шагов, и больше ничего. Первый: разметка. Модель читает N отзывов и возвращает ровно N значений, например раздражение от 1 до 10. Это новая колонка. Второй: категории. Модель читает N отзывов и возвращает список из M тем с описаниями. Это отдельная таблица. Для тем нужно два хода: сначала список тем, потом разметка «выбери одну тему из списка». Всё смысловое модель записывает в явное место, а всё точное считает код. Это как на кухне: повар режет и пробует, весы взвешивают. Никто не гадает вес на глаз.

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

Модель плохо держит промежуточный результат в голове. Она сбивается на точном счёте: сортировка 3 000 строк «на глаз», среднее, регрессия. Каждый новый вызов даёт свой ответ, поэтому два раза «оцени раздражение» дадут две разные колонки. Зато один короткий текст с чётким заданием («оцени тон», «выбери тему из списка») модель понимает отлично. Код делает наоборот: считает идеально, смысла не видит. Граница проходит по результату смысловой работы: он записан один раз, и все шаги читают одну и ту же колонку. Единый список тем делает темы разных строк сопоставимыми. Цифры авторов скромные. Новых возможностей нет, качество разметки примерно как у готовых инструментов. Обычный агент с кодом сохранил результат так же в 3 из 5 классов задач. Порядок строк атомы сохраняли лучше, абсолютные значения оценок хуже. Заявленная экономия в 41,8 раза по вызовам относится к системе авторов. Для вас это скорее экономия токенов.

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

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

Мини-рецепт

1. Опиши таблицу: файл, колонки, какая из них с текстом.
2. Запрети счёт в голове: «сортировку, средние и регрессию делай кодом, не проси модель посчитать».
3. Размечай в колонку: «оцени раздражение 1–10, сохрани НОВОЙ КОЛОНКОЙ, по одному значению на отзыв, в том же порядке».
4. Собери справочник тем: «выдели до 8 главных тем жалоб, название и короткое описание, отдельной таблицей». Начни с 5–8 тем.
5. Раздай темы строкам: «выбери ровно одну тему из списка или «другое»». Слово «другое» спасает редкие темы.
6. Режь на пачки: если строк больше 100–200, добавь идентификатор строки и собирай результат по нему.
7. Не пересчитывай: если колонка уже есть, берём её.
8. Проверь глазами: попроси по 3 примера отзывов на каждую тему.

Примеры

[ПЛОХО] : Вот 3000 отзывов. Отсортируй по раздражению, найди главные темы и посчитай, растёт ли раздражение с ожиданием
[ХОРОШО] : В reviews.xlsx есть колонки «текст», «город», «дней_ожидания». Шаг 1: оцени раздражение от 1 до 10 по каждому отзыву и сохрани новой колонкой. Шаг 2: выдели до 8 тем жалоб отдельной таблицей. Шаг 3: назначь каждому отзыву одну тему из списка или «другое». Шаг 4: кодом посчитай среднее раздражение по городам и темам и регрессию на дни ожидания. Порядок и цифры бери из колонок, ничего не пересчитывай. Строк много, поэтому режь на пачки по 100 с номером строки.
Источник: Semantic Atoms for Scalable Text Analysis in Data Analytics in the Era of LLM-Based Agents
ArXiv ID: 2610.34860 | Сгенерировано: 2026-10-27 23:30

Проблемы LLM

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

Методы

МетодСуть
Сначала справочник категорий, потом назначение — сопоставимые темыСначала дай модели весь набор текстов и попроси выделить список тем: выдели до 8 главных тем, название + короткое описание. Сохрани список отдельной таблицей. Затем каждому тексту назначь одну тему из этого списка: выбери ровно одну тему из {список} или "другое". Почему работает: общий словарь создаётся один раз. Все строки сравниваются с одними и теми же темами, поэтому счёт по темам имеет смысл. Если просить тему отдельно для каждой строки, формулировки разойдутся. Пункт «другое» не даёт редким темам исказить основные. Когда применять: много текстов (десятки и больше), темы заранее неизвестны, нужна статистика по темам. Как настроить: начни с 5–8 категорий. Больше категорий — детальнее, но статистика дробится. Для тысяч строк режь на пачки по 100–200 с номерами строк и собирай по номерам. Риск: при нарезке редкая, но важная тема может потеряться. Проси больше кандидатов, чем нужно в итоге. Когда не работает: мало текстов, темы уже известны (тогда сразу назначай)
📖 Простыми словами

Semantic Atoms for Scalable Text Analysis in Data Analytics in the Era of LLM-Based Agents

arXiv: 2610.34860

Заставлять LLM делать аналитику по таблицам напрямую — полный провал. Нейросети великолепно считывают скрытый подтекст, но абсолютно не умеют считать. Если скормить модели массив данных и попросить найти корреляцию, она начнёт уверенно фантазировать. Метод Semantic Atoms решает проблему радикально: он отбирает у языковой модели калькулятор и оставляет ей только распознавание смыслов.

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

Спасение кроется в двух базовых кирпичиках: разметка (Tagging) и выделение категорий (Categorization). Модель прогоняет 3 000 отзывов и превращает сырой текст в структурированные метки вроде «хамство курьера» или «битая упаковка». А дальше в дело вступает классический код: фильтры, средние значения и регрессии считаются обычным скриптом по готовой колонке, без единой галлюцинации.

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

Короче: хватит пихать сырые датасеты в промпт в надежде на чудо. LLM переводит смысл в колонку, классический код считает математику. Раздели эти задачи, и аналитика перестанет быть гаданием на кофейной гуще.

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

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

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