Создание датасета для тонкой настройки из веба: от URL до JSONL
Хорошая тонкая настройка на 90% зависит от датасета. Это конвейер от сырых URL до чистого JSONL — масштабный сбор, удаление дубликатов, фильтрация лицензий и формат чата, который ожидают тренеры.
Тонкая настройка хороша ровно настолько, насколько хороши данные, которые вы ей предоставляете, и самая сложная часть тонкой настройки почти никогда не связана с самим обучением — это создание чистого датасета. Веб — это самый богатый источник таких данных, но сырые страницы грязные, дублированные, не маркированные и юридически неоднородные. Это руководство — конвейер от URL до готового к обучению JSONL: сколько данных вам действительно нужно, как их масштабно собирать, как очищать и удалять дубликаты, как обрабатывать лицензии и как форматировать их в структуре чата, которую ожидают тренеры. Предполагается, что вы создаете инструкцию или чат для тонкой настройки из общедоступного веб-контента.
Сколько данных вам действительно нужно?
Начните с реалистичных целей, чтобы не переоценить или недооценить объем работы. Практический минимум для тонкой настройки, которая дает разумные результаты, составляет около 100 строк; для уверенной работы вам обычно нужно более 1,000. Больше обычно помогает, но только если данные чистые — тысяча хорошо маркированных примеров лучше, чем десять тысяч шумных. Для справки по масштабу, классический датасет Alpaca содержал 52,000 пар инструкция/ответ, сгенерированных с помощью более сильной модели. И если вы используете большую модель для генерации синтетических примеров, начните с как минимум десяти написанных вручную примеров, чтобы она усвоила точную структуру и тон, который вы хотите, прежде чем она создаст больше.
Сбор: от сканирования до чистого markdown
Цель на этапе сбора — чистый текст, а не сырой HTML. Строка для тонкой настройки требует сути страницы — статьи, документации, вопросов и ответов — без панелей навигации, баннеров с куки и рекламной разметки, которые загрязняют наивный скрейпинг. Поэтому сканируйте целевые страницы и конвертируйте их в markdown при загрузке, что удаляет шаблонный текст, сохраняя структуру, такую как заголовки и списки. При любом реальном объеме вы столкнетесь с ограничениями скорости и блокировками IP, поэтому направляйте сканирование через вращающийся пул. Scraper API, который возвращает markdown напрямую, выполняет обе задачи — чистый вывод и устойчивость к блокировкам — за один вызов, поэтому мы рассматриваем его в нашем руководстве по обеспечению LLM свежими веб-данными.
# Sketch: crawl target URLs to clean markdown, ready for shaping into rows.
import requests
API = "https://api.quantumproxies.io/scrape" # returns markdown, handles rotation
def fetch_markdown(url):
r = requests.get(API, params={"url": url, "format": "markdown"},
headers={"Authorization": "Bearer YOUR_KEY"}, timeout=60)
return r.json()["markdown"]
docs = [fetch_markdown(u) for u in seed_urls] # clean text, no boilerplate

