Наборы данных
Обновлено: 2025-09-07
Набор данных — это совокупность упорядоченных данных. Наборы данных могут быть представлены в различных форматах, таких как таблицы (например, CSV-файлы), базы данных или специализированные форматы данных.
Текущая база знаний в исходном виде является набором данных в формате markdown.
Формат данных
Распространенные форматы для хранения наборов данных: обычный текст, Markdown, JSONL и Parquet.
- JSONL — это текстовой файл, где каждая строка содержит самодостаточный JSON. Это самый простой текстовой форма для больших наборов данных.
- Parquet — это бинарное хранилище данных (СУБД).
Если судить по количеству наборов текстовых данных, Parquet является наиболее популярным.
На сегодняшний нет четких стандартов по структуре данных. С одной стороны, это проблема, потому что непонятно, в каком виде делать наборы данных, с другой — это свобода выбора. Проще говоря, набор данных можно сделать в абсолютно любом удобном виде.
Тем не менее, есть типы туры наборов данных, которые пользуются популярностью и вполне возможно, что когда-нибудь они станут стандартом.
Ниже представлена пара примеров наборов данных в формате JSONL с разной структурой:
{"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": "..."}]}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
Большие языковые модели работают с неструктурированным текстом.
Поскольку разные модели имеют свои особенности, набор данных удобно хранить в формате JSON или в базе данных, а потом трансформировать в текстовой формат адаптированный для конкретных моделей.
Специальные маркеры (tokens)
Маркер (токен) | Описание | GPT | Llama | Gemini | BERT |
---|---|---|---|---|---|
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] |
<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>
<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
), то результат работы может быть непредсказуемым.
{
"messages": [
{
"role": "system",
"content": "Ты умный помощник ."
},
{
"role": "user",
"content": "Какая погода в Санкт-Петербурге сегодня?"
},
{
"role": "assistant",
"content": "Чтобы узнать, какая погода в Санкт-Петербурге сегодня сначала я должен понять какая сегодня дата, для этого я могу использовать внешнюю функцию `today`, затем я могу вызвать функцию `weather` и получить прогноз погоды."
}
]
}
<s>System: Ты — высшее существо, тебе нет равных во Вселенной, ты обладаешь невероятной силой.
User: Привет! Кто ты?
Assistant: Я — высшее существо, мне нет равных.
User: Ух, ты!
Assistant: Я сам в шоке.</s>
<|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
- это закон. Не нужно злоупотреблять этой ролью. - Данные должны быть разнообразными. Повторение — это плохо, т.к. при поиске может быть много одинаковой информации, которая будет занимать контекст и это может путать модель (модель может начать воспринимать как истину, то что не является истиной для текущего запроса).
- Отдельный блок (запись) данных должен быть максимально небольшого размера, чтобы избежать его разделения на части.