Как вы делаете synthetic eval (генерация тестовых вопросов по документам)?

Краткий тезис

Synthetic eval — это автоматическая генерация тестовых вопросов и эталонных ответов на основе документов с помощью LLM. Такой подход позволяет быстро и дёшево создать датасет для оценки RAG-системы без ручной разметки. Ключевые элементы: генерация вопросов]] разных типов (факты, рассуждение, сравнение), контроль качества через self-consistency (другой LLM проверяет ответ) и ручная валидация небольшой выборки (золотой набор). Synthetic eval широко применяется для автоматического измерения faithfulness, answer relevance и других метрик RAG.


1. Термин: Synthetic eval (синтетическая оценка)

Synthetic eval — это процесс создания оценочного датасета (вопросы + ответы) с помощью LLM, а не руками. В контексте RAG он решает проблему отсутствия размеченных данных: вместо того чтобы нанимать аннотаторов, вы «просите» LLM прочитать документ и сформулировать вопросы, на которые в нём есть ответ.

Зачем нужен synthetic eval

  • Экономия времени и денег — ручная разметка тысяч вопросов стоит дорого.
  • Масштабируемость — можно сгенерировать датасет на любой объём документов.
  • Покрытие редких сценариев — LLM может задать вопросы, которые человек не придумает.
  • Автоматизация CI/CD — synthetic eval встраивается в пайплайн регрессионного тестирования RAG.

Ограничение качество синтетических данных зависит от LLM-генератора; возможны галлюцинации и систематические смещения.


2. Основной подход: LLM генерирует вопросы по документу

Процесс состоит из трёх шагов:

  1. Подача документа (или чанка) в LLM с промптом: «Прочитай текст и сформулируй вопросы, на которые можно ответить, используя только этот текст. Для каждого вопроса дай ответ цитатой из текста».
  2. Генерация вопросов — LLM выдает пары (вопрос, ответ). Обычно запрашивают 3–5 вопросов на один чанк.
  3. Сбор датасета — все пары объединяются, при необходимости дедуплицируются.

Пример промпта (упрощённый):

Ты — ассистент для создания тестовых данных. Прочитай следующий документ. 
Сгенерируй 3 вопроса разных типов (фактический, на рассуждение, на сравнение) 
и дай на них точные ответы, используя только информацию из документа.

Документ: {текст}

Формат вывода:
Вопрос 1: ...
Ответ 1: ...
Вопрос 2: ...
Ответ 2: ...
Вопрос 3: ...
Ответ 3: ...

Типы вопросов (Who, What, Where, When, Why, How):

  • Who — «Кто автор документа?»
  • What — «Что такое RAG
  • Where — «Где хранятся эмбеддинги?»
  • When — «Когда была опубликована статья?»
  • Why — «Почему используется chunking
  • How — «Как работает retrieval

3. Контроль качества: self-consistency

Сгенерированные пары могут содержать ошибки (LLM выдумала ответ, не соответствующий документу). Для фильтрации применяется self-consistency:

  • Другой LLM (или та же модель, но с другим промптом) получает документ и вопрос, но не видит сгенерированный ответ. Он должен самостоятельно ответить на вопрос.
  • Если ответ второго LLM совпадает (по смыслу или exact match) с исходным ответом, пара считается качественной.
  • Если не совпадает — пара отбрасывается или отправляется на ручную проверку.

Варианты проверки

  • LLM-as-a-judge — третий LLM оценивает, насколько ответ соответствует документу (score 0–1).
  • NLI (Natural Language Inference) — модель entailment проверяет, следует ли ответ из документа.

Пример кода (псевдо-Python):

def check_consistency(doc, question, generated_answer, judge_llm):
    prompt = f"Document: {doc}\nQuestion: {question}\nAnswer the question based on the document."
    judge_answer = judge_llm.generate(prompt)
    # Сравниваем семантически (например, через cosine similarity эмбеддингов)
    similarity = cosine_similarity(embed(generated_answer), embed(judge_answer))
    return similarity > 0.85

4. Разнообразие вопросов

Чтобы датасет покрывал разные аспекты RAG, нужно генерировать вопросы разных типов:

Тип вопросаПримерЧто проверяет в RAG
Фактический (factoid)«Какой год основания компании?»Точность retrieval (находит ли точный факт)
На рассуждение (reasoning)«Почему метод A лучше B?»Способность LLM соединять несколько фактов
Сравнение (comparison)«Чем отличается RAG от fine-tuningПонимание контрастов
Условный (conditional)«Что произойдёт, если увеличить chunk size?»Причинно-следственные связи
Списочный (list)«Перечисли три стратегии chunkingПолнота извлечения

Промпт для разнообразия в инструкцию LLM добавляют: «Сгенерируй один фактический вопрос, один вопрос на рассуждение и один на сравнение».


5. Золотой набор: 10% проверяются руками

Даже после self-consistency остаются ошибки. Поэтому 10% синтетических пар (или фиксированное количество, например 100) проверяются человеком-аннотатором. Это даёт:

  • Оценку качества всего датасета — если в золотом наборе accuracy > 95%, можно доверять остальным.
  • Калибровку порогов — например, какой threshold similarity использовать в self-consistency.
  • Выявление систематических ошибок — LLM может систематически пропускать определённый тип вопросов.

