Модуль Dataset Builder

Инструмент для генерации LLM-датасетов (SFT, DPO, Reward Modeling, Eval и др.) локально без Tagme API. Управляется через MCP-инструменты в Cursor или Claude Desktop.

Концепция

Просто опиши в чате что нужно — инструмент сам создаст датасет, сгенерирует сэмплы и покажет статистику. Никакого написания скриптов вручную.

"Создай датасет для fact-checking на русском, 500 сэмплов, разные домены"
        ↓
  Cursor Agent / Claude Desktop вызывает MCP-инструменты
        ↓
  datasets/fact_check/output/dataset.jsonl

Ключевые возможности:

  • Мульти-модельная генерация — Anthropic, OpenAI, любой OpenAI-compatible endpoint

  • Agentic режим — LLM может вызывать инструменты (поиск и др.) при генерации

  • Cases — гарантированное разнообразие через предварительно сгенерированный список тем

Подключение

Модуль подключается отдельной субкомандой:

tagme mcp dataset

MCP-конфиг для Claude Desktop / Cursor:

{
  "mcpServers": {
    "crowd-sdk-dataset": {
      "command": "tagme",
      "args": ["mcp", "dataset"]
    }
  }
}

Флоу работы

Стандартный флоу

1. create_dataset
2. preview_dataset_setup → показать spec + config, дождаться OK пользователя
3. Редактирование spec.md / config.yaml (при необходимости)
4. generate_cases(n_cases=50)
5. generate_dataset(dry_run=True) → план, снова дождаться OK
6. generate_dataset(n_samples=...)
7. inspect_dataset

Completion флоу

Если есть частичные данные (например, вопросы без ответов):

# partial.jsonl:
# {"question": "Что такое фотосинтез?"}
# {"question": "Столица Австралии?"}

generate_dataset(name="my_dataset", inputs_file="partial.jsonl")
# LLM заполнит поля answer, options и др. по Output Schema

MCP-инструменты

create_dataset

Создаёт структуру нового датасета из шаблона.

create_dataset("my_dataset", "chat")
# Создаёт:
# datasets/my_dataset/spec.md     ← из шаблона spec_chat.md
# datasets/my_dataset/config.yaml ← из шаблона config_default.yaml

Поддерживаемые типы датасетов:

Тип Назначение Ключевые поля

chat

SFT / instruction tuning

messages: [{role, content}]

preference

DPO обучение

prompt, chosen, rejected

scored

Reward modeling

prompt, response, score

classification

Классификаторы

text, label

rag

RAG pipeline

context[], question, answer

trajectory

Tool-use / агенты

task, trajectory[]

eval

Eval benchmarks

question, answer, options[]

preview_dataset_setup

Возвращает полный текст spec.md, config.yaml и tools.yaml для показа пользователю до генерации. Ответ включает confirmation_prompt и await_user_confirmation: true.

preview_dataset_setup("my_dataset")

generate_cases

Генерирует cases для разнообразия сэмплов. Читает Case Dimensions и Case Schema из spec.md.

generate_cases("my_dataset", n_cases=50)
generate_cases("my_dataset", overwrite=True)  # перегенерировать

Генерирует батчами. Каждый батч знает о предыдущих topic_area — не повторяет темы. Возвращает: количество cases, покрытие по осям, первые 3 case.

generate_dataset

Генерирует сэмплы и записывает в output/dataset.jsonl.

generate_dataset("my_dataset", n_samples=200)
generate_dataset("my_dataset", dry_run=True)                    # план без генерации
generate_dataset("my_dataset", inputs_file="partial.jsonl")     # completion режим

Режимы генерации:

Режим Условие Описание

real

есть tools.yaml

LLM реально вызывает инструменты (поиск и др.)

simulated

нет tools.yaml

LLM генерирует из обучающих данных

completion

передан inputs_file

LLM дополняет частичные сэмплы

Кастомные модели:

generate_dataset(
    name="my_dataset",
    models=[
        {"provider": "anthropic", "model": "claude-haiku-3.5", "weight": 1},
        {"provider": "openai", "model": "gpt-4o-mini", "weight": 1},
    ],
)

Cases используются циклически: при 200 cases и n_samples=2000 каждый case используется 10 раз (с разными аспектами темы через sample_index_in_group).

