Почему «не делай X» в промптах работает хуже, чем «делай Y»
LLM плохо обрабатывает отрицания: запрещенная идея остается в контексте. Как переписать запреты в позитивные инструкции и получить предсказуемый результат.
«Не пиши шаблонно “не X, а Y”» — а он пишет.
«Не используй emoji» — и emoji появляется.
«Не галлюцинируй источники» — и выдуманные ссылки всё равно пролезают.
У LLM отрицание часто работает хуже, чем позитивная инструкция. Когда в промпте после «не» описана конкретная идея, то она попадает в контекст. Модель не видит запрет так, как мы превыкли ожидать от детерминированной машины. Она продолжает генерировать размышления — а то, что было через НЕ —парадоксальным остаётся у неё в контексте.
Это не только моё бытовое наблюдение. OpenAI в своих рекомендациях по prompt engineering прямо пишет: вместо того чтобы говорить только, чего не делать, лучше сказать, что делать вместо этого:
https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-the-openai-api
Есть и исследование про negated prompts: “Can Large Language Models Truly Understand Prompts? A Case Study with Negated Prompts”. Авторы проверяли разные LLM на задачах с отрицательными промптами и показали, что модели заметно хуже справляются с такими инструкциями: https://arxiv.org/abs/2209.12711
У людей есть похожий эффект белого медведя: попробуй не думать о белом медведе. Названный объект уже активирован в мозгу, а отрицание недостаточно надёжно его подавляет.
С нашими современными гигантскими систеными промптами, claude.md и десятками и так противоречивых инструкций такое поведение только усугубялается.
Что делать? Каждый раз, когда модель хочет добавить в промпт запрет, или СТРОГИЙ ЗАПРЕТ, я прошу вместо негативной формулировки прописать позитивную. Имхо – работает лучше.
Например:
Вместо «не выдумывай источники»:
«Давай URL только если ты открыл и проверил источник в текущем ходе. Если источника отсутствует — так и пиши».
#промптинг
Оригинал в Telegram: https://t.me/zvasilchannel/2391