Модуль 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
MCP-инструменты
create_dataset
Создаёт структуру нового датасета из шаблона.
create_dataset("my_dataset", "chat")
# Создаёт:
# datasets/my_dataset/spec.md ← из шаблона spec_chat.md
# datasets/my_dataset/config.yaml ← из шаблона config_default.yaml
Поддерживаемые типы датасетов:
| Тип | Назначение | Ключевые поля |
|---|---|---|
|
SFT / instruction tuning |
|
|
DPO обучение |
|
|
Reward modeling |
|
|
Классификаторы |
|
|
RAG pipeline |
|
|
Tool-use / агенты |
|
|
Eval benchmarks |
|
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 режим
Режимы генерации:
| Режим | Условие | Описание |
|---|---|---|
|
есть |
LLM реально вызывает инструменты (поиск и др.) |
|
нет |
LLM генерирует из обучающих данных |
|
передан |
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).
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.