TL;DR
PerFine — техника персонализированной генерации текста через циклическую доработку с фидбеком. Модель генерирует черновик → второй экземпляр LLM критикует по 4 критериям (тон, словарь, структура предложений, релевантность темы) на основе примеров стиля пользователя → первая модель дорабатывает → knockout-механизм выбирает лучшую версию между итерациями. Цикл повторяется 3-5 раз.
Главная находка: LLM хорошо генерирует текст на основе примеров, но дрейфует от целевого стиля в процессе. Модель может написать грамотно и по теме, но упустить важные детали персонализации — использовать формальный тон вместо разговорного, упростить структуру предложений, забыть про характерную лексику. Проблема в том, что retrieval (извлечение релевантных примеров из профиля) даёт контекст, но не гарантирует соблюдения стиля в финальном тексте. Модель "видит" примеры, но не всегда "следует" им точно.
Суть метода: PerFine разделяет задачу на две роли — генератор и критик. Генератор создаёт текст, критик проверяет соответствие по 4 направлениям персонализации и даёт структурированный фидбек. После каждой доработки knockout-механизм сравнивает текущую версию с предыдущей и оставляет лучшую — это защищает от регресса, когда правка одного аспекта ухудшает другой. Через 3-5 итераций текст стабильно приближается к целевому стилю.
Схема метода
ИТЕРАЦИЯ 0 (инициализация):
Generator → черновик y₀ (на основе примеров стиля пользователя)
ИТЕРАЦИЯ 1-5 (цикл доработки):
ШАГ 1: Critic → фидбек по 4 критериям
- Тон (эмоциональная окраска, формальность)
- Словарь (уровень и характер лексики)
- Структура предложений (длина, сложность)
- Релевантность темы (полнота, точность)
ШАГ 2: Generator → доработанная версия y_new
ШАГ 3: Critic → knockout (сравнение y_new с y_prev)
→ если y_new лучше → y_new идёт дальше
→ если y_prev лучше → сохраняем y_prev
[Цикл повторяется 3-5 раз]
Важно: Все шаги выполняются отдельными запросами. Critic и Generator могут быть одной моделью (self-refinement) или разными.
Пример применения
⚠️ Сильная зона метода: Задачи, где есть конкретные примеры целевого стиля (тексты пользователя, образцы написания). Метод работает хуже, если примеров мало (<3) или они сильно различаются по стилю.
Задача: Написать отзыв на кафе "Кофемания" для Яндекс.Карт в стиле человека, который пишет подробные, честные, чуть ироничные обзоры с вниманием к деталям сервиса.
Исходные данные:
- Место: Кофемания на Патриарших
- Оценка: 4 звезды
- Примеры стиля пользователя:
- "Интерьер приятный, но кондиционер гудел как старый холодильник"
- "Официанты улыбались, хотя забыли принести сахар — пришлось напомнить дважды"
- "Капучино вкусный, но подали в чашке размером с напёрсток за 290₽"
Промпт (первая итерация):
Ты — генератор персонализированных текстов.
ЗАДАЧА: Напиши отзыв на кафе "Кофемания" на Патриарших для Яндекс.Карт.
ОЦЕНКА: 4 звезды
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
- "Интерьер приятный, но кондиционер гудел как старый холодильник"
- "Официанты улыбались, хотя забыли принести сахар — пришлось напомнить дважды"
- "Капучино вкусный, но подали в чашке размером с напёрсток за 290₽"
ИНСТРУКЦИЯ: Сохрани тон, словарь и структуру предложений как в примерах. Опиши атмосферу, кухню, сервис.
Промпт критика (после генерации):
Ты — критик персонализированных текстов.
ЗАДАЧА: Оцени отзыв по соответствию стилю пользователя.
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
[те же примеры]
СГЕНЕРИРОВАННЫЙ ТЕКСТ:
[вставить текст от генератора]
КРИТЕРИИ ОЦЕНКИ:
1. ТОН: Соответствует ли эмоциональная окраска (ироничный, честный)?
2. СЛОВАРЬ: Используется ли разговорная лексика ("гудел", "напёрсток")?
3. СТРУКТУРА: Есть ли контрастные предложения ("приятный, но...")?
4. ТЕМА: Описаны ли важные аспекты (атмосфера, кухня, сервис)?
ДАЙ ФИДБЕК: Что улучшить для точного попадания в стиль?
Результат:
Модель пройдёт 3-5 итераций, где:
- Итерация 1: Critic отметит, что тон слишком нейтральный, нет фирменной иронии
- Итерация 2: Generator добавит контрастные конструкции ("но..."), Critic одобрит направление
- Итерация 3: Critic попросит усилить детали (конкретные блюда, цены), Generator доработает
- Итерация 4-5: Knockout сохранит лучшую версию, если новая хуже
Финальный текст будет точнее попадать в стиль: разговорный словарь, контрастные предложения, внимание к мелочам, лёгкая ирония при 4 звёздах.
Почему это работает
Слабость LLM: Модели дрейфуют от целевого стиля при генерации. Даже если промпт содержит примеры, модель склонна к регрессии к среднему — усреднению тона, упрощению структуры, потере характерных деталей. Retrieval даёт контекст, но не гарантирует точного следования стилю. Одношаговая генерация — это балансирование между "не забыть тему" и "соблюсти стиль", где второе часто проигрывает.
Сильная сторона LLM: Модели отлично анализируют и сравнивают тексты. Если дать LLM два варианта и примеры целевого стиля, она точно определит, какой вариант ближе. Модели также хорошо генерируют структурированный фидбек — могут не только указать "тон не тот", но и объяснить "нужен более ироничный тон, как в примере про кондиционер".
Механика PerFine:
- Разделение ролей: Генератор фокусируется на создании текста, критик — на проверке соответствия. Это снимает когнитивную нагрузку "делать всё сразу".
- Структурированный фидбек по 4 направлениям: Вместо абстрактного "сделай лучше" критик даёт конкретные указания ("усиль иронию в тоне", "добавь разговорных слов"). Это снижает неопределённость для генератора.
- Knockout защищает от регресса: Сравнение версий предотвращает ситуацию, когда правка одного аспекта (например, тона) ухудшает другой (например, структуру). Остаётся лучший вариант из всех итераций.
- Итеративность даёт инкрементальное улучшение: За 3-5 раундов текст постепенно приближается к целевому стилю. Исследование показало, что улучшения стабильны до 3-5 итераций, после чего выходят на плато.
Рычаги управления промптом:
| Элемент | Что менять | Эффект |
|---|---|---|
| Число итераций | Уменьшить до 2-3 для простых задач | Экономия токенов, быстрее результат |
| Критерии фидбека | Убрать 1-2 критерия (например, оставить только тон и тему) | Фокус на главном, меньше шагов |
| Knockout | Отключить, оставить только последнюю версию | Быстрее, но риск регресса |
| Примеры стиля | Добавить больше примеров (5-7 вместо 3) | Точнее попадание в стиль |
| Роль критика | Дать конкретное имя вместо "критик" | Острее выполнение роли |
Шаблон промпта
Генератор (итерация 0):
Ты — генератор персонализированных текстов.
ЗАДАЧА: {описание задачи}
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
{пример_1}
{пример_2}
{пример_3}
ИНСТРУКЦИЯ: Напиши текст, строго соблюдая тон, словарь и структуру предложений из примеров.
Критик (итерация 1-5):
Ты — критик персонализированных текстов.
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
{пример_1}
{пример_2}
{пример_3}
СГЕНЕРИРОВАННЫЙ ТЕКСТ:
{текст_от_генератора}
КРИТЕРИИ ОЦЕНКИ:
1. ТОН: Соответствует ли эмоциональная окраска примерам?
2. СЛОВАРЬ: Используется ли характерная лексика пользователя?
3. СТРУКТУРА: Соответствует ли длина и сложность предложений примерам?
4. ТЕМА: Описаны ли все важные аспекты задачи?
ДАЙ КОНКРЕТНЫЙ ФИДБЕК по каждому критерию: что изменить для точного попадания в стиль?
Генератор (доработка):
Ты — генератор персонализированных текстов.
ЗАДАЧА: {описание задачи}
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
{пример_1}
{пример_2}
{пример_3}
ПРЕДЫДУЩАЯ ВЕРСИЯ ТЕКСТА:
{текст_от_генератора}
ФИДБЕК КРИТИКА:
{фидбек}
ИНСТРУКЦИЯ: Доработай текст на основе фидбека. Сохрани сильные стороны, исправь слабые.
Knockout (сравнение версий):
Ты — арбитр, который выбирает лучший текст.
ПРИМЕРЫ СТИЛЯ ПОЛЬЗОВАТЕЛЯ:
{пример_1}
{пример_2}
{пример_3}
ВАРИАНТ A (предыдущая версия):
{текст_предыдущий}
ВАРИАНТ B (новая версия):
{текст_новый}
ВОПРОС: Какой вариант точнее соответствует стилю пользователя по всем 4 критериям (тон, словарь, структура, тема)?
ОТВЕТ: A или B + краткое обоснование.
Пояснения к плейсхолдерам:
{описание задачи}— что нужно написать (отзыв, email, пост){пример_1, 2, 3}— реальные тексты пользователя (минимум 3){текст_от_генератора}— результат предыдущего шага{фидбек}— структурированный ответ критика
🚀 Быстрый старт — вставь в чат:
Вот шаблон PerFine для персонализации текста. Адаптируй под мою задачу: [опиши что нужно написать и в каком стиле].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит примеры твоих текстов (минимум 3) и детали задачи — потому что метод работает на сравнении стилей. Она возьмёт паттерн "генерация → критика → доработка → knockout" и адаптирует под конкретную задачу.
Ограничения
⚠️ Малое количество примеров: Метод работает хуже, если примеров стиля меньше 3 или они сильно различаются. Нужна стабильная база для сравнения.
⚠️ Субъективные критерии: Для креативных задач без чёткого целевого стиля (например, "напиши вдохновляющий текст") метод может зациклиться на разных интерпретациях.
⚠️ Стоимость итераций: 5 итераций = 5x запросов к LLM. При работе с дорогими моделями (GPT-4) это ощутимо по бюджету.
⚠️ Холодный старт: Если у пользователя нет истории текстов (новый аккаунт), метод теряет основу для персонализации.
Как исследовали
Исследователи взяли три датасета отзывов — Yelp (рестораны), Amazon (товары), Goodreads (книги) — по 2500 пользователей в каждом. Для каждого пользователя построили граф взаимодействий: узлы — пользователи и товары, рёбра — отзывы. Это позволило извлекать не только собственные тексты пользователя, но и отзывы "соседей" (других людей, оценивших те же товары) — для обогащения контекста темой.
Базовый метод (PGraphRAG) работал так: retrieval топ-4 текстов пользователя + топ-4 от соседей → генерация отзыва одним запросом. PerFine стартовал с этого результата и запускал цикл доработки. Сравнивали три варианта:
- LaMP (только тексты пользователя, без соседей) — baseline
- PGraphRAG (тексты пользователя + соседей) — улучшенный baseline
- PerFine + Knockout (PGraphRAG + итеративная доработка) — новый метод
Что измеряли: GEval (LLM-as-a-Judge метрика, где GPT оценивает качество по шкале) и METEOR (автоматическая метрика схожести с эталоном).
Ключевые находки:
- PerFine стабильно лучше на +7-13% по GEval (Yelp: 0.400 → 0.441, Goodreads: 0.445 → 0.480, Amazon: 0.410 → 0.465)
- Эффект плато: Улучшения видны до 3-5 итераций, потом выходят на плато — дальнейшие доработки не дают прироста
- Размер критика важен: Увеличение размера модели-критика с 7B до 32B параметров монотонно улучшает результат (Yelp: 0.431 → 0.470). Более крупные критики дают точнее фидбек.
- Self-refinement работает: Даже если генератор и критик — одна модель (Llama-3.1-8B), метод превосходит baseline. Это экономит память (не нужна вторая модель).
- Best-of-N даёт +2%, но дорого: Вариант, где на каждой итерации генерируется 3 версии и критик выбирает лучшую, показал +2% к качеству, но утроил расход токенов. Knockout (сравнение только двух версий: новой и предыдущей) даёт 95% эффекта при половине стоимости.
Почему результаты такими получились: Retrieval даёт контекст, но не управляет генерацией напрямую. Модель "видит" примеры, но в процессе написания может дрейфовать к усреднённому стилю. Критик же после полной генерации оценивает весь текст целиком и даёт конкретные указания — это эффективнее, чем пытаться "всё учесть сразу" в одном промпте. Knockout защищает от регресса: если новая версия хуже (например, исправили тон, но сломали структуру), остаётся предыдущая. Это создаёт монотонное улучшение через итерации.
Любопытная деталь: Topic Extraction (когда вместо сырых текстов критику давали саммари стиля и темы) показал схожее качество при -30% токенов на критика. Но общий расход вырос из-за начального этапа экстракции тем. Это trade-off: компактность контекста vs overhead на препроцессинг.
Оригинал из исследования
Контекст: Исследователи тестировали PerFine на задаче генерации отзывов. Вот промпт для Critic LLM, который даёт структурированный фидбек по 4 критериям персонализации.
You are a personalized content critic. Your task is to evaluate the generated text
for alignment with the user's writing style and provide constructive feedback.
USER PROFILE (sample texts):
{user_history_texts}
NEIGHBOR PROFILE (sample texts for topic context):
{neighbor_texts}
QUERY (item to review):
{item_description}
GENERATED TEXT:
{generated_review}
EVALUATION CRITERIA:
1. TONE CONSISTENCY:
Evaluate whether the tone and sentiment align with the user's writing style.
- Does the emotional tone (enthusiastic, critical, neutral) match the user's typical style?
- Is the level of formality consistent?
2. VOCABULARY MATCH:
Evaluate whether the vocabulary level is consistent with the user's lexicon.
- Are the word choices similar to those in the user's previous texts?
- Does it use domain-specific terms the user typically employs?
3. SENTENCE STRUCTURE:
Evaluate if the sentence lengths, complexity, and syntactic structures align
with the user's style.
- Are sentences simple or complex, similar to the user's writing?
- Does the text use similar punctuation patterns?
4. TOPIC RELEVANCE:
Evaluate if the generated content is relevant to the query, free of off-topic
information, and inclusive of important aspects.
- Does it address the key aspects of the item being reviewed?
- Is there any irrelevant or missing information?
PROVIDE FEEDBACK:
For each criterion, state:
- What is done well
- What needs improvement
- Specific suggestions for refinement
Format your feedback as:
TONE: [feedback]
VOCABULARY: [feedback]
SENTENCE STRUCTURE: [feedback]
TOPIC RELEVANCE: [feedback]
Knockout промпт (сравнение двух версий):
You are an arbiter that compares two text generations and selects the more
personalized one based on the user's writing style.
USER PROFILE (sample texts):
{user_history_texts}
VERSION A (previous iteration):
{text_v1}
VERSION B (current iteration):
{text_v2}
TASK:
Compare both versions across four dimensions:
1. Tone consistency with user's style
2. Vocabulary match with user's lexicon
3. Sentence structure alignment
4. Topic relevance
SELECT: Which version (A or B) better aligns with the user's writing style overall?
RESPOND:
Selected version: [A or B]
Reason: [brief explanation of why this version is more personalized]
Адаптации и экстраполяции
💡 Адаптация для контент-маркетинга:
Вместо отзывов — генерация постов для соцсетей в стиле бренда. Примеры стиля = предыдущие посты компании.
ЗАДАЧА: Напиши пост для Telegram-канала [Название компании] про новую функцию продукта.
ПРИМЕРЫ СТИЛЯ КОМПАНИИ:
[3-5 постов из архива канала]
[Далее: стандартный цикл PerFine с критиком]
Польза: Контент-менеджеры получают черновики, которые не требуют сильной правки стиля — только проверку фактов.
💡 Адаптация для юридических документов:
Генерация договоров или писем в стиле юриста с учётом его характерных формулировок.
ЗАДАЧА: Составь допсоглашение к договору аренды.
ПРИМЕРЫ СТИЛЯ ЮРИСТА:
[3-5 фрагментов предыдущих договоров этого юриста]
КРИТЕРИИ (адаптация):
1. ТОН: Формальность, уровень категоричности
2. ТЕРМИНОЛОГИЯ: Использование характерных юридических конструкций
3. СТРУКТУРА: Нумерация пунктов, длина параграфов
4. ПОЛНОТА: Наличие всех необходимых условий
Польза: Автоматизация рутины при сохранении индивидуального стиля специалиста.
🔧 Техника: Убрать knockout → видеть эволюцию стиля
Если не использовать knockout (не сравнивать версии), можно отследить как менялся текст через итерации — полезно для обучения написанию.
[Стандартный цикл PerFine, но БЕЗ knockout-шага]
После 5 итераций попроси:
"Покажи все 5 версий текста рядом и объясни, что менялось на каждом шаге"
Эффект: Пользователь видит процесс доработки — это дидактически ценно для копирайтеров и студентов.
🔧 Техника: Персонажи вместо безликих ролей → острее критика
Замени "критик" на конкретного персонажа с характером.
Ты — Максим Ильяхов, редактор "Главреда". Твоя задача — проверить текст
на соответствие стилю пользователя и дать фидбек как ты это делаешь:
прямо, конкретно, с примерами.
[Далее: стандартный промпт критика]
Эффект: Критика становится жёстче и точнее — модель лучше входит в роль конкретного персонажа, чем в абстрактного "критика".
Ресурсы
Iterative Critique-Refine Framework for Enhancing LLM Personalization
Авторы: Durga Prasad Maram, Dhruvin Gandhi, Zonghai Yao, Gayathri Akkinapalli, Franck Dernoncourt, Yu Wang, Ryan A. Rossi, Nesreen K. Ahmed
University of Massachusetts Amherst, Adobe Research, University of Oregon, Cisco AI Research
Релевантные ссылки из исследования:
- PGraphRAG (граф-based retrieval для персонализации)
- LaMP benchmark (персонализированная генерация)
- SELF-REFINE (self-critique для улучшения outputs)
- G-Eval (LLM-as-a-Judge метрика оценки)
