Перейти к содержанию

Генерация тестовых кейсов

Eval AI Library включает мощный генератор тестовых кейсов, создающий датасеты для оценки на основе ваших документов. Поддерживаются 15+ форматов: PDF, DOCX, CSV, JSON, HTML, изображения с OCR.

Установка

У генератора есть опциональные зависимости (парсеры документов, эмбеддинги). Установите экстра:

pip install 'eval-ai-library[datagen]'

Поддерживаемые форматы

Категория Форматы
Текст .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 Печать лога прогресса

Генерация без документов

Если исходных документов нет, можно сгенерировать синтетический датасет только по описанию агента:

rows = asyncio.run(generator.generate_from_scratch())

Загрузка документов напрямую

Внутри генератора используются две вспомогательные функции из 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:

rows = asyncio.run(generator.generate_from_documents(["./scanned_document.png"]))

См. Установка для настройки Tesseract.