TL;DR
Reference Points — техника, которая добавляет в промпт дополнительные данные как точки сравнения для LLM. Вместо анализа текста в вакууме модель получает контекст: средние показатели пользователя, бенчмарки категории, дополнительные факторы. Всё подаётся в JSON-формате, а не plain text.
Модели плохо оценивают текст изолированно — им не хватает контекста. Если пользователь обычно ставит 2 звезды, а тут поставил 4 — это восторг. Если заведение в среднем получает 4.5, а конкретный отзыв дал 3 — это провал. LLM без этого контекста видит только слова, но не понимает относительную оценку. Именно так работает психология: мы оцениваем не абсолютно, а относительно ожиданий (prospect theory) и прошлого опыта.
Метод добавляет три типа информации в JSON: U (user average) — средняя оценка пользователя из истории, B (business average) — средняя оценка заведения от всех, O (other) — дополнительные факторы вроде часов работы. Модель получает структурированный контекст перед анализом и использует его как систему координат для интерпретации текста.
Схема метода
ОДНОШАГОВЫЙ ПРОМПТ (всё в одном запросе):
ИНСТРУКЦИЯ: Ты анализируешь отзывы. Оценивай по шкале 1-5.
При оценке учитывай JSON с контекстом.
ПРИМЕР:
User review: [пример отзыва]
Supplementary Information: {"user_average_stars": 2.6, "business_average_stars": 3.0}
Output: 5
ЗАДАЧА:
User review: [целевой отзыв]
Supplementary Information: {JSON с данными U/B/O}
Output: _
Модель генерирует одно число (1-5) на основе текста + контекста.
Пример применения
Задача: Оцениваешь отзыв клиента на ресторан "Белуга" в Москве для системы рекомендаций.
Промпт:
Ты анализируешь отзывы о ресторанах. Оцени отзыв по шкале 1-5.
Учитывай JSON с контекстом: user_average_stars (средняя оценка этого
пользователя в прошлых отзывах), business_average_stars (средняя оценка
ресторана от всех клиентов), open_hours (часов работы в неделю).
### Пример
User review: Отличное место, но дороговато.
Supplementary Information: {"user_average_stars": 3.2,
"business_average_stars": 4.1, "open_hours": 84}
Output: 4
### Задача
User review: Невероятно! Лучший томленый судак что я пробовал.
Сервис на уровне, хотя пришлось подождать столик 15 минут.
Supplementary Information: {"user_average_stars": 2.8,
"business_average_stars": 4.5, "open_hours": 70}
Output: _
Результат:
Модель выдаст число 5. Она видит: пользователь обычно критичен (средняя 2.8), но тут написал восторженно. Ресторан объективно сильный (4.5), текст подтверждает. Модель понимает контрастность оценки: для скептика это прорыв, хотя объективно заведение и так топ.
Без контекста модель могла бы дать 4 (из-за упоминания ожидания). С контекстом она калибрует оценку относительно истории пользователя и репутации места.
Почему это работает
LLM плохо оценивают относительность. Текст "неплохо" может означать 3 или 5 звёзд в зависимости от того, кто пишет. Модель видит слова, но не знает шкалу координат автора.
Сильная сторона LLM — понимать структурированные данные и использовать их для контекстуальных выводов. JSON — это язык, который модель парсит эффективнее, чем plain text с теми же данными. В исследовании NL-промпт с описанием ("средняя оценка пользователя 2.6") проваливается при добавлении информации, а JSON-промпт улучшается.
Механика: Модель получает три типа якорей — U (насколько придирчив автор), B (насколько хорошо заведение в целом), O (дополнительный контекст). Комбинация якорей создаёт систему отсчёта. Если U=2.8 и текст позитивный → это сильный сигнал. Если B=4.5 и текст нейтральный → возможно, разочарование.
Рычаги управления:
- Числовые reference points (U/B) → убери один, чтобы упростить промпт при нехватке данных
- Дополнительные факторы (O) → добавь свои: цена, локация, время визита
- JSON vs NL → всегда JSON для >2 параметров, LLM парсит точнее
- One-shot vs Few-shot → добавь 2-3 примера если данных мало, но помни про дополнительные переменные
Шаблон промпта
Ты анализируешь {тип_контента}. Оцени по шкале {шкала}.
Учитывай JSON с контекстом: {описание_полей_JSON}.
### Пример
{тип_контента}: {пример_текста}
Supplementary Information: {пример_JSON}
Output: {пример_оценки}
### Задача
{тип_контента}: {целевой_текст}
Supplementary Information: {целевой_JSON}
Output: _
Плейсхолдеры:
{тип_контента}— что анализируем: отзывы, комментарии, письма{шкала}— диапазон оценок: 1-5, 1-10, позитив/нейтрал/негатив{описание_полей_JSON}— что означает каждое поле в JSON{пример_текста},{пример_JSON},{пример_оценки}— one-shot пример{целевой_текст},{целевой_JSON}— данные для анализа
🚀 Быстрый старт — вставь в чат:
Вот шаблон Reference Points для анализа с контекстом. Адаптируй
под мою задачу: [опиши задачу]. Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит: какой контент анализируешь, какая шкала, какие данные есть для reference points. Модель возьмёт структуру промпта и адаптирует под твою задачу — тебе не нужно вручную заполнять JSON.
Ограничения
⚠️ Конфликт якорей: Когда user_average сильно расходится с business_average (например, 2 vs 5), точность падает. Модель не знает какому якорю доверять. В исследовании такие кейсы показывали 0% точности в отдельных ячейках матрицы.
⚠️ Качество данных: Если средние оценки неполные (мало истории пользователя) или устаревшие, они скорее вредят. Метод требует достаточного объёма данных для вычисления стабильных средних.
⚠️ Не для субъективных критериев без шкалы: Метод работает на количественных оценках (звёзды, баллы). Для чисто качественного анализа ("креативность текста", "убедительность аргументов") без чёткой шкалы reference points бесполезны.
⚠️ Лёгкий домен-спецификой: Исследовали на отзывах Yelp. Для других типов контента (B2B-письма, научные тексты, код-ревью) нужны свои типы reference points — не факт что user/business average подойдут.
Как исследовали
Команда взяла 500 отзывов из двух категорий Yelp (рестораны и ночные клубы) и прогнала через Llama 3.2-3B без fine-tuning. Сравнивали с четырьмя baseline моделями (BERT, DistilBERT, RoBERTa, DeBERTa), которые fine-tuning получили на 1000 дополнительных примеров.
Тестировали 6 вариантов промптов: JSON-UBO (все данные), JSON-UB (только средние), JSON-O (только доп. факторы) + аналоги в NL-формате + LLM без контекста. Измеряли Macro-F1 (классификация) и RMSE (регрессия).
Ключевой результат: JSON-UBO без fine-tuning побил все baseline модели, даже fine-tuned RoBERTa. Macro-F1 вырос на 1.6-20.7%, RMSE упал на 9-16%. При этом NL-промпты с теми же данными провалились — точность не росла или даже падала при добавлении информации.
Проверка на "обман": Исследователи опасались, что модель просто копирует средние оценки вместо анализа. Разбили данные на 5 групп по величине разрыва между reference point и реальной оценкой. Если бы модель читерила — точность была бы максимальной при нулевом разрыве. Но оказалось наоборот: точность росла когда оценка отклонялась от средней (особенно вверх). Модель действительно использует reference points для контекстуального рассуждения, а не как подсказку ответа.
Матрица взаимодействий: Построили 5×5 сетку где строки — user_average, столбцы — business_average, ячейки — точность. Обнаружили: модель работает идеально (100%) когда якоря согласованы (диагональ матрицы) и проваливается (0%) при конфликте якорей. Это показывает что модель не просто смотрит на один якорь, а взвешивает оба.
Важный инсайт: Лёгкая модель (3B параметров) + структурированный промпт обгоняет тяжёлые fine-tuned модели. Это означает что prompt engineering с правильным контекстом может заменить дорогой fine-tuning для задач где доступны rich данные.
Оригинал из исследования
### Instruction
You are a helpful assistant evaluating the review texts about
the restaurant. Please evaluate the review text and assign an
integer score ranging from 1 for the most negative comment to
5 for the most positive comment. The output should be a single
integer from 1 to 5.
When evaluating the review, consider both the textual sentiment
and the supplementary information in JSON format. Use
'user_average' (the average score this user has given in their
past reviews) to understand the user's typical rating behavior
and 'restaurant_average' (the average score this restaurant has
received across all users) to compare this restaurant's
performance relative to others. Additionally, use
'restaurant_name', 'open_hours' (the total number of hours the
restaurant is open in a week), and 'open_days' (the total number
of days the restaurant is open in a week) to contextualize the
review.
### Example
User review: This restaurant was...
Supplementary Information: {"user_average_stars": 2.6,
"business_average_stars": 3.0}
Output: 5
### Task
User review: {user_review}
Supplementary Information: {JSON_data}
Output: _
Контекст: Исследователи использовали этот промпт для JSON-UBO модели (с полным набором данных: user average + business average + other factors). Модель генерирует одно число после Output и останавливается.
Адаптации и экстраполяции
💡 Адаптация для анализа performance review:
Тот же принцип reference points применим к оценке сотрудников. Вместо user_average → manager_average (насколько строгий руководитель), вместо business_average → team_average (средняя оценка команды).
Ты анализируешь performance review сотрудника. Оцени по шкале 1-5.
Учитывай JSON с контекстом: manager_average (средняя оценка которую
этот руководитель обычно ставит), team_average (средняя оценка команды),
tenure_months (стаж сотрудника в компании).
### Пример
Review: Отличный квартал. Закрыл 3 сделки, хотя две сорвались из-за макро.
Supplementary Information: {"manager_average": 3.2, "team_average": 3.8,
"tenure_months": 18}
Output: 4
### Задача
Review: {текст_ревью}
Supplementary Information: {JSON_данные}
Output: _
🔧 Техника: Добавь "reasoning" поле → видеть логику модели
Исследование использует text-completion где модель выдаёт только число. Но можно попросить модель объяснить почему она выбрала эту оценку на основе reference points.
Output format: {"score": [1-5], "reasoning": "[объяснение]"}
### Example
...
Output: {"score": 5, "reasoning": "Пользователь обычно критичен (2.8),
но тут восторг → сильный позитив. Место топ (4.5), подтверждает."}
Эффект: Ты видишь КАК модель использует якоря. Полезно для дебага и понимания где модель ошибается.
💡 Экстраполяция: Reference points для оценки бизнес-идей
Принцип применим к оценке startups. Вместо sentiment analysis → feasibility scoring.
Ты оцениваешь бизнес-идею по шкале 1-10 (реализуемость).
Учитывай JSON: founder_success_rate (% успешных проектов основателя
в прошлом), market_avg_failure_rate (% провалов в этой нише),
runway_months (денег хватит на N месяцев).
### Пример
Pitch: Маркетплейс для аренды дронов с доставкой за 1 час в Москве.
Supplementary Information: {"founder_success_rate": 0.2,
"market_avg_failure_rate": 0.7, "runway_months": 6}
Output: 3
### Задача
Pitch: {описание_идеи}
Supplementary Information: {JSON_данные}
Output: _
Логика: Модель калибрует оценку относительно track record фаундера и сложности ниши. Низкий success rate + жёсткий рынок → скептичная оценка даже при хорошей идее.
Ресурсы
Reference Points in LLM Sentiment Analysis: The Role of Structured Context — Junichiro Niimi (Meijo University, RIKEN AIP), препринт 2025.
Датасет: Yelp Open Dataset
Модель: Llama 3.2-3B-Instruct (Meta)
