TL;DR
In-Context Anomaly Detection (ICAD) — принцип работы с LLM, при котором аномалии определяются через явное сравнение с референсным набором нормальных примеров, а не через абстрактное понятие "нормы". Вместо того чтобы просить модель "найди что не так" (полагаясь на её заученное представление о правильном), вы сначала показываете 3-5 примеров того, что считается нормой, а затем даёте образец для проверки.
Исследователи обнаружили фундаментальную слабость традиционных методов: они обучают модель запоминать понятие "нормы" для конкретной задачи, что делает модель негибкой. Попросите её найти аномалии в новом типе данных — и она растеряется, потому что не может применить заученные паттерны. При этом базовая способность LLM сравнивать и находить отличия остаётся невостребованной. Модель умеет отлично сопоставлять образцы, но её заставляют работать через абстрактную память.
ICAD решает это перенося определение нормы из памяти модели в контекст запроса. Вы даёте референсные примеры прямо в промпте → модель сравнивает целевой образец с ними → выдаёт оценку отклонения. Этот подход работает универсально: для проверки текстов, оценки данных, поиска выбросов в любых последовательностях.
Схема принципа
ТРАДИЦИОННЫЙ ПОДХОД:
Промпт: "Найди аномалии в этих данных: {данные}"
↓
LLM пытается вспомнить "что обычно нормально"
↓
Результат зависит от обучения модели
ICAD ПОДХОД:
Шаг 1: Собери 3-5 примеров нормы
Шаг 2: Промпт с явным контекстом
↓
"Вот примеры нормальных образцов:
{пример 1}
{пример 2}
{пример 3}
Насколько этот образец отличается от них?
{целевой образец}"
↓
LLM сравнивает конкретное с конкретным
Всё выполняется в одном запросе.
Пример применения
⚠️ Сильная зона метода: Задачи где есть чёткие образцы нормы и нужно найти отклонения. Хорошо работает для структурированных данных, повторяющихся паттернов, оценки качества по эталону.
Задача: Проверяешь заявки на грант. У тебя есть 5 одобренных заявок прошлого года и новая заявка. Нужно понять, насколько новая отличается от успешных — не "хорошая ли она вообще", а именно "вписывается ли в паттерн того, что проходило раньше".
Промпт:
Вот 5 заявок, которые были одобрены в прошлом году:
ЗАЯВКА 1:
[текст успешной заявки — 2-3 абзаца: цель, методы, бюджет]
ЗАЯВКА 2:
[текст успешной заявки]
ЗАЯВКА 3:
[текст успешной заявки]
ЗАЯВКА 4:
[текст успешной заявки]
ЗАЯВКА 5:
[текст успешной заявки]
---
Теперь оцени новую заявку:
НОВАЯ ЗАЯВКА:
[текст проверяемой заявки]
---
Задача: Найди все существенные отличия новой заявки от референсных.
Что в ней выбивается из паттерна одобренных заявок?
Оцени по пунктам:
1. Структура и подача
2. Обоснование цели
3. Методология
4. Бюджет и ресурсы
5. Общий тон и стиль
Для каждого пункта укажи:
- Соответствие паттерну (норма/отклонение)
- Если отклонение — насколько сильное и в чём конкретно
Результат:
Модель выдаст пошаговый анализ по каждому пункту: где новая заявка повторяет паттерн успешных (например, "структура совпадает — введение, методы, результаты"), а где отклоняется (например, "бюджет в 2 раза выше среднего по референсным заявкам" или "отсутствует раздел про предыдущий опыт, который есть во всех одобренных"). Модель может дать числовую оценку степени отклонения или качественное описание ("незначительное", "среднее", "критическое отклонение").
Почему это работает
LLM плохо держит абстрактное понятие "нормы" без конкретных примеров. Когда вы пишете "найди ошибки", модель опирается на общие паттерны из обучения — они размыты, зависят от формулировки, могут не совпадать с вашим контекстом. Результат: модель находит "что-то не то", но не обязательно то, что важно именно вам.
При этом LLM отлично умеет сравнивать конкретное с конкретным. Дайте ей два текста и попросите найти отличия — она пройдётся по структуре, стилю, содержанию, найдёт даже тонкие расхождения. Эта способность к прямому сопоставлению работает надёжно, потому что модель не додумывает абстрактный эталон, а анализирует то, что видит перед собой.
ICAD использует эту силу: переносит определение нормы из головы модели в явный контекст. Вместо "помни что такое хорошо" → "вот 5 примеров хорошего, сравни с ними". Модель перестаёт гадать и начинает работать в режиме точного сопоставления.
Рычаги управления:
- Число референсных примеров (3-5-7) → больше примеров = устойчивее паттерн, но длиннее промпт. Для простых задач хватит 3, для неоднозначных — 5-7.
- Критерии сравнения ("структура, стиль, тон") → явно перечисли что важно, чтобы модель фокусировалась на нужных аспектах, а не на случайных деталях.
- Формат вывода ("оцени по шкале 1-10" vs "опиши отклонения") → численная оценка для быстрого скрининга, описание для глубокого анализа.
- Тип референса (успешные/провальные примеры, эталоны разного качества) → можешь показать не только "идеал", но и "грань допустимого", чтобы модель понимала диапазон нормы.
Шаблон промпта
Вот {N} примеров нормальных образцов для задачи "{описание_задачи}":
ОБРАЗЕЦ 1:
{референсный_пример_1}
ОБРАЗЕЦ 2:
{референсный_пример_2}
ОБРАЗЕЦ 3:
{референсный_пример_3}
[добавь ещё примеры если нужно]
---
Теперь проверь этот образец:
{целевой_образец}
---
Задача: Найди все отклонения целевого образца от паттерна референсных.
Оцени по критериям:
{критерий_1}
{критерий_2}
{критерий_3}
Для каждого критерия укажи:
- Соответствие паттерну (норма/отклонение)
- Если отклонение — насколько сильное и в чём конкретно
Что подставлять:
{N}— обычно 3-5 примеров, для сложных паттернов можно 7{описание_задачи}— контекст, чтобы модель понимала что считать важным{референсный_пример_X}— образцы "нормы": тексты, данные, последовательности{целевой_образец}— то, что проверяешь{критерий_X}— аспекты для сравнения (структура, стиль, числовые показатели, логика)
🚀 Быстрый старт — вставь в чат:
Вот принцип ICAD для поиска аномалий. Адаптируй под мою задачу: [опиши свою задачу — что проверяешь и что считается нормой].
Задай мне вопросы:
- Какие примеры "нормы" у меня есть?
- По каким критериям сравнивать?
- Что важно найти — сильные отклонения или любые различия?
После этого создай промпт по шаблону:
[вставить шаблон выше]
LLM спросит какие у тебя есть образцы нормы, что проверяешь, какие аспекты важны — потому что для ICAD критично правильно подобрать референсные примеры (они должны представлять именно тот паттерн, относительно которого ищешь аномалии). Она возьмёт структуру сравнения из принципа и адаптирует под твой контекст.
Ограничения
⚠️ Нужны качественные образцы нормы: Если референсные примеры сами неоднородны или содержат скрытые аномалии, модель будет сравнивать с искажённым паттерном. Принцип работает настолько хорошо, насколько чисты образцы.
⚠️ Субъективные критерии: Для задач где "норма" размыта и зависит от контекста (например, "креативность текста", "уместность шутки"), сравнение с примерами даст механистический результат. Модель найдёт формальные отличия, но может упустить суть.
⚠️ Длина контекста: Каждый референсный пример съедает токены. Для объёмных данных (длинные тексты, большие таблицы) придётся либо сокращать примеры, либо уменьшать их число, что снижает точность паттерна.
⚠️ Новый тип аномалии: Если отклонение принципиально новое (не встречалось ни в референсах, ни в обучении модели), LLM может его не распознать или недооценить, потому что нет базы для сравнения.
Как исследовали
Команда из Beihang University создала систему ICAD-LLM, которая обучалась находить аномалии в трёх разных типах данных одновременно: временные ряды (графики, метрики серверов), таблицы (датасеты с числами и категориями), логи (текстовые записи событий). Обычно для каждого типа данных используют отдельную модель — здесь проверяли, можно ли научить одну модель работать со всем сразу.
Взяли небольшую LLM (Qwen2.5-0.5B — это крошечная модель, для сравнения: ChatGPT в сотни раз больше), добавили специальные энкодеры для каждого типа данных (преобразуют временные ряды/таблицы/логи в единый формат) и обучили через контрастное обучение: показывали модели референсный набор нормальных примеров + нормальный образец (должна сказать "похож") + аномальный образец (должна сказать "не похож"). Обучали 5 эпох на 200 тысячах примеров из разных источников.
Тестировали на 27 датасетах (5 — временные ряды, 18 — таблицы, 4 — логи). Для каждого теста формировали референсный набор из 5 случайных нормальных образцов и проверяли, насколько хорошо модель отличает нормальные примеры от аномалий. Главная проверка: давали модели датасеты, которые она никогда не видела во время обучения — проверяли способность обобщать.
Результаты оказались неожиданными: универсальная модель почти не уступила специализированным методам (разница 1-3%), а на некоторых датасетах даже превзошла их. Это подтвердило ключевой инсайт: если научить модель сравнивать, а не запоминать, она становится гибче. На новых задачах (которых не было в обучении) ICAD-LLM показала AUROC 85-90%, в то время как традиционные методы проваливались до 60-70% или вообще не могли работать без переобучения.
Почему это важно для практики: Исследование показало, что принцип явного сравнения с референсом работает лучше абстрактного обучения "что такое норма" — это верно не только для сложных систем, но и для простого промптинга в чате. LLM эффективнее находит аномалии, когда ей дают конкретные образцы для сопоставления, а не заставляют додумывать эталон.
Адаптации и экстраполяции
🔧 Техника: Двусторонний референс → понимание диапазона нормы
Исходный ICAD показывает только образцы нормы. Если твоя задача имеет диапазон допустимого (не точечная норма, а спектр), покажи и нижнюю, и верхнюю границы.
Пример: Проверяешь рекламные тексты. Вместо "вот 5 хороших примеров" → "вот 3 минималистичных текста (нижняя граница нормы) + 3 экспрессивных текста (верхняя граница)". Модель поймёт диапазон допустимого, а не точечный образец.
Вот диапазон нормальных стилей для рекламы наших курсов: МИНИМАЛИЗМ (нижняя граница): {пример 1 — сдержанный, фактический} {пример 2 — короткий, без эмоций} ЭКСПРЕССИЯ (верхняя граница): {пример 3 — яркий, с восклицаниями} {пример 4 — образный, с метафорами} Проверь этот текст — вписывается ли он в диапазон или выходит за границы? {целевой текст}
🔧 Техника: Градуированный референс → количественная оценка отклонения
Вместо бинарного "норма/аномалия", покажи образцы разной степени качества с явными оценками. Модель научится калибровать свои выводы.
Вот примеры откликов на вакансию с оценками (шкала 1-10): ОТКЛИК 1 (оценка: 9/10): {текст сильного отклика} ОТКЛИК 2 (оценка: 7/10): {текст среднего отклика} ОТКЛИК 3 (оценка: 4/10): {текст слабого отклика} Оцени новый отклик по той же шкале, объясни какие элементы тянут оценку вверх/вниз: {целевой отклик}
Ресурсы
ICAD-LLM: One-for-All Anomaly Detection via In-Context Learning with Large Language Models
Zhongyuan Wu, Jingyuan Wang, Zexuan Cheng, Yilong Zhou, Weizhi Wang, Juhua Pu, Chao Li (Beihang University), Changqing Ma (Capinfo Co., Ltd.)
Код исследования: https://github.com/nobody384/ICAD-LLM
