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 добавляет гибкость: модель сначала ищет ВСЕ подозрительные слова (не только из списка), потом проверяет каждое по определению. Это как два прохода:
- Широкий сбор кандидатов (включая неочевидные варианты)
- Строгий отбор через проверку определения
Рычаги управления промптом:
- Ключевые слова: Чем точнее примеры → точнее якорь. Но не перебарщивай — 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".
Сравнивали три подхода:
- Vanilla ICL — просто показать пример
- KeyCP — добавить ключевые слова
- 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
