尽管微调大型语言模型是一个涉及训练基础设施和成本管理的复杂过程,但成功的决定性因素是训练数据的质量。一个准备充分的数据集能让模型学习特定任务,采用特定风格,或获得新知识。此工具集提供了一系列实用工具来构建、清理和格式化您的数据,这是任何微调项目中的基本第一步。构建微调数据在模型能从您的数据中学习之前,数据需要被组织成一致的格式。大多数微调任务使用两种主要结构之一:完成格式: 这是一种简单的提示与响应对。模型在看到相似的 prompt 时,会学习生成 completion 文本。这种格式适用于分类、简单问答或从起点生成文本等任务。聊天格式: 这种格式包含一系列消息,通常来自 system、user 和 assistant。它用于训练对话任务模型,其中来自先前轮次的上下文信息很关键。此工具集使用 TrainingExample 和 TrainingDataset 类来表示这些。TrainingExample 是一个单一数据点,而 TrainingDataset 是这些示例的集合,以及关于数据集格式的元数据。以下是如何为每种格式创建 TrainingExample:from kerb.fine_tuning import TrainingExample # 完成格式示例 completion_example = TrainingExample( prompt="Translate to French: Hello", completion="Bonjour" ) # 聊天格式示例 chat_example = TrainingExample( messages=[ {"role": "system", "content": "你是一个乐于助人的编程助手。"}, {"role": "user", "content": "如何在 Python 中创建一个列表?"}, {"role": "assistant", "content": "你可以使用方括号来创建一个列表:my_list = [1, 2, 3]"} ] )从原始数据准备数据集手动创建 TrainingExample 对象很有用,但您通常会从大量原始数据开始,比如一个字典列表。prepare_dataset 函数旨在简化将这些原始数据转换为结构化 TrainingDataset 的过程,同时进行检查和清理。此函数可以自动处理几项必要步骤:检查: 它检查每个示例是否符合预期的结构(例如,聊天消息具有 role 和 content 键)。去重: 它移除完全重复的示例,这可能对训练产生负面影响。洗牌: 它随机化示例的顺序,以防止模型从数据中学习到任何非故意的序列。假设您有原始对话数据。您可以通过一次函数调用将其处理成干净、可用的数据集。from kerb.fine_tuning import prepare_dataset, DatasetFormat, FineTuningProvider raw_data = [ { "messages": [ {"role": "user", "content": "什么是字典?"}, {"role": "assistant", "content": "字典是 Python 中的一种键值数据结构。"} ] }, # 与第一个条目相同,以显示去重功能 { "messages": [ {"role": "user", "content": "什么是字典?"}, {"role": "assistant", "content": "字典是 Python 中的一种键值数据结构。"} ] }, { "messages": [ {"role": "user", "content": "如何遍历列表?"}, {"role": "assistant", "content": "使用 for 循环:for item in my_list: print(item)"} ] } ] # 准备数据集,启用所有清理选项 dataset = prepare_dataset( data=raw_data, format=DatasetFormat.CHAT, provider=FineTuningProvider.OPENAI, validate=True, deduplicate=True, shuffle=True ) print(f"原始示例数: {len(raw_data)}") print(f"准备好的示例数: {len(dataset)}")请注意,最终数据集的示例数少于原始数据,因为重复条目已自动移除。provider 参数有助于为像 OpenAI 这样的特定服务定制检查规则。分析数据集质量在投入时间和金钱进行微调工作之前,检查数据集的质量是一个好习惯。具有空条目、长度差异过大或个人身份信息 (PII) 等问题的数据集可能导致模型表现不佳或隐私风险。函数 analyze_dataset 提供了一个高层次的统计概览,包括 token 计数、重复计数和标签分布。from kerb.fine_tuning import analyze_dataset # 假设 'dataset' 是上一步中的 TrainingDataset stats = analyze_dataset(dataset) print(f"总示例数: {stats.total_examples}") print(f"总 token 数: {stats.total_tokens}") print(f"每个示例平均 token 数: {stats.avg_tokens_per_example:.2f}") print(f"重复计数: {stats.duplicate_count}")如需更细致的检查,您可以使用专用函数。例如,detect_pii 帮助您查找并移除敏感信息,这是确保隐私和安全的一个必要步骤。from kerb.fine_tuning.quality import detect_pii text_with_pii = "请通过 john.doe@example.com 或 555-123-4567 联系我" pii_found = detect_pii(text_with_pii) if pii_found: print("检测到 PII:") for pii_type, values in pii_found.items(): print(f" {pii_type}: {values}")进行这些质量检查有助于您及早发现并解决问题,从而避免训练失败,并获得更有效的微调模型。制作遵循指令的数据集许多微调项目旨在创建擅长特定任务的“指令调优”模型。system 提示是实现这一目标的一个有效方法,因为它为模型设定了上下文和角色。为保持一致性,最好在数据集中的所有示例中使用标准化的系统提示。standardize_system_prompts 函数允许您将单个系统消息应用于整个数据集,替换任何现有的消息。这确保了模型在训练期间接收到一致的指令集。from kerb.fine_tuning.prompts import standardize_system_prompts # 假设 'dataset' 是我们准备好的数据集 standard_prompt = "你是一名资深的 Python 程序员。请提供清晰准确的代码示例。" standardized_dataset = standardize_system_prompts(dataset, standard_prompt) # 'standardized_dataset' 中的所有示例现在都具有相同的系统提示 print("系统提示已在整个数据集中标准化。")为微调服务格式化不同的模型提供商要求微调数据以特定方式格式化,通常是 JSONL(JSON Lines)文件。此工具集通过提供函数将您的 TrainingDataset 转换为主要提供商所需的结构,从而简化了这一过程。一旦您的数据集准备好,您可以将其格式化为 OpenAI 适用并写入文件。import tempfile import os from kerb.fine_tuning import to_openai_format, write_jsonl # 将数据集转换为 OpenAI API 预期的格式 openai_formatted_data = to_openai_format(dataset) # 将数据写入 JSONL 文件 with tempfile.TemporaryDirectory() as temp_dir: file_path = os.path.join(temp_dir, "training_data.jsonl") write_jsonl(openai_formatted_data, file_path) print(f"数据集已写入 {file_path}") # 您可以检查文件的第一行以查看格式 with open(file_path, 'r') as f: print("\nJSONL 文件的第一行:") print(f.readline().strip())这个最终的 JSONL 文件就是您需要上传到提供商服务以开始微调工作的。通过遵循这个结构化的准备过程,从原始数据到经过检查且特定于提供商的文件,您为创建高性能的自定义模型打下了坚实根基。