TL;DR
LLM-as-Classifier — фреймворк для построения текстовых классификаторов на LLM без файн-тюнинга. Работает в четыре фазы: (1) эксперты задают начальную схему классов, (2) LLM свободно находит темы в данных и строится alignment matrix (heatmap сравнения), (3) промпт дорабатывается на основе матрицы, (4) добавляются few-shot примеры с контролем баланса классов. В основе — человек в цикле и систематическая валидация на устойчивость к порядку данных.
Классическая проблема промпт-классификаторов: ты не знаешь, где промпт врёт. Определил класс "Технические проблемы" — получил 60% всех данных. Это правда техническая боль пользователей или промпт слишком широкий и затягивает всё подряд? Добавил few-shot примеры — точность выросла, но теперь 80% данных в одном классе. Это данные изменились или примеры сломали баланс? Без объективной проверки каждое изменение промпта — игра вслепую.
Фреймворк решает это alignment matrix — таблицей сравнения твоих классов с тем, что LLM видит в данных сама по себе. Даёшь LLM два задания: (1) раздели данные по моим классам, (2) найди темы сама без моих ограничений. Строишь таблицу пересечений. Яркая диагональ — промпт точен. Размазанная строка — класс слишком широкий. Пустая строка — класс не работает, удали. Матрица показывает где именно промпт ломается и какие определения переписать. После каждого изменения — новая матрица. Итерируешь, пока не получишь чистую картину.
Схема метода
ШАГ 1 (Domain Knowledge): Эксперт задаёт начальные классы
→ Схема классификации C_P = {класс_1, класс_2, ..., класс_k}
ШАГ 2 (Topic Discovery): Два параллельных запроса к LLM → Запрос А: "Раздели эти данные по моим классам {C_P}" → Запрос Б: "Найди основные темы в этих данных сам, без ограничений"
ШАГ 3 (Alignment Matrix): Строится таблица пересечений → Heatmap: строки = твои классы, столбцы = темы LLM, яркость = количество совпадений
ШАГ 4 (Prompt Refinement): Анализ матрицы и доработка промпта → Яркая ячейка = класс работает точно, сохранить → Размазанная строка = класс слишком широкий, уточнить определение → Пустая строка = класс не работает, удалить → Несколько ярких ячеек в строке = класс захватывает чужие темы, сузить
ШАГ 5 (Hierarchical Expansion): Построение подклассов через Chain-of-Thought → Для каждого валидного Parent класса создаются Child подклассы → Единый CoT-промпт: сначала Parent, затем Child
ШАГ 6 (Few-Shot Reinforcement): Добавление примеров с контролем баланса → Добавляются few-shot примеры из человеческих предпочтений → Контроль: распределение классов не должно сильно измениться (KL-дивергенция)
ШАГ 7 (Validation): Проверка устойчивости к порядку → Batch sequence: перемешать данные, классификация не должна меняться → Intra-document: удалить начало/конец/середину документа, проверить устойчивость → In-prompt: перемешать few-shot примеры, проверить стабильность результата
Все шаги требуют отдельных запросов к LLM. Шаги 2-4 образуют итерационный цикл.
Пример применения
Задача: Ты продакт в Авито и анализируешь отзывы пользователей на новую функцию "Безопасная сделка". Нужно понять основные темы претензий и предложить, какие доработать в первую очередь. У тебя 500 отзывов, читать вручную долго.
Промпт Шага 1 (начальные классы от эксперта):
Вот отзывы пользователей на функцию "Безопасная сделка" в Авито.
Раздели их по категориям:
1. Непонятный интерфейс - пользователь не понял как работает функция
2. Технические сбои - что-то не загружается, не работает
3. Медленно работает - жалобы на скорость
4. Дорого - претензии к комиссии
Классифицируй каждый отзыв в одну из этих категорий.
[500 отзывов]
Промпт Шага 2 (свободное выявление тем LLM):
Вот отзывы пользователей на функцию "Безопасная сделка" в Авито.
НЕ используй заданные категории. Сам проанализируй отзывы и выдели 4-6 основных тем, которые ты видишь в данных. Назови каждую тему.
[те же 500 отзывов]
Результат:
Получишь две таблицы:
- Таблица A: каждый отзыв → твой класс (Непонятный интерфейс / Технические сбои / и т.д.)
- Таблица B: каждый отзыв → тема от LLM (например: "Страх мошенничества", "Путаница с условиями", "Баги в мобильном приложении", "Доставка не работает", "Высокие комиссии")
Строишь alignment matrix: сколько отзывов попали одновременно в "Непонятный интерфейс" И "Путаница с условиями" и т.д.
Допустим, видишь на heatmap:
- "Непонятный интерфейс" размазан по двум темам: "Путаница с условиями" (200 отзывов) + "Страх мошенничества" (150 отзывов) → класс слишком широкий, разделить на два
- "Технические сбои" ярко совпадает с "Баги в мобильном приложении" (180 отзывов) → определение работает точно
- "Медленно работает" почти пустая строка (5 отзывов) → в данных этой проблемы нет, удалить класс
- "Дорого" совпадает с "Высокие комиссии" (80 отзывов), но также захватывает часть "Доставка не работает" (40 отзывов) → определение нечёткое, добавить: "именно про комиссию, не про логистику"
Переписываешь промпт на основе матрицы. Повторяешь Шаги 2-4 до чистой heatmap (3-5 итераций). Затем добавляешь few-shot примеры (Шаг 6) и проверяешь устойчивость (Шаг 7).
Почему это работает
LLM не знает, что ты подразумевал под "Непонятный интерфейс". Она интерпретирует по своему пониманию. Твоё определение может захватывать слишком много (размазанная строка в матрице) или вообще не работать (пустая строка). Без валидации ты не увидишь разрыв между твоим замыслом и выполнением LLM.
Alignment matrix работает как зеркало. Свободная классификация LLM (без твоих классов) показывает, что модель видит в данных по-настоящему. Это её "честное" понимание структуры. Сравнение с твоими классами показывает, где твои определения совпадают с моделью, а где расходятся. Яркая диагональ — ты и модель согласны. Размазанная строка — твой класс для модели означает что-то другое, чем для тебя.
Итерации на основе матрицы превращают "подбор определений" в точную диагностику. Не "попробую переписать промпт", а "матрица показала, что класс X захватывает тему Y — добавлю исключение". Каждая итерация решает конкретную проблему, видимую в данных.
Рычаги управления методом:
- Количество классов в начальной схеме: начинай с 3-5 → увеличивай, если матрица показывает, что LLM видит больше тем
- Количество тем в свободной классификации (Шаг 2): попроси 4-6 → если данных много и разнообразны, можно 8-10 для детальности
- Порог KL-дивергенции при добавлении few-shot: строгий (ε=0.05) → баланс классов почти не меняется, мягкий (ε=0.2) → допускаешь сдвиг
- Количество итераций: 3-5 достаточно → если после 5 итераций матрица не чистая, проблема в данных, не в промпте
Шаблон промпта
Alignment Matrix Method
Шаг 1 — Классификация по заданным классам:
Вот данные: {данные}
Раздели каждый элемент по этим категориям:
{список_классов_с_определениями}
Для каждого элемента выдай: ID элемента, выбранный класс, краткое обоснование (1 предложение).
Шаг 2 — Свободное выявление тем:
Вот те же данные: {данные}
НЕ используй категории из предыдущего задания.
Проанализируй данные сам и выдели {N} основных тем, которые ты видишь. Назови каждую тему кратко (2-4 слова).
Для каждого элемента выдай: ID элемента, выбранная тема.
Шаг 3 — Построение матрицы (делай вручную или через таблицу):
Сравни результаты Шага 1 и Шага 2. Построй таблицу:
- Строки = твои классы
- Столбцы = темы от LLM
- Ячейки = количество элементов, попавших в класс И тему одновременно
Шаг 4 — Анализ и рефининг:
Попроси LLM помочь с анализом:
Вот alignment matrix между моими классами и темами, которые ты нашёл сам:
[вставь таблицу]
Проанализируй каждый мой класс (каждую строку):
- Если строка имеет одну яркую ячейку → класс работает точно
- Если строка размазана по нескольким темам → класс слишком широкий, предложи как разделить
- Если строка почти пустая → класс не работает, предложи удалить или переформулировать
- Если строка захватывает чужие темы → класс нечёткий, предложи как сузить определение
Для каждого проблемного класса предложи конкретную доработку определения.
Применяешь рекомендации → повторяешь Шаги 1-4 с новыми определениями → продолжаешь, пока матрица не станет чистой (диагональной).
Плейсхолдеры:
{данные}— твой корпус для классификации (отзывы, тикеты, посты, резюме и т.д.){список_классов_с_определениями}— начальная схема: "1. Класс A: определение. 2. Класс B: определение."{N}— количество тем для свободного анализа (рекомендую 4-6)
Few-Shot с контролем баланса (Шаг 6)
Базовый промпт (zero-shot):
Раздели по категориям:
{определения_классов}
[данные для классификации]
Промпт с few-shot:
Раздели по категориям:
{определения_классов}
Примеры:
1. [пример_1] → Класс A
2. [пример_2] → Класс B
3. [пример_3] → Класс A
[данные для классификации]
Проверка баланса:
Собери статистику классов для zero-shot (N_zero) и для few-shot (N_few). Попроси LLM:
Вот распределение классов:
Zero-shot (без примеров):
Класс A: {N_A_zero} ({процент}%)
Класс B: {N_B_zero} ({процент}%)
...
Few-shot (с примерами):
Класс A: {N_A_few} ({процент}%)
Класс B: {N_B_few} ({процент}%)
...
Сильно ли изменилось распределение? Если да — какой класс стал доминировать и почему?
Если сдвиг большой — либо убери часть примеров, либо добавь примеры для недопредставленных классов.
🚀 Быстрый старт — вставь в чат:
Вот фреймворк Alignment Matrix для валидации классификатора. Адаптируй под мою задачу: [твоя задача]. Задавай вопросы, чтобы заполнить шаблоны.
[вставить Шаги 1-4 выше]
LLM спросит: какие данные, какие начальные классы ты видишь, сколько тем искать. Возьмёт паттерн из шаблона и создаст рабочие промпты для твоих данных.
Ограничения
⚠️ Требует множественных запросов: Alignment matrix = минимум 2 запроса (классификация + топики) + построение таблицы + анализ. На каждую итерацию (обычно 3-5) — снова 2 запроса. Быстро, но не "в один промпт".
⚠️ Подходит для структурированной классификации: Если задача размытая ("оцени креативность текста"), alignment matrix не поможет — LLM сама не найдёт чёткие темы в субъективных критериях.
⚠️ Не решает дрифт данных автоматически: Матрица показывает проблемы здесь и сейчас. Если данные меняются (новые продукты, тренды, сленг) — нужно пересобирать матрицу заново. Мониторинг дрифта (из статьи) требует инфраструктуры.
⚠️ Few-shot может сломать баланс: Добавление примеров улучшает точность, но может перекосить распределение классов. Без проверки KL-дивергенции (или хотя бы ручного сравнения процентов) рискуешь получить 80% данных в одном классе.
Как исследовали
Команда из Google Trust & Safety разработала фреймворк для production-систем, где нужно классифицировать массивы пользовательских данных (фидбек, тикеты, контент) без затрат на файн-тюнинг.
Логика была простой: эксперты знают домен, но не знают, как именно LLM интерпретирует их определения. LLM знает данные, но не знает бизнес-приоритеты. Нужен мост — и это alignment matrix. Исследователи взяли классический подход из ML (сравнение supervised и unsupervised кластеризации через матрицу путаницы) и адаптировали для промпт-инженерии: пусть LLM сыграет обе роли (supervised classifier и unsupervised topic model), а мы сравним результаты.
Фреймворк тестировали на реальных корпусах Google (support tickets, user feedback, policy violations). Основная метрика — чистота alignment matrix после N итераций: идеальная матрица = яркая диагональ (каждый класс совпадает с одной темой), низкий off-diagonal noise. Дополнительно измеряли F1-score против ground truth и устойчивость к порядку (статистика из алгоритмов 1-3).
Главная находка: промпты ломаются не от плохой формулировки, а от несовпадения интуиции эксперта и понимания LLM. Класс "Технические проблемы" кажется экспертам чётким, но LLM видит в нём 3 разные темы (баги UI, ошибки API, проблемы с авторизацией) — и матрица это показывает. Без матрицы эксперт не узнал бы о проблеме — формально промпт работает, но семантически размыт.
Второй инсайт: few-shot примеры работают как стероиды — резко повышают точность, но ломают баланс классов. Добавили 3 примера для "UI confusion" — точность выросла с 72% до 89%, но доля этого класса подскочила с 15% до 35%. Оказалось, примеры не просто учат различать, они смещают prior вероятность модели. Без контроля распределения (KL-divergence < ε) few-shot превращается в self-fulfilling prophecy.
Третий инсайт из sequence invariance testing: LLM чувствительны к порядку даже при temperature=0. Перемешали порядок few-shot примеров — 12% документов получили другую классификацию. Удалили первую треть документа — 18% изменений. Это не баг, это особенность attention mechanism: веса attention зависят от позиции токенов. Промпт, который работает на одном порядке, может сломаться на другом. Поэтому валидация = обязательно несколько shuffle-итераций.
Исследование показало, что промпт-инженерия для классификации — это не искусство, а наука с воспроизводимыми протоколами: alignment matrix диагностирует проблемы, итерации их чинят, sequence testing проверяет робастность, мониторинг дрифта держит систему живой. Цикл замкнут.
Оригинал из исследования
Контекст: Исследователи описывают математическую формализацию alignment matrix — как из двух классификаций (по заданным классам и свободных топиков) построить матрицу пересечений для диагностики промпта.
2. Alignment Analysis: We construct a k × m alignment matrix, A, to
analyze the co-occurrence of the predefined Parent classes and the
emergent topics. The classification function f at iteration t is
parameterized by a class-defining prompt, P_class^(t), so we denote
it f^(t). The matrix element A_ij is the count of documents assigned
to parent class c_i and topic t_j.
A_ij = |{d' ∈ D' | f^(t)(d') = c_i ∧ g(d') = t_j}|
This matrix, often visualized as a heatmap (Figure 2), provides
critical diagnostic information. A row Σ(j=1 to m) A_ij that is
disproportionately large suggests class c_i is too broad, while a
column Σ(i=1 to k) A_ij that is large indicates a dominant underlying
topic.
Контекст: Пример анализа heatmap — как читать матрицу и какие выводы делать про каждый класс.
Parent Class C: A Well-Defined and Successful Class
- Observation: A single, high-intensity (bright yellow) cell is
observed at the intersection of `Parent Class C` and `Known Class 2`.
All other cells in this row exhibit low intensity.
- Interpretation: This result is ideal. It indicates that the prompt's
definition for `Parent Class C` is specific, accurate, and aligns
almost perfectly with the semantic concept of `Known Class 2`.
The classification for this category is "pure," with minimal leakage
or confusion.
- Action: The prompt definition for `Parent Class C` is considered
validated and requires no immediate modification.
Parent Class A: A Vague and Poorly-Defined Class
- Observation: This row displays moderate signal strength across
multiple known classes (`Known Class 1` and `Known Class 2`) without
a single dominant alignment.
- Interpretation: `Parent Class A` lacks semantic coherence. Its
definition is likely too general, making it a "catch-all" category
that fails to represent a distinct underlying concept in the data.
- Action: The definition for `Parent Class A` requires a substantial
revision. The domain knowledge that informed this class must be
revisited. Options include splitting it into two more specific
classes or rewriting its definition entirely.
Контекст: Формула контроля баланса при добавлении few-shot примеров — как найти оптимальное количество примеров, которые улучшают точность, но не ломают распределение классов.
The objective is to find an optimal number of examples, k*, that
maximizes a validity score V (e.g., F1-score) while ensuring the
resulting distribution does not diverge excessively from a baseline
(e.g., the zero-shot distribution N^(0)). This constraint can be
formalized as:
k* = arg max_k V(E_k) s.t. D_KL(N^(k) || N^(0)) ≤ ε
where D_KL is the Kullback-Leibler divergence and ε is a pre-defined
tolerance threshold.
Адаптации и экстраполяции
💡 Адаптация для личных решений — "Сам себе судья"
Alignment matrix работает не только для корпусов данных, но и для анализа собственного мышления. Используй LLM как зеркало для своих критериев принятия решений.
Пример: Ты выбираешь между тремя оффрами — старший аналитик в Яндексе, мидл продакт в стартапе, тимлид в Сбере. У тебя есть критерии: зарплата, рост, баланс жизни, команда. Но ты не уверен, что интуитивно взвешиваешь их правильно.
ЗАДАЧА 1 (явные критерии):
Оцени каждый оффер по моим критериям:
1. Зарплата - важность 40%
2. Возможности роста - важность 30%
3. Work-life balance - важность 20%
4. Крутая команда - важность 10%
[описание трёх офферов]
Выдай итоговую оценку каждого оффера.
---
ЗАДАЧА 2 (свободный анализ):
Забудь про мои критерии.
Проанализируй эти три оффера сам и выдели 3-4 ключевых фактора, которые,
по твоему мнению, действительно важны при выборе между ними.
[те же три оффера]
Назови факторы и оцени каждый оффер по ним.
---
СРАВНЕНИЕ:
Построй таблицу:
- Строки = мои критерии (Зарплата, Рост, Balance, Команда)
- Столбцы = факторы, которые ты нашёл сам
- Ячейки = насколько мои критерии пересекаются с твоими факторами
Покажи, совпадаем ли мы с тобой в понимании того, что важно.
Если нет - объясни, что я упускаю или переоцениваю.
Результат: Узнаешь, что твои "40% на зарплату" на деле конфликтуют с "10% на команду", потому что LLM видит фактор "Среда обучения" (сильная команда = рост навыков = будущая зарплата), которого в твоих критериях нет. Alignment matrix покажет, что ты неосознанно раздвоил "рост" между двумя критериями — и переоцениваешь зарплату сейчас в ущерб росту потенциала.
💡 Адаптация для оценки контента — "Что аудитория видит vs что ты хотел"
Пишешь статью, презентацию, питч-дек. У тебя есть задумка (какие месседжи донести), но неизвестно, что считывает аудитория. Alignment matrix покажет разрыв.
ЗАДАЧА 1 (твои месседжи):
Вот моя статья про удалённую работу.
Я хочу донести три ключевых месседжа:
1. Удалёнка экономит время на дорогу
2. Удалёнка требует самодисциплины
3. Удалёнка убивает spontaneous collaboration
Найди в тексте фрагменты, которые поддерживают каждый месседж.
[текст статьи]
---
ЗАДАЧА 2 (что читатель считает):
Забудь про мои месседжи.
Прочитай статью глазами обычного читателя и выдели 3-4 главные идеи,
которые остаются в голове после прочтения.
[тот же текст]
---
СРАВНЕНИЕ:
Построй таблицу:
- Строки = мои месседжи
- Столбцы = идеи, которые остаются у читателя
- Ячейки = насколько сильно месседж поддерживается в тексте
Покажи, что из моего замысла доходит, а что теряется.
Результат: Видишь, что "убивает spontaneous collaboration" вообще не считывается — читатель вместо этого видит месседж "удалёнка даёт свободу выбора места". Матрица показывает, что твой третий месседж либо не прописан явно, либо утонул в примерах про первые два.
🔧 Техника: Alignment matrix для сравнения определений
Если у тебя есть два конкурирующих способа описать одну задачу (например, два варианта промпта или два набора критериев), используй alignment matrix для выбора лучшего.
У меня два варианта промпта для классификации отзывов:
ВАРИАНТ A:
[промпт с классами: Позитив, Негатив, Нейтрал]
ВАРИАНТ B:
[промпт с классами: Восторг, Удовлетворён, Разочарован, Злой]
Классифицируй эти 100 отзывов по обоим вариантам.
Построй alignment matrix: строки = классы из A, столбцы = классы из B.
Покажи, какие классы из A соответствуют каким в B.
Есть ли классы в B, которые дают больше детализации?
Есть ли классы в A, которые захватывают несколько классов из B
(значит, слишком широкие)?
Матрица покажет, что "Позитив" из варианта A размазан между "Восторг" и "Удовлетворён" из варианта B — значит, вариант B даёт более тонкую сегментацию позитива.
Ресурсы
LLM-as-classifier: Semi-Supervised, Iterative Framework for Hierarchical Text Classification using Large Language Models
Ссылки на смежные техники из статьи:
- Chain-of-Thought Prompting (Wei et al., 2022) — для hierarchical expansion
- Self-Refine (Madaan et al., 2023) — принцип итеративного улучшения промпта
- Constitutional AI (Bai et al., 2022) — для AI-feedback вместо человеческого
- Direct Preference Optimization (Rafailov et al., 2023) — альтернатива RLHF для обучения на предпочтениях
Авторы: Doohee You, Andy Parisi, Zach Vander Velden, Lara Dantas Inojosa
Организация: Google Trust & Safety, Google Trusted Content, Google Engineering
Дата: August 2025
