TL;DR
DE-NER — техника извлечения сущностей (имён, организаций, дат, терминов) из текста, где модель не выдаёт ответ сразу, а сначала прогоняет внутренний диалог: делает черновой вариант, потом в роли "Вопрошающего" задаёт себе уточняющий вопрос про слабое место в этом варианте, в роли "Отвечающего" отвечает на него, опираясь только на текст, и после нескольких раундов в роли "Финализатора" выдаёт итоговый список.
Модели плохо справляются с извлечением сущностей именно там, где есть неоднозначность — непонятно, к какому типу отнести объект, где заканчивается название, не пропущено ли что-то. В одну попытку модель "застревает" на первой догадке и не пересматривает её. На категории смешанных/спорных сущностей (типа "разное") точность в одношаговом промпте была катастрофически низкой — около 21%.
DE-NER разбивает эту неоднозначность на конкретные узкие вопросы по 4 категориям: тип неясен, граница спорная, сущность пропущена, тип назначен неверно. За 2-4 раунда такого самоопроса модель находит и исправляет ошибки черновика, прежде чем дать финальный ответ.
Схема метода
ШАГ 0 (один запрос): Черновой список сущностей → без диалога, просто "извлеки сущности"
Повторить N раз (N = 2-4):
ШАГ N.1 (роль "Вопрошающий"): Один уточняющий вопрос по категории
[тип неясен / граница спорная / пропущена сущность / тип неверен]
→ текст вопроса
ШАГ N.2 (роль "Отвечающий"): Ответ на вопрос строго по тексту
→ текст ответа
ШАГ ФИНАЛ (роль "Финализатор"): Итоговый список сущностей с учётом всего диалога
→ финальный JSON-список
Все шаги можно выполнить в одном промпте — модель проигрывает все роли последовательно в одном ответе.
Пример применения
Задача: Ты SMM-менеджер, и тебе нужно из дайджеста новостей про российские IT-стартапы вытащить упоминания компаний, персон и продуктов — для тегов в посте. Текст полон сокращений и неоднозначностей: "Т-Банк" — это компания или продукт другой компании, "Точка" — банк или просто слово.
Промпт:
Ты выполняешь задачу извлечения сущностей через внутренний диалог с самим собой.
ТЕКСТ: «Т-Банк совместно с командой Точка запустил пилот нового сервиса Юmoney Pro.
В презентации участвовал основатель Точки Дмитрий, а также представитель ЦБ.»
ТИПЫ СУЩНОСТЕЙ: Компания, Продукт, Персона, Организация
Выполни по шагам, показывая каждый шаг:
ШАГ 0 — Черновой ответ:
Извлеки сущности из текста. Выведи список в формате [Сущность: Тип].
Повтори 3 раза следующий цикл:
ШАГ N.1 — Вопрошающий:
Посмотри на черновой ответ и историю диалога. Задай ОДИН уточняющий вопрос,
который лучше всего поможет исправить ошибку. Вопрос должен относиться к одной из категорий:
- [Неоднозначность типа] — тип сущности неясен
- [Спорная граница] — неясно, где начинается/заканчивается сущность
- [Пропущенная сущность] — возможно, упущена сущность
- [Ошибка типа] — сущность может быть неправильно классифицирована
Не повторяй вопросы, которые уже были заданы.
ШАГ N.2 — Отвечающий:
Ответь на этот вопрос, опираясь СТРОГО на текст, не выдумывай.
ФИНАЛЬНЫЙ ШАГ — Финализатор:
Учитывая весь диалог выше, выведи финальный список сущностей
в формате [Сущность: Тип].
Результат: Модель покажет черновой список (вероятно, спутает "Точка" как продукт vs компанию, упустит "ЦБ" как организацию), затем 3 раунда внутренних вопросов-ответов вида "Точка в тексте — это название сервиса или отдельной компании?", "ЦБ упомянут как организация — это пропущенная сущность?". В финале — уточнённый список, где такие спорные случаи разрешены с опорой на контекст, а не угаданы с первого раза.
Почему это работает
Модель, отвечая на всё сразу, не может пересмотреть свою первую догадку — она просто выдаёт текст один раз и на этом останавливается. Особенно плохо это работает на объектах, которые можно отнести к разным категориям одновременно.
Но модель отлично отвечает на узкий конкретный вопрос. Спросить "это организация или продукт?" — гораздо точнее, чем сразу просить "найди все сущности и определи их тип".
DE-NER использует эту разницу: превращает одну сложную неоднозначную задачу в серию узких точных вопросов, а черновой ответ — в чек-лист, который модель сама себе проверяет и исправляет.
Рычаги управления: - Число раундов (N) — 2-4 в исследовании; для простых текстов хватит 2, для сложных (юридические, медицинские) стоит попробовать 4. - Категории вопросов — можно заменить под свою задачу. Для анализа отзывов клиентов вместо "тип неясен" подойдёт "тональность неясна" или "категория товара под вопросом". - Роли — можно дать более конкретные персоны ("ты дотошный редактор, который придирается к каждому слову") для более острых вопросов.
Шаблон промпта
Ты выполняешь задачу извлечения сущностей через внутренний диалог с самим собой.
ТЕКСТ: {текст}
ТИПЫ СУЩНОСТЕЙ: {типы_сущностей}
Выполни по шагам, показывая каждый шаг:
ШАГ 0 — Черновой ответ:
Извлеки сущности из текста. Выведи список в формате [Сущность: Тип].
Повтори {число_раундов} раз следующий цикл:
ШАГ N.1 — Вопрошающий:
Посмотри на черновой ответ и историю диалога. Задай ОДИН уточняющий вопрос,
который лучше всего поможет исправить ошибку. Вопрос должен относиться к одной из категорий:
- [Неоднозначность типа] — тип сущности неясен
- [Спорная граница] — неясно, где начинается/заканчивается сущность
- [Пропущенная сущность] — возможно, упущена сущность
- [Ошибка типа] — сущность может быть неправильно классифицирована
Не повторяй вопросы, которые уже были заданы.
ШАГ N.2 — Отвечающий:
Ответь на этот вопрос, опираясь СТРОГО на текст, не выдумывай.
ФИНАЛЬНЫЙ ШАГ — Финализатор:
Учитывая весь диалог выше, выведи финальный список сущностей
в формате [Сущность: Тип].
Подставь {текст} — фрагмент, из которого нужно извлечь объекты, {типы_сущностей} — список категорий (компании, персоны, продукты, локации и т.д.), {число_раундов} — 2-4, больше раундов для более неоднозначных текстов.
🚀 Быстрый старт — вставь в чат:
Вот шаблон DE-NER для извлечения сущностей через самодиалог. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит какие категории сущностей тебе нужны и сколько раундов уточнений сделать — потому что метод работает через конкретные категории неоднозначности, а не абстрактный список.
Ограничения
⚠️ Слабые модели проигрывают: на компактной модели этот диалог давал результат хуже, чем простой прямой запрос — без хорошей базы знаний диалог не помогает, а даже мешает.
⚠️ Примеры (few-shot) вредят: если добавить в промпт готовые примеры разметки, точность падает, и чем больше примеров — тем хуже. Метод рассчитан на рассуждение по конкретному случаю, а не на подгонку под образцы.
⚠️ Проверено только на извлечении сущностей: авторы прямо пишут, что не тестировали метод на других задачах анализа текста — для других типов извлечения информации нужна проверка.
Как исследовали
Исследователи взяли три эталонных набора текстов — новости (CoNLL03), статьи из Википедии (WikiGold) и биомедицинские тексты (GENIA) — и сравнили три подхода: обычный прямой запрос, диалог без дообучения и полный DE-NER с обученным "Вопрошающим". Вопрошающего дообучали без разметки: модель прогоняла диалог несколько раз с разной "температурой", выбирала самый частый ответ голосованием и учила модель повторять именно тот путь рассуждений, который привёл к этому ответу.
DE-NER в среднем дал прирост в 3.75 балла точности по сравнению с конкурентами, но самое интересное — прирост оказался неравномерным: на чётких категориях (имена людей) улучшение было небольшим, а на смешанной/спорной категории — почти +28 баллов. Это подтверждает главный вывод: диалог помогает именно там, где есть неоднозначность, а не улучшает всё подряд.
Неожиданным результатом стало то, что добавление примеров-подсказок (few-shot) портило результат — авторы объясняют это тем, что метод заточен под рассуждение о конкретном тексте, а фиксированные примеры сбивают модель на поверхностные паттерны вместо разбора конкретного случая.
Ресурсы
DE-NER: Zero-shot Named Entity Recognition via Dialogue Elicitation of Large Language Models — Xuankang Zhang, Jiangming Liu, Yunnan University. Код: github.com/kkkenshi/DE-NER
