Генерация тестовых кейсов¶
Eval AI Library включает мощный генератор тестовых кейсов, создающий датасеты для оценки на основе ваших документов. Поддерживаются 15+ форматов: PDF, DOCX, CSV, JSON, HTML, изображения с OCR.
Установка¶
У генератора есть опциональные зависимости (парсеры документов, эмбеддинги). Установите экстра:
Поддерживаемые форматы¶
| Категория | Форматы |
|---|---|
| Текст | .txt, .md, .rtf, .xml, .json, .yaml, .html |
| Офис | .pdf, .docx, .docm, .xlsx, .pptx |
| Данные | .csv, .tsv |
| Изображения | .png, .jpg, .jpeg (через Tesseract OCR) |
Быстрый старт¶
У DatasetGenerator два асинхронных входа: generate_from_documents() и generate_from_scratch(). Оба возвращают list[dict] -- обычные JSON-совместимые строки, которые можно сконвертировать в EvalTestCase по мере необходимости.
import asyncio
from eval_lib import DatasetGenerator, EvalTestCase
generator = DatasetGenerator(
model="gpt-4o",
input_format="вопрос",
expected_output_format="ответ",
agent_description="Ассистент, отвечающий на вопросы по машинному обучению.",
test_types=["factual", "reasoning"],
max_rows=20,
language="ru",
)
rows = asyncio.run(
generator.generate_from_documents(["./knowledge_base.pdf"])
)
for row in rows:
print(f"В: {row['input']}")
print(f"О: {row['expected_output']}")
print("---")
# Когда будете готовы запускать оценку -- конвертируйте:
test_cases = [EvalTestCase(**row) for row in rows]
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model | str | обязательный | LLM для генерации |
input_format | str | обязательный | Формат входа (например, "question") |
expected_output_format | str | обязательный | Формат ожидаемого ответа |
agent_description | str | обязательный | Описание роли/контекста агента |
test_types | list[str] | обязательный | Типы тестовых кейсов |
question_length | str | "mixed" | "short", "medium", "long", "mixed" |
question_openness | str | "mixed" | "open", "closed", "mixed" |
chunk_size | int | 1024 | Размер чанка при разбивке документов |
chunk_overlap | int | 100 | Перекрытие чанков |
temperature | float | 0.3 | Температура генерации |
max_rows | int | 10 | Сколько кейсов сгенерировать |
trap_density | float | 0.1 | Доля trap-вопросов |
language | str | "en" | Язык кейсов |
max_chunks | int | 30 | Макс. чанков, которые скармливаются LLM на документ |
relevance_margin | float | 1.5 | Порог релевантности контекста |
embedding_model | str | "openai:text-embedding-3-small" | Модель для семантики |
verbose | bool | False | Печать лога прогресса |
Генерация без документов¶
Если исходных документов нет, можно сгенерировать синтетический датасет только по описанию агента:
Загрузка документов напрямую¶
Внутри генератора используются две вспомогательные функции из eval_lib.datagenerator.document_loader:
from eval_lib.datagenerator.document_loader import load_documents, chunk_documents
docs = load_documents(["./data/report.pdf", "./data/faq.csv"])
chunks = chunk_documents(docs, chunk_size=1024, chunk_overlap=100)
load_documents(file_paths)принимает список путей и возвращает распарсенный текст каждого файла.chunk_documents(docs, chunk_size=1024, chunk_overlap=100)разбивает документы с перекрытием по символам.
Расширенные примеры¶
Несколько источников сразу¶
rows = asyncio.run(
generator.generate_from_documents([
"./docs/api_reference.pdf",
"./docs/user_guide.md",
"./data/faq.csv",
])
)
Разные типы вопросов¶
# Короткие фактологические
generator = DatasetGenerator(
model="gpt-4o",
input_format="question",
expected_output_format="brief factual answer",
agent_description="FAQ-ассистент",
test_types=["factual"],
question_length="short",
question_openness="closed",
max_rows=30,
)
# Открытые развёрнутые
generator = DatasetGenerator(
model="gpt-4o",
input_format="question",
expected_output_format="comprehensive answer with examples",
agent_description="Технический ментор",
test_types=["reasoning"],
question_length="long",
question_openness="open",
max_rows=15,
)
Trap-вопросы¶
Trap-вопросы проверяют, способен ли ИИ честно сказать "не знаю", когда ответа нет в контексте:
generator = DatasetGenerator(
model="gpt-4o",
input_format="question",
expected_output_format="answer",
agent_description="RAG-ассистент",
test_types=["factual", "trap"],
trap_density=0.2, # 20% trap-вопросов
max_rows=50,
)
Использование сгенерированных кейсов¶
import asyncio
from eval_lib import evaluate, EvalTestCase, AnswerRelevancyMetric, FaithfulnessMetric
rows = asyncio.run(generator.generate_from_documents(["./knowledge_base.pdf"]))
test_cases = [EvalTestCase(**row) for row in rows]
metrics = [
AnswerRelevancyMetric(model="gpt-4o", threshold=0.7),
FaithfulnessMetric(model="gpt-4o", threshold=0.7),
]
results = asyncio.run(evaluate(test_cases, metrics))
OCR для изображений¶
Убедитесь, что установлен Tesseract:
См. Установка для настройки Tesseract.