inspect_dataset

Возвращает статистику и примеры.

inspect_dataset("my_dataset", n_examples=5)

Возвращает: общее кол-во сэмплов, статистику токенов, распределение по полям, режимы генерации, generation_tokens (prompt/completion из generation_stats.json) и N случайных примеров.

LLM-бэкенды генерации

tagme (по умолчанию)

Внутренний LLM-прокси SberDevices. Авторизация из текущей MCP-сессии — отдельный API-ключ не нужен.

generation:
  backend: tagme
  temperature: 0.8
  max_tokens: 1024

models:
  - provider: openai      # для tagme не уходит в API, только model
    model: z-ai/glm-5.1
    weight: 1.0

litellm

Мультипровайдерный роутинг через litellm. Поддерживает OpenAI, Anthropic, Azure, локальные модели.

# Установка с litellm
pip install crowd-sdk[mcp] litellm
generation:
  backend: litellm
  temperature: 0.8
  max_tokens: 1024

models:
  - provider: openai
    model: gpt-4o-mini
    weight: 1.0
  - provider: anthropic
    model: claude-3-5-haiku-20241022
    weight: 0.5

http

Прямые HTTP-запросы к OpenAI-compatible API через aiohttp.

generation:
  backend: http
  http:
    base_url: https://api.example.com/v1   # обязательно
    api_key: sk-...                        # опционально
  temperature: 0.8
  max_tokens: 1024
При Tool calling через API с бэкенда без поддержки инструментов можно включить fallback: generation.tools_fallback: true.

spec.md — описание датасета

Главный файл датасета. Задаёт схему вывода, оси разнообразия и инструкции для LLM.

# Dataset Name

## Use Case
Для чего датасет и какой capability он развивает.

## Output Schema
JSON-схема одного сэмпла — LLM генерирует точно по ней.

## Case Dimensions
Оси разнообразия. Используются при generate_cases.

### Domains
- science/biology
- geography/europe

### Difficulty
- easy
- medium
- hard

## Case Schema
Описание полей case.

| Поле | Тип | Описание | Влияние на генерацию |
|------|-----|----------|----------------------|
| domain | str | Домен | Факты только из этого домена |
| difficulty | str | Сложность | Влияет на выбор формулировки |
| need_internet | bool | Нужен поиск | true → вызови search tool |

## Generation Instructions
Инструкции для LLM.

Поля case полностью определяются в spec.md — для chat-датасета можно добавить persona, для code-датасета — language. Код ничего про них не знает.

Cases — гарантированное разнообразие

topic_area Плохо / Хорошо

«масса Юпитера» ❌ / «планеты Солнечной системы» ✓

«длина реки Нил» ❌ / «реки и озёра Африки» ✓

«дата рождения Пушкина» ❌ / «русские поэты XIX века» ✓

Хорошая topic_area даёт 20–50 разных конкретных сэмплов.

Формат выходного JSONL

Каждая строка — валидный JSON. Каждый сэмпл содержит служебное поле _generation:

{
  "text": "Несмотря на то что...",
  "claims": [],
  "_generation": {
    "model": "gpt-4o-mini",
    "provider": "openai",
    "index": 42,
    "mode": "real",
    "case_id": 7,
    "tool_calls": [{"tool": "search_client", "query": "..."}]
  }
}

После каждого прогона сохраняется output/generation_stats.json с токенами, временем и ошибками.

Правило для Cursor

Для проектов с датасетами создайте .cursor/rules/dataset-builder.mdc:

---
description: LLM-датасеты только через crowd-sdk MCP dataset builder
globs: datasets/**/*
alwaysApply: true
---

# Dataset Builder

Генерацию jsonl выполняй только MCP: create_dataset → preview_dataset_setup →
generate_cases → generate_dataset(dry_run=True) → после «запускай» generate_dataset → inspect_dataset.

Запрещено: Python/shell-скрипты для генерации сэмплов, прямые вызовы LLM API из кода.

После create_dataset или preview_dataset_setup покажи spec.md и config.yaml и жди «ок»
пользователя. generate_dataset без dry_run — только после явного «запускай».

Demo

Полный пример работы с кодом и детальным разбором инструментов представлен в интерактивной странице документации Dataset Builder Demo.