3,583 papers
arXiv:2508.07598 79 10 авг. 2025 г. FREE

KeyCP++: двухэтапное reasoning для точного определения событий в тексте

КЛЮЧЕВАЯ СУТЬ
LLM видят слово "переговоры" в тексте про продажу — сразу думают про "передачу денег". Видят "убийство" — думают про "казнь". Проблема: модель зацепилась за семантически близкое слово, но не проверила определение события. KeyCP++ даёт модели чёткую структуру анализа: сначала собрать всех подозрительных (широкий поиск), потом проверить каждого по определению (строгий отбор). Фишка: два прохода вместо одного угадывания — модель предлагает кандидатов (proposal), потом объясняет для каждого подходит ли он. Результат: с 9% до 45% точности на задачах где модель путает похожие события.
Адаптировать под запрос

TL;DR

KeyCP++ — техника промптинга с двухшаговой структурой: модель сначала предлагает кандидатов (proposals), потом оценивает каждого по критериям (judgment). Основа — ключевые слова как якорь: список типичных примеров встраивается в промпт, чтобы модель понимала что искать. Работает в одном промпте, без отдельных запросов.

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

KeyCP использует список ключевых слов (примеры правильных триггеров) как якорь — делает string matching по входному тексту и показывает находки в промпте. KeyCP++ добавляет гибкость: модель сама предлагает дополнительных кандидатов (не только из ключевых слов), потом для каждого объясняет подходит ли он под определение события. Два прохода: широкий сбор → строгий отбор.


🔬

Схема метода

KeyCP (базовая версия):

1. Добавить список ключевых слов в описание события
2. String matching: найти ключевые слова во входном тексте 
3. Показать результаты matching в промпте
→ Модель делает вывод с опорой на найденные ключевые слова

KeyCP++ (с reasoning):

1. PROPOSAL: Модель предлагает кандидатов (включая не-ключевые слова)
2. JUDGMENT: Модель оценивает каждого кандидата:
 - Подходит ли под определение события?
 - Почему да / почему нет?
3. ВЫВОД: Выбирает правильный вариант на основе оценок
→ Всё происходит в одном промпте

🚀

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

Задача: Служба поддержки Ozon получает сотни отзывов ежедневно. Нужно автоматически определять случаи "грубость курьера" для приоритетной обработки жалоб.

Промпт:

Событие: "Грубость курьера"
Определение: Курьер повёл себя неуважительно, нахамил, был агрессивен или проявил непрофессионализм в общении с клиентом.

Ключевые слова (примеры): нахамил, нагрубил, орал, бросил посылку, агрессивен

Отзыв: "Курьер позвонил и сказал: 'Быстро спускайся, мне некогда тут стоять'. Когда я сказала что спущусь через 2 минуты, он отключился. Это хамство! Через минуту он снова позвонил и кричал."

Шаг 1 - Предложи кандидатов:
Какие слова/фразы указывают на грубость курьера?

Шаг 2 - Оцени каждого:
Для каждого кандидата объясни: подходит ли под определение?

Шаг 3 - Финальный вывод:
Есть ли в отзыве "грубость курьера"? Что является триггером?

Результат: Модель покажет процесс рассуждений:

  • Кандидаты: "некогда тут стоять", "отключился", "кричал", "хамство"
  • Оценки: "'Некогда тут стоять' — грубая формулировка, но не прямое хамство. 'Отключился' — невежливо, но могло быть случайно. 'Кричал' — явная агрессия, подходит под определение."
  • Вывод: ДА, грубость курьера. Триггер — "кричал".

Модель не просто ищет слово "нахамил" из списка, а анализирует поведение в контексте.


🧠

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

LLM видят слово из близкой семантической области и спешат с выводом. Как человек, который услышал "договор" и сразу подумал про сделку, хотя речь про договорённость встретиться. Модель зацепилась за слово → не проверила контекст → ошиблась.

Ключевые слова работают как примеры — показывают модели типичные случаи. Это якорь: "ищи что-то похожее на это". Но если давать только ключевые слова, модель начинает искать только их и пропускает нетипичные формулировки. "Орал на меня" найдёт, а "повышал голос" — пропустит.

