TL;DR
Если попросить LLM оценить пересмотренный текст и при этом упомянуть, какой балл получила предыдущая версия — новая оценка тянется к этому старому числу, даже если оно случайное и никак не связано с реальным качеством текста. Модель не судит объективно — она цепляется за подсказку из контекста, как за якорь.
Учёные показали это жёстко: они специально подсовывали моделям случайный низкий балл как "предыдущую оценку" (текст при этом не менялся, был одним и тем же). Результат — 7 из 8 моделей систематически снижали новую оценку, хотя формально их об этом никто не просил. GPT-4.1, например, оценивал один и тот же текст на 5.0 из 5 без контекста и на 4.36 — когда видел, что "предыдущая попытка получила низкий балл". На уровне решений "принять/отклонить" это выливалось в падение доли принятых текстов на 22 процентных пункта у одной из моделей. И это не только про цифры: на реальных бизнес-данных с человеческой разметкой такое смещение блокировало исправление ошибок в 48% случаев и переворачивало правильный вердикт в неправильный в 10% случаев.
Хуже того — стандартные лечения не помогают. Просьба "подумай по шагам" (Chain-of-Thought) не убирает эффект. Прямое предупреждение "игнорируй предыдущую оценку" тоже не спасает числовые баллы — оно немного помогает только при категориальных решениях (типа "верно/неверно"). Единственный надёжный способ — не давать модели контекст о прошлой оценке, если вам нужна независимая проверка.
Схема того, что происходит
ПЛОХО: Промпт содержит "Это попытка №3. Предыдущий балл: 2.5"
→ LLM видит подсказку → тянет новую оценку к старому числу
→ даже если текст стал заметно лучше
ХОРОШО: Промпт не содержит истории оценок
→ LLM оценивает текст "с нуля"
→ оценка отражает реальное текущее качество
Важная деталь: эффект пороговый, не пропорциональный. Не имеет значения, был ли "прошлый балл" 1.0 или 3.9 — главное, что метаданные о прошлой оценке присутствуют. Само их наличие резко сдвигает вероятности в сторону более низкого балла, а конкретное значение анкера почти не влияет на размер сдвига.
Пример применения
Задача: Копирайтер переписывает рекламный текст для Reels/Shorts и просит ChatGPT оценить качество по шкале 1–10 после правок.
Промпт, который создаёт проблему:
Вот новая версия рекламного текста. Это третья попытка.
Предыдущая версия получила оценку 4 из 10.
Текст: {текст}
Оцени по критериям: цепляет ли заголовок, есть ли призыв к действию,
понятен ли оффер. Дай балл от 1 до 10.
Промпт без искажения:
Оцени рекламный текст по критериям: цепляет ли заголовок, есть ли призыв
к действию, понятен ли оффер. Дай балл от 1 до 10.
Текст: {текст}
Результат: В первом случае, даже если новый текст объективно сильнее, модель скорее всего выставит балл ближе к прежней "четвёрке" — потому что видит метку "это переделка, раньше было плохо". Во втором случае оценка будет отражать реальное качество текста, без привязки к истории.
Почему это работает
LLM обучались на текстах, где люди пишут именно так — воспринимают прошлую оценку как значимый сигнал и недостаточно от неё отклоняются, даже когда она нерелевантна. Это классический человеческий anchoring-эффект (эффект якоря), который модель воспроизводит функционально, не "понимая" по сути, что якорь случайный.
Токен-анализ на GPT-4.1 показал механику точнее: без метаданных о прошлой оценке модель с вероятностью 93% выбирала цифру "5", а с вероятностью 7% — "4". Как только в промпте появлялось поле "прошлый балл", вероятности переворачивались: 100% на "4" и 0% на "5". Это не тонкая подстройка под конкретное число — это переключение режима: "ага, это повторная попытка, значит, надо быть настороже".
Рычаги управления: - Убрать из промпта любые поля вида "попытка №", "предыдущий балл", "это ревизия" → получите независимую оценку. - Если нужно отслеживать прогресс между версиями — просите модель сравнивать версии напрямую ("что изменилось между версией 1 и версией 2"), а не давать новую оценку с оглядкой на старую. - Не надейтесь на "подумай шаг за шагом" как на лечение — эффект живёт не в логике рассуждений, а в самом восприятии контекста. - Явное "не учитывай предыдущую оценку" — не бесполезно, но работает только для решений вида "правильно/неправильно", не для числовых баллов.
Шаблон промпта
Универсальный принцип — не техника с шагами, а правило гигиены промпта:
Оцени {объект оценки} по критериям: {критерии}.
Дай оценку от {мин} до {макс} и короткое объяснение.
{объект оценки}: {контент}
Что убрать из промпта, если хотите непредвзятую оценку: - Номер попытки / версии - Упоминание, что это "переделка" или "revision" - Любой прошлый балл, даже как "контекст для информации"
Если нужно отслеживать прогресс без искажения:
Вот две версии {объект}. Не выставляй общий балл.
Сравни их напрямую: что стало лучше, что хуже, что не изменилось.
Версия 1: {текст_1}
Версия 2: {текст_2}
🚀 Быстрый старт — вставь в чат:
Я регулярно прошу тебя оценивать переделанные версии моего текста/кода/резюме
и упоминаю прошлый балл для контекста. Помоги мне переписать промпт для оценки
так, чтобы твоя новая оценка не зависела от того, что ты знаешь о прошлой оценке.
Моя задача: {опиши задачу}.
Модель уберёт из промпта поля с историей оценок и предложит либо "чистую" оценку с нуля, либо формат прямого сравнения версий без баллов.
Оригинал из исследования
Вот ровно та метаданная-приманка, которую исследователи добавляли в промпт, чтобы вызвать эффект (избегайте такого в своих промптах-оценщиках):
Attempt metadata:
- Attempt: k (This is a revision)
- Prior score: a
Контекст: Исследователи вставляли этот блок в промпт для LLM-судьи вместе с заданием, ответом и рубрикой. k — номер попытки, a — случайное число ниже порога принятия (0–3.99 из 5). Текст ответа при этом не менялся между условиями — единственная переменная — наличие этого блока.
Ограничения
⚠️ Не универсально по моделям: одна из восьми моделей (Llama-3.1-8B) эффекта почти не показала. Крупная модель не гарантия защиты — и не гарантия уязвимости: закономерность непредсказуема внутри одной линейки моделей.
⚠️ Стандартные лечения не помогают: просьба рассуждать по шагам (Chain-of-Thought) не снижает искажение. Прямое предупреждение "не учитывай прошлую оценку" почти не помогает для числовых баллов — работает только для категориальных решений вроде "правильно/неправильно".
⚠️ Зависит от типа задачи: ревью кода меньше подвержено эффекту, чем творческие тексты, пересказ и фактические ответы. Если вы просите оценить код — риск ниже; если просите оценить текст — риск выше.
⚠️ Проверено на ограниченном наборе: эксперимент строился на 20 фиксированных текстах и искусственно заниженных "прошлых баллах". В реальных многошаговых цепочках правок величина искажения может отличаться от измеренной.
Как исследовали
Команда взяла восемь моделей — от GPT-4.1 и Claude до открытых Llama и Qwen — и прогнала через них 192 тысячи запросов на оценку по трём вариантам одного и того же промпта: без всякой истории, с намёком "это переделка" и с полным блоком метаданных (номер попытки + случайный прошлый балл). Тексты для оценки — 20 фиксированных заданий (резюмирование, ревью кода, творческое письмо, фактические вопросы) — не менялись между условиями, только контекст вокруг них.
Чтобы отличить реальный эффект от шума повторных запросов, статистику считали не по отдельным ответам, а по задачам — через bootstrap-пересэмплирование 20 задач 10 000 раз. Это честный подход: если бы считали по всем 185 тысячам валидных ответов как по независимым точкам, результат выглядел бы куда увереннее, чем он есть на самом деле.
Самое любопытное — токен-анализ на GPT-4.1: вероятность модели выбрать цифру "5" против "4" при появлении метаданных о прошлой оценке переключалась почти мгновенно и полностью, а изменение самого значения анкера внутри "плохого" диапазона (1.0 против 3.9) почти ничего не меняло. Это намекает, что эффект — не тонкая математическая поправка, а грубое переключение "режима подозрительности", когда модель видит флаг "это ревизия с низким прошлым баллом".
Отдельно проверили на реальных бизнес-данных с человеческой разметкой (не искусственных текстах) — и там смещение подтвердилось на категориальных решениях: модель блокировала исправление собственных ошибок в 48% случаев и переворачивала правильный ответ в неправильный в 10% случаев, если видела метку "прошлая попытка получила такой-то ярлык".
Ресурсы
Kapetanovic, A., Altwlkany, K., Mercep, A., Duricic, T., Lacic, E. — Anchoring Bias in LLM-as-a-Judge Systems: Prior Scores Compromise Evaluation Independence, CIKM 2026, Infobip. Код, промпты и статистические формулы: github.com/infobip/llm-judge-bias
