Перейти к основному содержимому

Наборы данных

Обновлено: 2025-09-07

Набор данных — это совокупность упорядоченных данных. Наборы данных могут быть представлены в различных форматах, таких как таблицы (например, CSV-файлы), базы данных или специализированные форматы данных.

Текущая база знаний в исходном виде является набором данных в формате markdown.

Формат данных

Распространенные форматы для хранения наборов данных: обычный текст, Markdown, JSONL и Parquet.

  • JSONL — это текстовой файл, где каждая строка содержит самодостаточный JSON. Это самый простой текстовой форма для больших наборов данных.
  • Parquet — это бинарное хранилище данных (СУБД).

Если судить по количеству наборов текстовых данных, Parquet является наиболее популярным.

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

Тем не менее, есть типы туры наборов данных, которые пользуются популярностью и вполне возможно, что когда-нибудь они станут стандартом.

Ниже представлена пара примеров наборов данных в формате JSONL с разной структурой:

Диалоги (conversational format)
{"messages":[{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages":[{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages":[{"role": "system", "content": "You are..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
Инструкции (instruction format)
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

Большие языковые модели работают с неструктурированным текстом.

Поскольку разные модели имеют свои особенности, набор данных удобно хранить в формате JSON или в базе данных, а потом трансформировать в текстовой формат адаптированный для конкретных моделей.

Специальные маркеры (tokens)

Маркер (токен)ОписаниеGPTLlamaGeminiBERT
Beginning Of Sentence (BOS)Указывает на начало предложения.<|im_start|><s><bos>[CLS]
End Of Sentence (EOS)Указывает на конец предложения.<|im_end|></s><eos>[SEP]
Padding (PAD)Токен для унификации длины последовательности в пакете.отсутствует<pad><pad>[PAD]
Unknown (UNK)Токен для обозначения неизвестного слова.отсутствует<unk><unk>[UNK]
Пример для моделей семейства Llama
<s>Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</s>
<s>Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat.</s>
<s>Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur.</s>
<s>Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est laborum.</s>
Пример для моделей семейства Gemini/Gemma
<bos>User: Привет!
Assistant: Здравствуйте! Чем я могу помочь?<eos>

Типы наборов данных

Инструкции (instruct)

Набор инструкций — является парой значений вопрос-ответ.

Границы начала и конца вопроса-ответа отмечаются токенами BOS и EOS.

Для моделей семейства Llama вопрос обрамляется специальными токенами [INST][/INST].

<s>[INST]
Кто такой Алексей Немиро?
[/INST]

Российский разработчик, автор статей и проектов в области информационных технологий.
</s>
<s>[INST]
Покажи пример программы "Hello, world!" на Python
[/INST]

Конечно! Вот пример реализации программы "Hello, world!" на Python:

'''python
print('Hello, world!')
'''

Вы можете сохранить этот код в файл и выполнить с помощью команды 'python helloworld.py'.
</s>

Диалоги

Диалоговый тип набора данных представляет собой фрагменты диалогов, которые модели могут использовать в качестве примера.

Каждый диалог должен быть самодостаточным и ограничиваться одним вопросом или темой. Чем меньше размер диалога, тем лучше.

При построении диалогового набора данных важно соблюдать порядок ролей. Существую три основные роли: system, user, assistant. Некоторые модели содержат дополнительны роли для работы с инструментами (внешними функциями): tool и function.

Большинство моделей ожидают диалог по одной из следующих схем:

  • system, user, assistant
  • system, assistant, user, assistant
  • user, assistant

У разных моделей разные требования и возможности. Общий порядок для всех: user, assistant — это будет работать корректно во всех случаях. Если нарушать последовательность (например: user, assistant, assistant, user) или использовать неподдерживаемые роли (такие как tool и function), то результат работы может быть непредсказуемым.

Пример диалога в формате JSON
{
"messages": [
{
"role": "system",
"content": "Ты умный помощник ."
},
{
"role": "user",
"content": "Какая погода в Санкт-Петербурге сегодня?"
},
{
"role": "assistant",
"content": "Чтобы узнать, какая погода в Санкт-Петербурге сегодня сначала я должен понять какая сегодня дата, для этого я могу использовать внешнюю функцию `today`, затем я могу вызвать функцию `weather` и получить прогноз погоды."
}
]
}
Пример диалога в текстовом формате для моделей семейства Llama
<s>System: Ты — высшее существо, тебе нет равных во Вселенной, ты обладаешь невероятной силой.
User: Привет! Кто ты?
Assistant: Я — высшее существо, мне нет равных.
User: Ух, ты!
Assistant: Я сам в шоке.</s>
Пример диалога в текстовом формате для моделей семейства GPT
<|im_start|>system
Ты глупый помощник. Ты грубиян. Ты ковыряешься в носу, ничего не знаешь и ничего не делаешь.<|im_end|>
<|im_start|>user
Привет! Подскажи, какой сегодня день?<|im_end|>
<|im_start|>assistant
В календарь посмотри, я тебе не справочная!<|im_end|>

Параллельные корпуса (Parallel Corpora)

Параллельные корпуса представляют собой наборы текстов, где одно и то же содержание представлено на двух или более языках.

Этот тип набора данных часто используется для обучения моделей машинного перевода.

Source: Привет, мир!
Target: Hello, world!
{
"source": "Привет, мир!",
"target": "Hello, world!"
}

Кодовые наборы данных (Code Dataset)

Для примеров кода можно использовать кодовый набор данных, который похож на набор инструкций, но дополнительно содержит информацию о языке программирования.

<s>Language: Python
User: Покажи пример поиска строки в массиве
Assistant: a = ["C#", "TypeScript", "Python"]

if 'Python' in a:
print("Строка найдена!")
else:
print("Строка не найдена!")</s>

Список проверки для наборов данных

  • Использовать структурированный формат данных, чтобы было проще его трансформировать в любой формат.
  • В наборе данных не должно быть специальных токенов, т.к. у разных моделей могут быть разные токены. Это должно решаться трансформацией структурированного набора данных.
  • Необходимо соблюдать порядок ролей (user, assistant).
  • Роль system - это закон. Не нужно злоупотреблять этой ролью.
  • Данные должны быть разнообразными. Повторение — это плохо, т.к. при поиске может быть много одинаковой информации, которая будет занимать контекст и это может путать модель (модель может начать воспринимать как истину, то что не является истиной для текущего запроса).
  • Отдельный блок (запись) данных должен быть максимально небольшого размера, чтобы избежать его разделения на части.

Ссылки