Proposal-judgment добавляет гибкость: модель сначала ищет ВСЕ подозрительные слова (не только из списка), потом проверяет каждое по определению. Это как два прохода:

  1. Широкий сбор кандидатов (включая неочевидные варианты)
  2. Строгий отбор через проверку определения

Рычаги управления промптом:

  • Ключевые слова: Чем точнее примеры → точнее якорь. Но не перебарщивай — 3-5 слов достаточно.
  • Определение события: Чёткая граница "это событие / не событие" критически важна. Размытое определение = размытый результат.
  • Шаги оценки: Можно добавить "сравни с другими похожими событиями" если нужно различать смежные концепции.

Исследование показало: vanilla prompting даёт 9% точности, добавление ключевых слов → 39% (прирост 30%!), добавление reasoning → 45% (ещё +6%). Простое изменение структуры промпта утроило точность.


📋

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

Событие: {тип_события}
Определение: {определение_события}
Ключевые слова (примеры): {ключевое_1}, {ключевое_2}, {ключевое_3}

Текст для анализа:
{входной_текст}

Шаг 1 — Предложи кандидатов:
Какие слова или фразы в тексте могут указывать на {тип_события}? 
Рассмотри не только ключевые слова, но и другие формулировки.

Шаг 2 — Оцени каждого кандидата:
Для каждого предложенного кандидата объясни:
- Подходит ли он под определение "{определение_события}"?
- Почему да или почему нет?
- Какие детали контекста важны?

Шаг 3 — Финальный вывод:
На основе оценок: есть ли в тексте {тип_события}? 
Если да — какое слово/фраза является точным индикатором?
Если нет — почему ни один кандидат не подошёл?

Что подставлять:

  • {тип_события} — название события/действия которое ищешь (например: "жалоба на доставку", "смена руководства", "ошибка в системе")
  • {определение_события} — чёткое определение когда оно происходит, с границами (что включено / что исключено)
  • {ключевые_слова} — 3-5 типичных примеров слов или фраз
  • {входной_текст} — текст для анализа

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

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

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

LLM спросит: какой тип события ищешь, как его определить, какие типичные примеры. Это нужно чтобы модель правильно профилировала задачу и не путала смежные концепции (например, "покупка" и "возврат денег" оба про деньги, но разные события).


⚠️

Ограничения

⚠️ Нужно чёткое определение: Если критерий субъективный ("красиво написано") или размытый ("что-то не так"), метод не сработает. Нужна ясная граница: это событие / не событие. Без чёткого определения модель будет гадать.

⚠️ Качество ключевых слов важно: Плохие примеры = плохие результаты. Если даёшь "оплата" для события "покупка товара", модель может спутать с "возврат денег" (тоже про оплату). Ключевые слова должны быть специфичны для события.

⚠️ Не для простых задач: Если ответ очевиден с первого взгляда ("есть ли слово 'покупка' в тексте?"), метод избыточен. Работает для задач где модель путается между похожими вариантами и нужна структура рассуждений. В исследовании vanilla prompting давал 9% — это хуже чем случайное угадывание.


🔍

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

Исследователи из Пекинского университета взяли ACE2005 и WikiEvents — датасеты с размеченными событиями в новостных текстах. Проверяли на one-shot setting: это жесть — модели показывали ОДИН пример для каждого типа события (из 33 типов), потом просили найти такие же в новых текстах. Как если бы тебе показали одну фотографию кошки и сказали "теперь найди всех кошек в Instagram".

Сравнивали три подхода:

  1. Vanilla ICL — просто показать пример
  2. KeyCP — добавить ключевые слова
  3. KeyCP++ — добавить proposal-judgment reasoning

Удивительный результат на LLaMA2-13B:

  • Vanilla: 9% точности — модель просто угадывала всё подряд (high recall, очень low precision)
  • KeyCP: 39% — прирост 30% только от добавления ключевых слов!
  • KeyCP++: 45% — ещё +6%, но главное снизилось число ложных срабатываний

Для GPT-3.5 картина похожая, но менее драматичная:

  • Vanilla: 24% (лучше чем LLaMA из коробки)
  • KeyCP: 38% (+14%)
  • KeyCP++: 43% (+5%)

