Как вы делаете 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 генерирует вопросы по документу
Процесс состоит из трёх шагов:
- Подача документа (или чанка) в LLM с промптом: «Прочитай текст и сформулируй вопросы, на которые можно ответить, используя только этот текст. Для каждого вопроса дай ответ цитатой из текста».
- Генерация вопросов — LLM выдает пары (вопрос, ответ). Обычно запрашивают 3–5 вопросов на один чанк.
- Сбор датасета — все пары объединяются, при необходимости дедуплицируются.
Пример промпта (упрощённый):
Ты — ассистент для создания тестовых данных. Прочитай следующий документ.
Сгенерируй 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 может систематически пропускать определённый тип вопросов.
Процесс
- Случайная выборка 10% пар.
- Аннотатор читает документ и оценивает: вопрос корректен? ответ точен? ответ полон?
- Метрика: 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. Проблемы и ограничения
- Галлюцинации LLM — генератор может придумать вопрос, на который нет ответа в документе, или дать неверный ответ.
- Bias (смещение) — LLM склонна задавать простые фактические вопросы, избегая сложных рассуждений.
- Перекос в сторону популярных тем — если документ содержит много повторяющейся информации, вопросы будут однотипными.
- Затраты на LLM — генерация тысяч вопросов может быть дорогой (токены).
- Отсутствие негативных примеров — 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.
Инструменты
- Python, LangChain или OpenAI API
- Библиотека RAGAS
- Векторная БД (Chroma или FAISS)
- LLM: GPT-4 или локальная модель (Mistral, Llama)
Шаги:
- Загрузите 10 документов (текст или PDF).
- Разбейте на чанки (например, по 500 токенов).
- Для каждого чанка сгенерируйте 3 вопроса с помощью LLM (промпт с типами).
- Проверьте self-consistency: второй LLM отвечает на вопросы без подсказки; отбросьте пары с низким сходством.
- Случайно выберите 10 пар для ручной проверки (золотой набор).
- Постройте RAG-систему: эмбеддинги (text-embedding-3-small), retrieval top-3.
- Запустите RAGAS на синтетическом датасете: получите faithfulness, answer_relevancy, context_relevancy.
- Проанализируйте: какие вопросы провалились? Почему?
Ожидаемый результат
- Рабочий пайплайн генерации датасета.
- Численные метрики RAG (например, faithfulness 0.85).
- Понимание, какие типы вопросов сложнее для вашей RAG-системы.
11. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 5 | Оффлайн- и онлайн-метрики retrieval |
| 10 | Self-RAG как альтернатива внешней оценке |
| 12 | Метрики фактологичности |
| 15 | Фреймворк для автоматической оценки RAG |
| 20 | Методы обнаружения галлюцинаций |
| 30 | Создание обучающих данных |
12. Навигация
- Предыдущий: 686
- Следующий: 688
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 686
- Следующий: 688
- Индекс: 00. Индекс разборов