TL;DR
Agri-CPJ — техника трёхэтапного анализа, где модель сначала фиксирует наблюдения в виде структурированного описания (без каких-либо названий и классификаций), потом генерирует два конкурирующих ответа с разных углов, и наконец — судья-LLM выбирает лучший с обоснованием. Ключевая механика: принудительный запрет на выводы до того, как зафиксированы факты.
Главная находка: LLM ошибается не потому что "не видит" — она видит правильно. Проблема в другом: модель прыгает к выводу ещё до того, как описала, что именно наблюдает. Дальше она строит объяснение под уже выбранный ответ — то, 77% верно, то откровенный провал, в зависимости от случайных деталей промпта. Это не "нестабильность" — это якорный эффект: вывод появляется раньше доказательной базы, и доказательства уже подтягиваются под него.
Метод разрывает этот цикл жёстким разделением на три независимых шага. Сначала — только наблюдения, без ярлыков. Потом — два конкурирующих анализа с разных позиций. В конце — явный выбор с обоснованием. Критически важно: в описании на первом шаге категорически запрещено называть итоговые классы/диагнозы — именно это предотвращает "утечку метки" через промежуточный текст.
Схема метода
Три отдельных запроса к модели последовательно:
ШАГ 1: НАБЛЮДЕНИЕ (отдельный запрос)
Вход: изображение/материал + few-shot примеры описаний
Задача: описать только наблюдаемые факты
ЗАПРЕТ: никаких выводов, названий категорий, классификаций
Выход: структурированное морфологическое описание
[Цикл проверки качества]:
Судья оценивает описание по критериям:
точность / полнота / специфичность / нейтральность
Если оценка < порог → переформулировать с указанием недостатков
Если оценка ≥ порог → переходить к шагу 2
ШАГ 2: ДВОЙНАЯ ГЕНЕРАЦИЯ (отдельный запрос)
Вход: описание из шага 1 + оригинальный материал + вопрос
Задача: сгенерировать ДВА ответа с разных позиций
Угол А: [первая перспектива — например, идентификация]
Угол Б: [вторая перспектива — например, рекомендации]
Выход: два конкурирующих кандидата
ШАГ 3: СУДЬЯ (отдельный запрос)
Вход: оба ответа + критерии оценки
Задача: сравнить попарно, выбрать сильнейший
Выход: выбранный ответ + письменное обоснование выбора
Пример применения
Задача: Анализируем лендинг конкурента — сервис доставки еды в Москве. Нужно понять сильные и слабые стороны, не загоняя себя в шаблонные выводы с первой секунды.
Промпт — Шаг 1 (загружаем скриншот лендинга):
Ты описываешь элементы этой страницы как наблюдатель — только то,
что видишь, без оценок и выводов.
Опиши структурно:
- Какие блоки и в каком порядке
- Что написано в каждом блоке (точные формулировки, не пересказ)
- Какие визуальные элементы есть (фото, иконки, кнопки, цвета)
- Какие цифры, факты, обещания упоминаются
ВАЖНО: Не пиши "хороший", "плохой", "сильный", "слабый",
"эффективный", "неудачный". Только наблюдения.
Не делай выводов о том, работает ли это — только фиксируй, что есть.
Промпт — Шаг 2 (используем описание из шага 1):
Вот описание лендинга конкурента:
[вставить описание из шага 1]
Сгенерируй два независимых анализа:
АНАЛИЗ А — с позиции потенциального клиента:
Что в этом лендинге говорит о том, почему здесь стоит заказать?
Какие конкретные элементы описания формируют доверие или его отсутствие?
АНАЛИЗ Б — с позиции маркетолога-конкурента:
Какие уязвимые места в позиционировании видны из описания?
Где можно было бы предложить что-то принципиально иначе?
Оба анализа должны опираться только на конкретные элементы из описания выше.
Промпт — Шаг 3:
Вот два анализа одного лендинга конкурента:
АНАЛИЗ А: [вставить]
АНАЛИЗ Б: [вставить]
Оцени каждый по критериям:
1. Конкретность — опирается на факты из описания, не на догадки
2. Полнота — охватывает важные аспекты, не зацикливается на одном
3. Практическая ценность — из этого можно сделать конкретный вывод
Выбери более сильный анализ и объясни: что именно делает его лучше,
и что стоит добавить из второго?
Результат: На шаге 1 — детализированное описание без оценок, только факты. На шаге 2 — два разных среза: клиентский и конкурентный, опирающихся на конкретные наблюдения. На шаге 3 — взвешенный выбор с обоснованием и синтезом лучшего из обоих углов. Финальный анализ будет конкретнее и доказательнее, чем если бы вы просто спросили "проанализируй этот лендинг".
Почему это работает
LLM не анализирует — она предсказывает текст. Когда вы просите "проанализируй", модель строит ответ в режиме "какой анализ обычно следует за таким запросом". Вывод появляется в первых токенах, остальное — его обоснование. Факты подтягиваются под уже выбранную рамку.
Разрыв на принудительное описание ломает этот паттерн. Когда шаг 1 запрещает выводы и требует только наблюдения — модель вынуждена накапливать факты без преждевременной классификации. Когда шаг 2 начинается с этих фактов — вывод строится снизу вверх, а не наоборот.
Два угла + судья закрывают слепые пятна. Один ответ всегда фокусируется там, где легче. Два конкурирующих ответа с разных позиций совместно покрывают больше. Судья-LLM с явными критериями выбирает лучший и оставляет след: почему именно этот. Если вы не согласны — понятно, с каким именно аргументом спорить.
Рычаги управления: - Запрет на ярлыки в шаге 1 → чем строже запрет, тем чище наблюдения; ослабь — получишь больше гипотез уже на первом шаге - Выбор двух углов в шаге 2 → меняй пары под задачу: риск/возможность, краткосрочное/долгосрочное, клиент/инвестор - Критерии судьи в шаге 3 → добавь свои: "соответствует нашей ЦА", "реализуемо за неделю" - Порог качества в цикле шага 1 → высокий порог = больше итераций и токенов, но чище факты
Шаблон промпта
Шаг 1 — Наблюдение:
Ты описываешь {материал} как наблюдатель — только то, что там есть,
без оценок и выводов.
Опиши структурно по категориям: {список_категорий}.
ВАЖНО: Не используй слова {список_запрещённых_ярлыков}.
Только наблюдения — что конкретно написано, показано, присутствует.
Шаг 1а — Проверка качества (вставить после описания):
Оцени это описание по шкале 1-10 по каждому критерию:
- Точность: отражает ли только то, что реально есть
- Полнота: все ли важные элементы охвачены
- Нейтральность: нет ли скрытых оценок и выводов
Если хотя бы один критерий ниже 8 — перепиши проблемные части
с указанием что именно исправил.
Шаг 2 — Двойная генерация:
Вот наблюдения по {материал}:
{описание_из_шага_1}
Сгенерируй два независимых анализа:
АНАЛИЗ А — с позиции {роль_А}:
{вопрос_А}
АНАЛИЗ Б — с позиции {роль_Б}:
{вопрос_Б}
Оба анализа опираются только на конкретные элементы из наблюдений выше.
Шаг 3 — Судья:
Вот два анализа {материал}:
АНАЛИЗ А: {анализ_А}
АНАЛИЗ Б: {анализ_Б}
Оцени каждый по критериям:
{критерий_1}, {критерий_2}, {критерий_3}
Выбери более сильный и объясни:
- Что именно делает его лучше
- Что ценного есть во втором, что стоит добавить
Плейсхолдеры:
- {материал} — что анализируем: лендинг, резюме, договор, питч-дек, текст
- {список_категорий} — что смотрим: блоки, аргументы, условия, цифры
- {список_запрещённых_ярлыков} — "хороший/плохой/сильный/слабый" и специфичные для домена
- {роль_А} / {роль_Б} — пары: клиент/конкурент, инвестор/скептик, краткосрок/долгосрок
- {вопрос_А} / {вопрос_Б} — разные вопросы для каждой позиции
- {критерий_1-3} — конкретность, полнота, практическая ценность (или свои)
🚀 Быстрый старт — вставь в чат:
Вот шаблон трёхшагового анализа (наблюдение → двойная генерация → судья).
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить все поля.
[вставить шаблон выше]
LLM спросит: что за материал анализируем, с каких двух углов смотреть, какие критерии судьи важны — потому что без этого не понять, какие роли и запреты ставить в промпт.
Ограничения
⚠️ Требует трёх отдельных запросов: Метод — это последовательный пайплайн. Нельзя сделать всё в одном промпте и сохранить логику разделения. Минимум три сообщения в чате.
⚠️ Цикл качества в шаге 1 растягивает сессию: Если описание не проходит проверку, нужны дополнительные итерации. В сложных случаях — 3-5 уточняющих запросов до перехода к шагу 2.
⚠️ Не работает для простых вопросов: Если задача решается за один шаг ("сколько здесь слов?", "переведи этот текст") — три шага только замедлят. Метод для задач, где ошибка в интерпретации стоит дорого.
⚠️ Запрет на ярлыки требует тщательной формулировки: В оригинале авторы потратили 12 итераций промпта, чтобы модель перестала проскальзывать с косвенными выводами в описании. Если ваш запрет нечёткий — модель найдёт обходные пути.
⚠️ Судья-LLM не нейтрален: Исследователи обнаружили, что без специальных мер судья предпочитает более длинные ответы — вне зависимости от фактической точности. Добавляй явный запрет учитывать длину ответа в критериях судьи.
Как исследовали
Исследователи взяли задачу, где цена ошибки LLM понятна буквально: неверный диагноз болезни растения → неправильный фунгицид → потеря урожая. На двух бенчмарках — CDDMBench (открытые вопросы о болезнях растений) и AgMMU-MCQs (тесты с выбором ответа по пяти агрокатегориям) — сравнили три конфигурации: без каких-либо подсказок, с подсказками, но без рефайниинга, и полный пайплайн CPJ.
Самая интересная находка — аблационные эксперименты, то есть проверка "что будет, если убрать один компонент". Убрали итеративный рефайнинг описания (шаг 1а) — точность упала на всех моделях. Убрали двойную генерацию — упала тоже. Это значит: каждый компонент несёт свою нагрузку, а не просто добавляет сложности.
Прирост +22.7 процентных пункта в классификации болезней — это не "немного лучше". Это разница между "иногда ошибается" и "работает надёжно". При этом модели тестировались без модификации на втором бенчмарке (AgMMU), куда их не заточали — и всё равно показали результаты на уровне специализированных дообученных моделей. Это подтверждает: структурированный пайплайн через промпты обобщается лучше, чем дообучение на узком датасете.
Отдельно проверили судью-LLM: согласие с оценками реального агронома составило κ = 0.88 (коэффициент согласия, где 1.0 — идеальное совпадение, 0 — случайное). Это высокий показатель. Для сравнения: в ранних версиях пайплайна судья чаще выбирал длинные ответы — просто потому, что они длиннее. После удаления "длина ответа" из критериев число таких ошибок упало с ~12% до ~5%.
Оригинал из исследования
Авторы приводят ключевые промпты в Appendix A (не вошли в открытый текст), но описывают философию Stage 1 так:
Caption generation formal definition:
C₀ = VLM(I, P_few)
Where:
- I = input image
- P_few = few-shot exemplars demonstrating morphological observation
without crop species names or disease labels
Quality scoring across k dimensions:
s(C) = (1/k) × Σ wᵢ·dᵢ(C)
Dimensions: accuracy, completeness, specificity, relevance, clarity
Threshold τ = 8.0/10.0
Refinement:
C* = C₀ if s(C₀) ≥ τ
= VLM(I, Φ(C₀)) otherwise
Where Φ(C₀) = targeted feedback on specific deficiencies
Stage 2 viewpoints for CDDMBench:
- Viewpoint 1: disease-focused (crop identity, symptom characterisation, visible indicators)
- Viewpoint 2: management-focused (treatment protocols, prevention measures)
Stage 3 Judge criteria:
factual correctness, completeness, specificity, practical applicability
[WITHOUT response length — explicitly excluded after verbosity bias found]
Контекст: Это формализованное описание трёхэтапного пайплайна из раздела методологии. Full prompts с примерами — в Appendix A оригинальной статьи / репозитории.
Адаптации
💡 Адаптация: Анализ резюме без предвзятости — тот же паттерн, другой контекст.
Классическая проблема HR: открываешь резюме, видишь "Яндекс" в опыте — и дальше читаешь с позитивным фильтром. Шаг 1 разрывает это:
Опиши это резюме структурно:
- Перечисли места работы (названия, длительность)
- Перечисли заявленные достижения с конкретными цифрами (только факты)
- Перечисли навыки, которые упомянуты
- Отметь, чего нет: нет цифр, нет конкретики, нет дат
НЕ используй: "сильный кандидат", "хороший опыт", "подходит",
"не подходит". Только наблюдения.
🔧 Техника: Запрет косвенных выводов → нейтральное наблюдение
В оригинале авторы обнаружили, что модель прокрадывалась к выводам через косвенные формулировки ("распределение, типичное для..."). Добавь в запрет не только прямые оценки, но и косвенные сравнения:
Запрещено:
- Прямые оценки: хороший/плохой/сильный/слабый
- Сравнения с нормой: "выше среднего", "нестандартно"
- Косвенные диагнозы: "характерно для X", "типично при Y"
- Любые выводы о причинах: "вероятно", "скорее всего"
Чем строже список запретов — тем чище наблюдения на выходе.
💡 Экстраполяция: Дебаты двух аналитиков для бизнес-решения
Принцип двойной генерации + судья применим к любому сложному решению. Пример: берём питч нового продукта, сначала описываем факты (шаг 1), потом просим два независимых анализа — от лица инвестора Игоря Рябенького (где деньги, как масштабировать) и лица скептика-пользователя (почему я не переключусь с WhatsApp). Судья выбирает, какой анализ точнее отражает реальные риски.
Ключевой приём: конкретные персонажи вместо безликих "Аналитик А" дают острее выраженные позиции.
Ресурсы
Статья: Agri-CPJ: A Training-Free Explainable Framework for Agricultural Pest Diagnosis Using Caption-Prompt-Judge and LLM-as-a-Judge
Репозиторий: https://github.com/CPJ-Agricultural/CPJ-Agricultural-Diagnosis
Авторы: Wentao Zhang (Shandong University of Technology), Qi Zhang (City University of Macau), Mingkun Xu (Guangdong Institute of Intelligent Science and Technology), Mu You, Henghua Shen, Zhongzhi He, Keyan Jin, Tao Fang (Macau Millennium College), Derek F. Wong (University of Macau)
Бенчмарки упомянутые в статье: CDDMBench (Liu et al., 2024), AgMMU-MCQs (Gauba et al., 2025)