Почему такая разница? LLaMA2 склонна к агрессивному over-interpretation — видит похожее слово и сразу кричит "нашла!". GPT-3.5 более консервативна благодаря alignment'у. Но обе модели выиграли от структурирования промпта.

На DeepSeek-V3 получили 58% точности — это лучше чем fine-tuning специально обученной модели (DEGREE baseline показал 45%). Просто правильный промпт переплюнул специальное обучение. Вот почему промптинг — это навык.

Что удивило: Авторы ожидали что proposal-judgment даст больший прирост, но основной скачок случился от ключевых слов. Reasoning добавил стабильности и снизил ложные срабатывания, но не дал такого же wow-эффекта как якорь из примеров. Инсайт: Модели больше нужны примеры "что искать", чем объяснения "как думать".


📄

Оригинал из исследования

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

Query type: Transaction.Transfer-Money

Event description: TRANSFER-MONEY Events refer to the giving, 
receiving, borrowing, or lending money when it is not in the 
context of purchasing something.

If the following query sentence does not mention a Transaction.
Transfer-Money event, tell me there is no trigger word. Otherwise, 
please find the trigger word related to Transaction.Transfer-Money 
event in following text. Similar words are donation, give, loan, 
borrow, receive, pay.

Query: Kommersant business daily declared in a furious headline: 
"The United States is demanding that Russia, France and Germany 
pay for the Iraqi war."

The provided text mentions "pay". The word "pay" is a trigger word 
for the Transaction.Transfer-Money event because it indicates that 
money is being transferred from one party to another. In this case, 
the text states that the United States is demanding that Russia, 
France, and Germany pay for the Iraqi war.

Based on the provided text, the trigger word signifying a 
Transaction.Transfer-Money event is "pay".

Контекст: Исследователи тестировали на задаче event detection — определение типа события и конкретного слова-триггера в тексте. Это классическая NLP-задача для анализа новостей и документов. Структура с ключевыми словами и явным reasoning помогла модели не путать смежные концепции.


💡

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

💡 Адаптация для принятия решений:

Принцип proposal-judgment работает не только для извлечения информации из текста. Можно использовать для важных личных решений где есть несколько факторов и нужно не спешить с выводом.

Задача: Стоит ли мне менять работу?

Критерии принятия решения: {твои критерии — зарплата, рост, баланс жизни}

Шаг 1 — Предложи факторы:
Какие факторы из моей текущей ситуации влияют на решение о смене работы?
Рассмотри не только очевидные (зарплата), но и неочевидные.

Шаг 2 — Оцени каждый фактор:
Для каждого фактора:
- Как он влияет на решение согласно моим критериям?
- Какой у него вес?
- Какие детали важны?

Шаг 3 — Взвесь и сделай вывод:
На основе всех оценок: какое решение логичнее по моим критериям?

Результат: Модель не просто скажет "да, меняй" или "нет, оставайся", а покажет полный разбор факторов. Ты увидишь какие аргументы за, какие против, и какой вес они имеют по твоим критериям. Это как совет друга, который не спешит с выводом, а раскладывает всё по полочкам.


🔗

Ресурсы

Keyword-Centric Prompting for One-Shot Event Detection with Self-Generated Rationale Enhancements

Ziheng Li and Zhi-Hong Deng Peking University, State Key Laboratory of General Artificial Intelligence

Датасеты: ACE2005, WikiEvents Модели: LLaMA2-13B, Mistral-7B, GPT-3.5, DeepSeek-V3


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

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

LLM видят слово "переговоры" в тексте про продажу — сразу думают про "передачу денег". Видят "убийство" — думают про "казнь". Проблема: модель зацепилась за семантически близкое слово, но не проверила определение события. KeyCP++ даёт модели чёткую структуру анализа: сначала собрать всех подозрительных (широкий поиск), потом проверить каждого по определению (строгий отбор). Фишка: два прохода вместо одного угадывания — модель предлагает кандидатов (proposal), потом объясняет для каждого подходит ли он. Результат: с 9% до 45% точности на задачах где модель путает похожие события.

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