Формат JSONL, который ожидают тренеры
Большинство современных инструментов для тонкой настройки по умолчанию используют разговорный формат JSONL: один JSON объект на строку, каждый с массивом messages пар роль/содержание, где роли — это system, user и assistant, и ходы пользователя/ассистента чередуются. Это формат чата, который используют тренеры Hugging Face и OpenAI. Более старые наборы данных инструкций используют форму с тремя полями (instruction, input, output) — подходит для одноходовой супервизируемой настройки — и существуют форматы многократных разговоров, но они легко преобразуются в форму сообщений. Выберите один целевой формат и стандартизируйте все под него.
// One training example per line (.jsonl). Chat / messages format:
{"messages":[
{"role":"system","content":"You classify support tickets by urgency."},
{"role":"user","content":"My payment failed three times and the event is tomorrow."},
{"role":"assistant","content":"high"}
]}
{"messages":[
{"role":"system","content":"You classify support tickets by urgency."},
{"role":"user","content":"How do I change my avatar?"},
{"role":"assistant","content":"low"}
]}
Соответствуйте формат цели обучения: сырой текст для продолженного предобучения, инструкция плюс вывод или многократный чат для супервизируемой тонкой настройки, ранжированные ответы для методов на основе предпочтений. Если вы создаете тонкую настройку для рассуждений, сохраните вопрос и ответ, но перепишите ответ, чтобы включить шаги цепочки рассуждений, которые вы хотите, чтобы модель усвоила.
Очистка: где выигрывается качество
Это этап, который определяет ваш результат, и это в основном непривлекательная фильтрация. Никогда не предполагайте, что строки, полученные из веба или сгенерированные моделью, верны — проверяйте их. Повторяющиеся режимы отказов специфичны и стоит проверять их по имени:
- Несоответствие меток: та же категория написана как "Positive" в одной строке и "positive" в другой — нормализуйте регистр и орфографию.
- Ответы не по теме: ассистент возвращает предложение или последующий вопрос вместо точной метки или формата, который вы обучаете.
- Неправильно маркированные строки: неоднозначный ввод назначен неверному выводу — самый вредный вид шума.
- Остатки шаблонного текста: текст навигации, уведомления о куки или фрагменты "читать далее", которые пережили преобразование в markdown.
- Дубликаты: идентичные или почти идентичные примеры, которые увеличивают количество строк и склоняют модель к повторяющемуся контенту.
Хорошая привычка — сохранять как исходный, так и очищенный JSONL, чтобы вы могли измерить, что вы удалили. И сбалансируйте набор по категориям — чрезмерно представленный класс учит модель переоценивать его.
Удаление дубликатов и лицензирование
Веб-данные полны повторов — синдицированные статьи, зеркальные документы, шаблонные абзацы — и дубликаты тихо вредят тонкой настройке, придавая чрезмерный вес тому, что повторяется. Сделайте два прохода: удаление точных совпадений с помощью хеширования нормализованного текста для обнаружения идентичных строк, затем обнаружение почти дубликатов (техника подобия или шингов, такая как MinHash) для обнаружения перефразированных копий, которые точный хеш пропускает. По лицензированию будьте осмотрительны: не все, что доступно в публичном доступе, можно свободно использовать. Отслеживайте источник и лицензию каждого документа, фильтруйте контент, условия которого запрещают использование для обучения, и предпочитайте источники с четкими разрешениями на повторное использование. Гораздо дешевле записывать происхождение во время сканирования, чем восстанавливать его после того, как вы все смешали.
Соберите чистые веб-данные для LLM
Объединение, карточка и разделение
Когда вы собираете данные из нескольких источников, стандартизируйте их все в один формат и объедините в единый унифицированный датасет перед обучением — одна чистая тонкая настройка на объединенном наборе лучше, чем последовательная тонкая настройка на каждом источнике, что обычно разрушает то, что модель усвоила ранее. Затем напишите карточку датасета: краткую запись о том, откуда взяты данные, как они были очищены, их размер и распределение меток, лицензирование и любые известные ограничения. Это делает датасет воспроизводимым и поддающимся аудиту через месяцы. Наконец, оставьте часть для оценки, на которой вы никогда не обучаетесь, чтобы вы могли честно измерить тонкую настройку, а не оценивать ее на данных, которые она запомнила. Если вы кормите систему поиска, а не тонкую настройку, наше руководство по конвейерам RAG охватывает обновление той же проблемы.

Часто задаваемые вопросы
Сколько строк мне нужно для тонкой настройки LLM?
Около 100 строк — это практический минимум для разумных результатов, и более 1,000 — хорошая цель для уверенной работы. Больше обычно помогает, но только если данные остаются чистыми — меньший, хорошо маркированный набор лучше большого шумного. Для синтетической генерации начните с как минимум десяти написанных вручную примеров, чтобы генератор сначала усвоил ваш точный формат.
В каком формате должны быть данные для тонкой настройки?
JSONL — один JSON объект на строку. Большинство современных тренеров по умолчанию используют разговорный формат с массивом messages пар роль-контент для system/user/assistant. Более старые наборы данных инструкций используют поля instruction/input/output. Выберите один целевой формат в зависимости от вашей цели обучения и стандартизируйте каждый источник под него перед обучением.
Как очистить скрейпинг-датасет для тонкой настройки?
Преобразуйте страницы в markdown, чтобы удалить шаблонный текст, затем вручную отфильтруйте общие ошибки: несоответствие меток, ответы не по теме, неправильно маркированные строки и оставшийся текст навигации или куки. Удалите дубликаты с помощью точного хеша и прохода по почти дубликатам, сбалансируйте категории и сохраните как сырые, так и очищенные версии, чтобы вы могли измерить, что вы удалили.
Могу ли я использовать любой веб-контент для обучения модели?
Не автоматически — публичный доступ не означает свободное использование. Некоторые материалы содержат условия, которые запрещают использование для обучения, и личные данные имеют свои собственные правила. Отслеживайте источник и лицензию каждого документа по мере их сбора, фильтруйте все, условия которого запрещают обучение, и предпочитайте источники с четкими разрешениями. Это общая информация, а не юридическая консультация; получите консультацию для коммерческих датасетов.
Создание датасета для тонкой настройки из веба — это фильтрационный конвейер: источник чистого markdown, формирование его в формат сообщений, который ожидает ваш тренер, беспощадное удаление дубликатов и проверка меток, фильтрация по лицензии и создание карточки результата. Получите примерно тысячу чистых строк и оставьте честную часть для оценки, и вы потратите свой бюджет на обучение на сигнал, а не на шум.