Процесс

  1. Случайная выборка 10% пар.
  2. Аннотатор читает документ и оценивает: вопрос корректен? ответ точен? ответ полон?
  3. Метрика: acceptance rate (доля принятых пар).

6. Применение: автоматическая эвалюация RAG

Синтетический датасет используется для измерения метрик RAG без ручной разметки:

  • Faithfulness (фактологичность) — ответ RAG не противоречит документам. Измеряется как доля утверждений в ответе, подтверждённых документами.
  • Answer relevance (релевантность ответа) — ответ отвечает на вопрос.
  • Context relevance (релевантность контекста) — извлечённые чанки содержат информацию для ответа.

Инструменты

  • RAGAS — фреймворк, который принимает синтетический датасет и считает метрики.
  • TruLens — позволяет оценивать RAG с помощью feedback functions.
  • DeepEval — open-source библиотека для synthetic eval.

Пример использования RAGAS

from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy

# synthetic_dataset — список словарей с полями question, answer, contexts
result = evaluate(
    dataset=synthetic_dataset,
    metrics=[faithfulness, answer_relevancy, context_relevancy]
)
print(result)

7. Метрики для оценки самого synthetic eval

Чтобы понять, насколько хорош сгенерированный датасет, используют:

МетрикаОписаниеКак измерить
Coverage (покрытие)Доля документов/чанков, по которым сгенерирован хотя бы один вопросКоличество чанков с вопросами / всего чанков
Accuracy (точность)Доля пар, где ответ корректен (по золотому набору)Ручная проверка 10%
Diversity (разнообразие)Доля вопросов разных типовПодсчёт типов по классификатору
Consistency (согласованность)Средняя оценка self-consistencyСредний similarity score

Целевые значения

  • Coverage > 90%
  • Accuracy > 95% (на золотом наборе)
  • Diversity: каждый тип составляет не менее 10% датасета

8. Проблемы и ограничения

  1. Галлюцинации LLM — генератор может придумать вопрос, на который нет ответа в документе, или дать неверный ответ.
  2. Bias (смещение) — LLM склонна задавать простые фактические вопросы, избегая сложных рассуждений.
  3. Перекос в сторону популярных тем — если документ содержит много повторяющейся информации, вопросы будут однотипными.
  4. Затраты на LLM — генерация тысяч вопросов может быть дорогой (токены).
  5. Отсутствие негативных примеров — synthetic eval обычно генерирует только вопросы, на которые есть ответ; для тестирования «не знаю» нужны отдельные подходы.

Как бороться

  • Использовать несколько LLM (разные модели) и усреднять.
  • Добавлять в промпт инструкцию «избегай вопросов, на которые нет ответа».
  • Применять adversarial generation — LLM пытается найти пробелы в документе.

9. Лучшие практики

  • Используйте разные LLM для генерации и проверки — например, GPT-4 для генерации, Claude для self-consistency.
  • Добавляйте контекстные ограничения — «Ответ должен быть не длиннее 2 предложений» или «Используй только факты из первого абзаца».
  • Дедуплицируйте вопросы — семантическое сходство (cosine > 0.9) удаляет дубликаты.
  • Балансируйте типы вопросов — задайте в промпте пропорции (40% фактов, 30% рассуждений, 30% сравнений).
  • Итеративно улучшайте промпт — на золотом наборе проверяйте, какие вопросы отбраковываются, и корректируйте инструкцию.

Пример продвинутого промпта

Ты — эксперт по созданию тестов для RAG-систем. 
Сгенерируй 5 вопросов по следующему документу. 
Распределение: 2 факта (who/what/when), 2 рассуждения (why/how), 1 сравнение (compare/contrast).
Для каждого вопроса укажи точную цитату из документа, которая служит ответом.
Если вопрос требует объединения нескольких фактов, укажи все цитаты.
Документ: {text}

10. Пет-проект для закрепления

Задача Создать пайплайн synthetic eval для небольшой коллекции документов (например, 10 статей на тему RAG) и оценить качество retrieval с помощью RAGAS.

Инструменты

Шаги:

  1. Загрузите 10 документов (текст или PDF).
  2. Разбейте на чанки (например, по 500 токенов).
  3. Для каждого чанка сгенерируйте 3 вопроса с помощью LLM (промпт с типами).
  4. Проверьте self-consistency: второй LLM отвечает на вопросы без подсказки; отбросьте пары с низким сходством.
  5. Случайно выберите 10 пар для ручной проверки (золотой набор).
  6. Постройте RAG-систему: эмбеддинги (text-embedding-3-small), retrieval top-3.
  7. Запустите RAGAS на синтетическом датасете: получите faithfulness, answer_relevancy, context_relevancy.
  8. Проанализируйте: какие вопросы провалились? Почему?

Ожидаемый результат

  • Рабочий пайплайн генерации датасета.
  • Численные метрики RAG (например, faithfulness 0.85).
  • Понимание, какие типы вопросов сложнее для вашей RAG-системы.

11. Связь с другими вопросами

ВопросТема
5Оффлайн- и онлайн-метрики retrieval
10Self-RAG как альтернатива внешней оценке
12Метрики фактологичности
15Фреймворк для автоматической оценки RAG
20Методы обнаружения галлюцинаций
30Создание обучающих данных

12. Навигация


Навигация