Не спрашивай "есть ли событие X в тексте?" — модель выдаст первое что придёт в голову. Дай ей процесс из двух шагов: Шаг 1 – Предложи кандидатов: "Какие слова могут указывать на событие X? Рассмотри не только очевидные, но и нетипичные формулировки." Шаг 2 – Оцени каждого: "Для каждого кандидата объясни: подходит ли под определение? Почему да/нет?" Ключевые слова работают как якорь — список из 3-5 типичных примеров показывает модели что искать. Но модель не ограничивается ими, а ищет ВСЁ подозрительное. Потом проверяет каждое по строгому определению.

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

LLM склонны к поспешным выводам. Увидели знакомое слово из близкой области → решили что это оно, не проверив контекст. Как человек услышал "договор" и сразу подумал про сделку, хотя речь про договорённость встретиться. Двухшаговая структура заставляет модель разделить поиск и проверку. Первый проход — широкий сбор (включая неочевидные варианты типа "повышал голос" вместо "орал"). Второй проход — строгая проверка каждого кандидата по определению события. Модель не может соскочить на первое что пришло в голову — она обязана объяснить ПОЧЕМУ кандидат подходит или нет. В исследовании: обычный промпт — 9% точности. Добавили ключевые слова — 39% (+30%!). Добавили двухшаговые рассуждения — 45%. Простая структура утроила точность.

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

Определение событий в текстах → конкретно для задач где модель путает похожие концепции ("покупка" vs "возврат денег", "грубость" vs "невежливость", "казнь" vs "убийство"). Особенно когда события семантически близкие, но имеют разные определения. Примеры: анализ жалоб клиентов (различать типы проблем), мониторинг новостей (различать типы инцидентов), обработка заявок в поддержку (категоризация по типу запроса). НЕ подходит: если событие очевидно с первого взгляда ("есть ли слово 'покупка'?") или критерий субъективный ("красиво написано"). Нужна чёткая граница: это событие / не событие.

Мини-рецепт

1. Определи событие чётко: Не "что-то не так", а "курьер был агрессивен: кричал, нахамил или бросил посылку". Размытое определение = размытый результат.

2. Подбери 3-5 ключевых слов: Типичные примеры события. Для "грубость курьера": нахамил, орал, бросил посылку, агрессивен. Не перебарщивай — это якорь, не исчерпывающий список.

3. Структурируй промпт в два шага:
- Шаг 1: Предложи кандидатов: какие слова/фразы указывают на {событие}? Рассмотри не только ключевые слова.
- Шаг 2: Оцени каждого: подходит ли под определение? Почему да/нет? Какие детали контекста важны?
- Шаг 3: Финальный вывод: есть ли событие? Что является точным индикатором?

4. Проверяй определение: Если модель путает смежные события — уточни границы. "Покупка" включает оплату и получение товара, "возврат денег" — только возврат без получения.

Примеры

[ПЛОХО] : Определи есть ли в отзыве грубость курьера: 'Курьер позвонил и сказал быстро спускайся, мне некогда. Потом кричал в трубку.' — модель может зацепиться за "кричал" или пропустить контекст с "некогда".
[ХОРОШО] : Событие: Грубость курьера. Определение: курьер нахамил, был агрессивен или непрофессионален в общении. Ключевые слова: нахамил, орал, бросил посылку, агрессивен. Отзыв: 'Курьер позвонил и сказал: быстро спускайся, мне некогда тут стоять. Когда я сказала что спущусь через 2 минуты, он отключился. Потом снова позвонил и кричал.' Шаг 1 – Предложи кандидатов: Какие слова указывают на грубость? Шаг 2 – Оцени каждого: Для каждого объясни подходит ли под определение. Шаг 3 – Вывод: Есть ли грубость? Что триггер? — модель пройдёт весь процесс: найдёт "некогда", "отключился", "кричал", проверит каждое по определению, выберет "кричал" как точный индикатор агрессии.
Источник: Keyword-Centric Prompting for One-Shot Event Detection with Self-Generated Rationale Enhancements
ArXiv ID: 2508.07598 | Сгенерировано: 2026-01-12 02:06

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

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

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