TL;DR
RetroPrompt — метод, который улучшает работу промптов через добавление похожих примеров из "базы знаний". Суть: при решении новой задачи модель ищет самые похожие примеры из прошлого опыта и использует их как дополнительный контекст. В исследовании это делается через embeddings и kNN-поиск, но принцип работает и вручную — можно самому подбирать релевантные примеры или попросить LLM найти их.
Исследователи обнаружили фундаментальную слабость: модели пытаются "зазубрить" все примеры в весах (параметрах), что плохо работает для редких случаев и малого количества данных. Как студент, который зубрит учебник страница за страницей, а потом не может применить знания на нестандартной задаче. Особенно проваливаются атипичные примеры — те, что не похожи на большинство. В few-shot сценариях модель цепляется за поверхностные паттерны вместо глубокого понимания.
RetroPrompt решает это через "открытую книгу" во время работы: создаётся хранилище примеров из тренировочных данных, модель ищет там похожие кейсы и комбинирует своё предсказание с паттернами из найденных примеров. Два ключевых момента: (1) во время обучения сложные примеры (где соседи дают разные ответы) получают больший вес; (2) во время решения задачи финальный ответ = взвешенная сумма предсказания модели + голосования ближайших соседей.
Схема метода (оригинальная — требует код)
ПОДГОТОВКА:
Для каждого примера из тренировочных данных:
→ Создать embedding через энкодер
→ Сохранить пару (embedding, правильный ответ) в базу
ОБУЧЕНИЕ:
Для каждого нового примера:
→ Найти k ближайших соседей в базе
→ Если соседи дают противоречивые ответы → пример сложный → увеличить вес в обучении
→ Обновлять embeddings в базе каждую эпоху
ИНФЕРЕНС:
Для новой задачи:
→ Найти k ближайших примеров
→ Взять предсказание модели P_model
→ Взять "голосование" соседей P_knn
→ Финальный ответ = λ × P_model + (1-λ) × P_knn
Пример применения (адаптированный принцип)
Задача: Классифицируешь отзывы клиентов на "позитивный"/"негативный"/"нейтральный" для российского маркетплейса. Уже обработал 50 отзывов вручную, теперь пришёл новый сложный отзыв: "Товар норм, но доставка — вообще жесть, курьер хамло".
Промпт (ручная имплементация принципа):
У меня есть база размеченных отзывов. Новый отзыв: "Товар норм, но доставка — вообще жесть, курьер хамло".
ШАГ 1: Найди 3 самых похожих отзыва из моей базы (прикладываю):
[вставить свою базу из 50 размеченных отзывов]
ШАГ 2: Для каждого похожего отзыва объясни:
- Почему он похож на новый
- Какую метку я ему дал
- Есть ли противоречия между похожими (например, похожие отзывы с разными метками)
ШАГ 3: Если нашёл противоречия — это сигнал сложного случая. Объясни подробно, почему новый отзыв ближе к одной метке, чем к другой.
ШАГ 4: Дай финальную классификацию.
Результат: Модель покажет процесс аналогового рассуждения: найдёт отзывы где хвалят товар но ругают сервис, объяснит что такие кейсы обычно маркируются как нейтральные (товар ≠ сервис), и если в базе есть противоречия (один раз пометил "негативный", другой — "нейтральный"), уделит особое внимание критериям разделения. Финальный ответ придёт с развёрнутым обоснованием через паттерны из похожих примеров.
Почему это работает
Слабость LLM: Модели пытаются "зазубрить" всё в параметрах. Это работает для частых паттернов, но атипичные примеры (редкие, необычные комбинации признаков) запоминаются плохо — нейросеть просто "размазывает" их по весам. В few-shot сценариях (5-10 примеров) модель цепляется за поверхностные признаки вместо глубоких закономерностей.
Сильная сторона LLM: Модели отлично работают с контекстом в промпте — если нужная информация прямо перед глазами, используют её эффективно. Также хорошо находят аналогии и паттерны между примерами.
Как метод использует это: Вместо попыток запомнить всё, модель оставляет "шпаргалку" из примеров снаружи. Когда приходит новая задача, ищет в шпаргалке похожие кейсы и использует их как дополнительные подсказки. Это разгружает параметры модели (не нужно зубрить редкие случаи) и даёт чёткий сигнал для решения (вот 3 похожих примера, действуй как в них).
Рычаги управления (для ручного применения): - Количество похожих примеров (_k_ в kNN) — для простых задач хватит 1-2, для сложных бери 5-7 - Критерий похожести — можешь попросить модель искать похожесть по разным признакам: по структуре, по теме, по tone of voice - Вес противоречивых примеров — если похожие примеры дают разные ответы, это сигнал edge case — проси модель обратить особое внимание - Обновление базы — периодически пересматривай свои примеры, убирай устаревшие, добавляй новые сложные случаи
Шаблон промпта
У меня есть база примеров с решениями: {твоя_база_примеров}
Новая задача: {новая_задача}
Действуй по шагам:
1. Найди {k} самых похожих примеров из базы
2. Для каждого похожего примера объясни:
- В чём сходство с новой задачей
- Какое решение было в этом примере
- Какой паттерн можно извлечь
3. Если похожие примеры имеют противоречивые решения — это сложный случай. Объясни детально почему новая задача ближе к одному решению, чем к другому.
4. Реши новую задачу, опираясь на паттерны из похожих примеров.
Плейсхолдеры:
- {твоя_база_примеров} — список твоих прошлых задач с решениями (минимум 10-20 для эффекта)
- {новая_задача} — задача, которую нужно решить
- {k} — сколько похожих примеров искать (рекомендую 3-5)
🚀 Быстрый старт — вставь в чат:
Вот шаблон RetroPrompt для обучения по аналогии. Адаптируй под мою задачу: [опиши свою задачу и дай пример базы].
Задавай вопросы, чтобы настроить поиск похожих примеров.
[вставить шаблон выше]
LLM спросит какие критерии похожести важны для твоей задачи (структурные? семантические? по tone?) и сколько примеров искать — это нужно чтобы аналогии были релевантными. Она возьмёт паттерн поиска по аналогиям и адаптирует под твой домен.
Почему это работает (дополнительно)
Метафора "открытая книга": Обычный промптинг = экзамен по закрытой книге, где всё нужно держать в голове (параметрах модели). RetroPrompt = экзамен с открытым конспектом, где можно подглядеть в примеры. Исследование показало, что такой подход особенно эффективен для long-tail примеров — редких случаев, которые составляют меньшинство данных но важны для качества.
Эффект для атипичных примеров: Модель перестаёт пытаться "впихнуть" редкие случаи в общую функцию. Вместо этого она говорит: "Этот пример редкий, пойду посмотрю что делали в похожих ситуациях". Это снижает overfitting (переобучение на поверхностных признаках) в few-shot сценариях.
Комбинация параметрического и непараметрического: Модель учится общим паттернам (параметрически), но для финального решения смешивает своё предсказание с "голосованием соседей". Если модель уверена — вес её предсказания выше. Если кейс редкий/сложный — больше вес у похожих примеров. Это как совмещение интуиции (модель) и прецедентов (база примеров).
Ограничения
⚠️ Требует достаточную базу примеров: Если у тебя меньше 10 примеров, поиск похожих не даст эффекта — нечего искать. Метод расцветает при наличии 50+ размеченных примеров.
⚠️ Ручной поиск похожести несовершенен: Ты или модель ищете похожие примеры "на глаз" по тексту, без точных embeddings. Можешь пропустить нетривиальные аналогии (например, структурно похожие, но с разными словами).
⚠️ Размер контекста: Вставка большой базы примеров в промпт съедает токены. При базе в 100+ примеров нужно либо выбирать подмножество, либо делать предварительную фильтрацию в отдельном запросе.
⚠️ Оригинальный метод требует код: Полная имплементация с embeddings, FAISS-индексами и kNN — это Python + API. Ручная адаптация проще, но менее точна.
⚠️ Может вредить на простых задачах: Если задача простая и модель уверенно знает ответ, поиск примеров и усложнение промпта только добавит шума. Используй для сложных, пограничных или редких случаев.
Ресурсы
"Retrieval-augmented Prompt Learning for Pre-trained Foundation Models" Оригинальная версия принята на NeurIPS 2022 (Spotlight) как "Decoupling Knowledge from Memorization: Retrieval-augmented Prompt Learning"
Исследователи: Xiang Chen, Yixin Ou, Quan Feng, Lei Li, Piji Li, Haibo Ye, Sheng-Jun Huang, Shuofei Qiao, Shumin Deng, Huajun Chen, Ningyu Zhang
Институты: Nanjing University of Aeronautics and Astronautics (MIIT Key Laboratory), Zhejiang University, National University of Singapore
Код и датасеты: https://github.com/zjunlp/PromptKG/tree/main/research/RetroPrompt
Связанные концепции из статьи: - kNN-LM — классический метод использования k ближайших соседей для языковых моделей - CLIP — архитектура для визуального понимания, которую адаптировали авторы - FAISS — библиотека для быстрого поиска ближайших соседей (используется в оригинальной имплементации)
