TL;DR
Когда просишь LLM классифицировать текст по категориям и вытаскивать цитаты-доказательства, модель систематически ломается одними и теми же способами: придумывает несуществующие цитаты, путает похожие категории, теряет нужный формат к концу ответа. Это не случайность — это пять предсказуемых типов сбоев. Исследователи выделили их и под каждый написали отдельный модуль промпта.
Главная находка: LLM не умеет одновременно держать в голове правила классификации, различать похожие категории, извлекать точные цитаты и соблюдать формат — особенно когда задача длинная и иерархическая. Без явных инструкций модель срезает углы: пропускает шаги рассуждения, "дополняет" цитату словами которых не было, смешивает категории которые звучат похоже. Классический симптом — первые 10 ответов корректны, потом формат начинает плыть и появляются "почти правильные" цитаты.
Решение: Один промпт из шести блоков, каждый из которых закрывает свой тип сбоя. M1 — XML-разметка структуры. M2 — правила разграничения похожих категорий. M3 — 4-шаговый алгоритм рассуждения до выдачи ответа. M4 — явные переменные контекста (роль, канал, тип источника). M5 — строгий контракт формата вывода. M6 — самопроверка в конце того же промпта.
Схема метода
Все 6 модулей — в одном промпте, один запрос:
M1: XML-теги → разделить инструкции, правила, задачу по блокам
M2: Правила разграничения → список "если X похоже на Y, то различай так"
M3: 4 шага до ответа → анализ контекста → разбор фраз →
извлечение цитаты → перекрёстная проверка
M4: Переменные контекста → явно передать метаданные (канал, роль, тип)
M5: Схема вывода → строгий формат с валидными парами категория+подкатегория
M6: Чеклист самопроверки → до финального вывода проверь:
формат ✓, категория валидна ✓, цитата точная ✓
Пример применения
Задача: Ты — аналитик в маркетплейсе. Нужно классифицировать отзывы покупателей Wildberries: тип проблемы, подтип и дословная цитата из отзыва. Отзывы путаются между "проблема с доставкой" и "проблема с ПВЗ", модель придумывает цитаты, а формат к пятому отзыву разваливается.
Промпт:
Ты — аналитик клиентского опыта. Задача: классифицировать отзыв покупателя
по типу проблемы, подтипу и извлечь дословную цитату-доказательство.
- Доставка > [задержка, потеря, повреждение, курьер]
- ПВЗ > [очередь, режим работы, грубость персонала, выдача не того товара]
- Товар > [качество, несоответствие описанию, брак, подделка]
- Возврат > [сложность процесса, отказ, долгий возврат денег]
ДОСТАВКА vs ПВЗ:
— Если проблема возникла В ПУТИ (до прибытия в ПВЗ) → Доставка
— Если проблема возникла НА МЕСТЕ получения → ПВЗ
— "Долго везли" → Доставка > задержка
— "Долго ждал в очереди в пункте" → ПВЗ > очередь
ТОВАР vs ВОЗВРАТ:
— Если покупатель жалуется на сам товар → Товар
— Если жалуется на процесс после обнаружения проблемы → Возврат
Перед тем как дать ответ, пройди 4 шага:
1. КОНТЕКСТ: о чём отзыв в целом, что именно не устроило покупателя?
2. ФРАЗЫ: какие конкретные слова указывают на тип проблемы?
3. ЦИТАТА: найди дословный фрагмент из отзыва (только слова из текста, ничего не добавляй)
4. ПРОВЕРКА: применил ли правила разграничения? Цитата точная? Категория валидна?
Канал отзыва: {канал — приложение / сайт / маркет}
Тип покупателя: {новый / постоянный}
Тип проблемы: [только из списка Categories]
Подтип: [только валидный подтип для выбранного типа]
Цитата: "[дословно из текста отзыва]"
Перед финальным ответом проверь:
☐ Тип проблемы из допустимого списка?
☐ Подтип валиден для этого типа?
☐ Цитата — только слова из исходного текста, без добавлений?
☐ Применил правила разграничения если категории похожи?
Если хоть один пункт не выполнен — пересмотри ответ.
Отзыв для анализа:
{текст_отзыва}
Результат: Модель покажет 4 шага рассуждения перед выводом — что поняла из контекста, какие фразы привлекли внимание, какую цитату нашла. Затем самопроверку по чеклисту. Финальный ответ — три строки: тип, подтип, цитата в кавычках. Цитата будет дословной, а не "почти такой же".
Почему это работает
LLM при структурированном извлечении ведёт себя как стажёр без инструкций: когда нет чётких правил разграничения — угадывает по звуку. "Доставка" и "ПВЗ" звучат похоже — модель выбирает случайно. Когда нет явного требования цитировать дословно — дополняет "для ясности". Когда нет формата — придумывает свой.
Метод использует то, что LLM хорошо умеет: следовать явным пошаговым инструкциям. Если написать "сначала сделай шаг 1, потом шаг 2, потом проверь по списку" — модель следует этому гораздо точнее, чем абстрактному "будь точным". Каждый модуль промпта убирает одну причину для ошибки, не оставляя места для интерпретации.
Рычаги управления: - M2 (правила разграничения) — главный рычаг качества. Чем больше пар похожих категорий разобрать явно, тем меньше ошибок на границах - M3 (4 шага) — можно добавить шаги или убрать лишние для простых задач; для коротких отзывов достаточно 2 шагов - M6 (чеклист) — расширяй под свои требования: добавь "☐ Тональность нейтральная?" или "☐ Указан конкретный продукт?" - M4 (метаданные) — дополнительные переменные сужают пространство решений: тип пользователя часто меняет интерпретацию
Шаблон промпта
{роль_и_задача}
{иерархический_список_категорий_с_подкатегориями}
{категория_А} vs {категория_Б}:
— Если {признак_1} → {категория_А}
— Если {признак_2} → {категория_Б}
— Пример: "{пример_фразы}" → {правильная_категория}
Перед ответом пройди 4 шага:
1. КОНТЕКСТ: {что нужно понять из текста}
2. ФРАЗЫ: {какие сигналы искать}
3. ИЗВЛЕЧЕНИЕ: {что вытащить — цитату / данные / признак}
4. ПРОВЕРКА: {применил правила? результат корректен?}
{переменная_1}: {значение_1}
{переменная_2}: {значение_2}
{поле_1}: [только из допустимых значений]
{поле_2}: [только валидное для поля_1]
{поле_3}: "[дословно из текста / строгий формат]"
Перед финальным ответом проверь:
☐ {проверка_1}?
☐ {проверка_2}?
☐ {проверка_3}?
Если не выполнено — пересмотри.
Текст для анализа:
{входной_текст}
Что подставлять:
- {иерархический_список_категорий} — твоя классификация, два уровня: тип > [подтипы]
- {правила_разграничения} — пары похожих категорий + как отличить, можно добавить примеры фраз
- {4 шага} — адаптируй под задачу: для отзывов это контекст/фразы/цитата/проверка, для анализа договора это будет иначе
- {метаданные} — всё что влияет на классификацию: тип клиента, канал, дата, роль
- {чеклист} — 3-5 конкретных условий корректного ответа
🚀 Быстрый старт — вставь в чат:
Вот шаблон 6-модульного промпта для структурированного извлечения.
Адаптируй под мою задачу: {твоя задача — например, классификация
жалоб клиентов по типу с цитатой из текста}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит про категории, подкатегории, какие пары чаще путаются и какой формат вывода нужен — потому что именно эти данные заполняют M1–M6 и делают промпт работающим.
Ограничения
⚠️ Нужны готовые категории: Метод работает, когда классификация задана заранее. Для открытой кластеризации ("найди сам что объединяет отзывы") — не подходит.
⚠️ Правила разграничения писать вручную: M2 требует человеческой экспертизы. Если сам не знаешь чем отличается "жалоба на курьера" от "жалобы на доставку" — промпт не поможет. Выписывай примеры из реальных случаев.
⚠️ Длинный промпт — длинный ответ: 6 модулей + 4 шага рассуждения = много токенов. На больших объёмах (100+ документов) учитывай стоимость и время. Для простых задач убирай M3 или сокращай до 2 шагов.
⚠️ STaR-DRO — не для чата: Вторая часть исследования (метод дообучения на жёстких группах) требует GPU, датасеты и обучение модели. Для обычного пользователя ChatGPT/Claude недоступна. Весь практический выход — в 6-модульном промпте.
Ресурсы
Статья: STaR-DRO: Stateful Tsallis Reweighting for Group-Robust Structured Prediction
Авторы: Samah Fodeh, Ganesh Puthiaraju, Elyas Irankhah, Linhai Ma, Srivani Talakokkul, Afshan Khan, Sreeraj Ramachandran, Jordan Alpert, Sarah Schellhorn
Организации: Yale University (New Haven, CT), Cleveland Clinic, Yale School of Medicine
Бенчмарк: EPPC Miner — извлечение иерархических меток коммуникации из переписки пациент–врач
Контакт: samah.fodeh@yale.edu
