亚马逊AWS官方博客

炼石成丹:大语言模型微调实战系列(一)数据准备篇

背景

随着大型语言模型(LLM)的迅猛发展,如何有效利用这些强大的预训练模型解决特定领域问题已成为生成式 AI 领域的热门话题。微调(Fine-tuning)作为一种关键技术,使我们能够在保留模型通用能力的同时,针对性地提升其在特定任务上的表现。本文将深入探讨大模型微调的常见场景,并详细阐述从数据准备到模型微调的流程。

微调适合的场景

微调常常被应用于增强模型在以下方向的能力:

  • 垂直增强:将增强通用大模型专业知识,如医疗、法律、金融等。
  • 任务特化:针对场景任务进行优化,如问答系统、文本分类、命名实体识别等。
  • 语言本地化:将主要以英语或者汉语为训练语料的模型适应到其他语言。
  • 语气风格 :调整模型的输出风格,使其更符合特定的表达方式或语气。
  • 安全性增强:通过微调来减少模型产生有害或不当内容的可能性。

随着这些能力的增强, 我们可以看到模型微调被应用在情感陪伴、心理咨询、虚拟教师、心理占卜和游戏 NPC 这些场景下。

微调数据准备

高质量的数据集是微调成功的基础,如何取得高质量数据?

通过数据获取、数据扩增、数据清洗、质量评估以及标准化和格式化,这些步骤将有助于我们获得高质量数据。下面我们将逐一介绍关键的流程:

1. 数据的获取

在数据获取的过程中,我们有以下主要的方案:

(1)互联网抓+人工改写

这种方法可以快速获取大量数据,但需要注意以下几点:从社交网站抓取数据时,虽然可能遇到反抓取机制,但数据通常较为标准化,清洗工作相对简单。而从小说网站抓取数据时,需要进行更复杂的处理,如段落分割、对话提取等。这种方式获取数据较容易,但后续清洗工作较为繁琐。在实际操作中,我们可以使用各种编程语言和库来实现数据抓取,如 Python 的 requests 和 BeautifulSoup 库。抓取完成后,通常需要进行人工审核和改写,以确保数据质量和适用性。

(2)生产数据+人工改写

使用现有的线上数据可以快速构建数据集,但往往需要进行人工改写:

  • 线上数据可能来自闭源 LLM 的回答,可能缺乏真实人类对话的特征。
  • 人工改写时,需要注意:
    • 重写过长或过短的内容,使其更接近自然对话。
    • 重写模型拒绝回答的内容(约占 30%)。
    • 增加情感表达,避免官腔,使语气更贴近真人。
    • 确保内容符合预定的角色背景和定位。

样例:人工改写过程

原始AI回答:我无法回答这个问题,因为它涉及到个人隐私。

人工改写:我理解你的好奇心,但这个问题涉及到个人隐私。也许我们可以聊聊别的有趣话题?比如你最近看过什么好电影吗?

(3)现有社交平台数据迁移

利用社交平台的真实对话数据可以大大提高微调效果, 我们可以从常见的聊天工具或者社交平台上导出数据,作为训练数据,比如使用开源工具(如 WeChatMsg)将聊天记录导出。不过导出社交平台要注意处理涉及隐私信息(PII)的问题,如姓名、身份证号、电话号码等。

(4)公开数据集

公开数据集也是我们找到数据的重要来源,目前已有多个权威的数据集平台可供使用:

  • Kaggle(https://www.kaggle.com/datasets)是最受欢迎的数据集平台之一,该平台托管超过 50,000 个公共数据集,涵盖从医疗保健、经济到体育和娱乐等各种主题。每个数据集都有专属社区。
  • 亚马逊开放数据平台(https://registry.opendata.aws/)提供公共交通、航天、生态资源等多个领域的数据集。
  • UCI(https://archive.ics.uci.edu/ml/datasets.html)加州大学信息与计算机科学院的一个数据库,包含 100 多个按机器学习问题类型分类的标准数据集。

在角色扮演这个场景下,CAMEL 数据集(https://huggingface.co/datasets/camel-ai/ai_society)是一个大规模的对话数据集,包含约 22.9 万条结构化的多轮对话数据。

通过合理利用这些公开数据集,可以为模型提供丰富的角色扮演训练素材,提升模型的对话能力和角色表现力。

2. 数据清洗

数据清洗是确保数据质量的关键步骤, 通常来说我们需要解决以下问题:

  • 移除或匿名化个人识别信息(PII)。
  • 纠正拼写和语法错误。
  • 去除 HTML 标签、特殊字符和无关内容。
  • 过滤掉广告、垃圾信息等干扰内容。
  • 删除无关或重复的内容。
  • 确保对话的连贯性和逻辑性。

样例:数据集合处理

import re

def clean_text(text):
    *# 移除多余的空白字符*
    text = re.sub(r'\\\\s+', ' ', text).strip()
    *# 纠正常见的拼写错误*
    text = text.replace('teh', 'the').replace('dont', "don't")
    *# 移除URL*
    text = re.sub(r'http\\\\S+', '', text)
    return text

*# 使用示例*
dirty_text = "teh quick  brown fox   dont jump over <http://example.com> lazy dog"
clean_text = clean_text(dirty_text)
print(clean_text)
*# 输出: "the quick brown fox don't jump over lazy dog"*

3. 数据集质量控制

控制数据集质量是一个必要的过程。

数据选择的方式

  • 随机抽样检查:人工审核部分数据,确保质量。
  • 统计分析:检查数据分布、长度分布、词频等指标。
  • 小规模测试:使用部分数据进行初步微调,评估效果。
  • 交叉验证:使用不同子集进行多次微调,比较结果一致性。

控制的维度

  • 移除重复和近似重复的内容。
  • 过滤低质量、无意义的对话。
  • 确保内容符合法律法规和伦理要求。

样例:数据集基本统计分析

import pandas as pd
import matplotlib.pyplot as plt

*# 数据存储的CSV*
df = pd.read_csv('dataset.csv')

*# 计算基本统计信息*
print(df.describe())

*# 绘制对话长度分布图*
plt.figure(figsize=(10, 6))
df['message_length'] = df['message'].str.len()
df['message_length'].hist(bins=50)
plt.title('Distribution of Message Lengths')
plt.xlabel('Message Length')
plt.ylabel('Frequency')
plt.show()

*# 计算词频*
from collections import Counter
all_words = ' '.join(df['message']).split()
word_freq = Counter(all_words)
print("Most common words:", word_freq.most_common(10))

4. 数据格式化和标准化

统一的数据格式对于微调至关重要:

不同模型可能有自己特定的微调格式,可以使用 Llama_factory 等工具进行统一处理。不同的格式适用的场景也不同,比如 Alpaca 结构简单,适合基础指令微调,ShareGPT 则支持更多的角色种类。

样例:将数据转换为标准格式

def convert_to_format(conversations):
    format = []
    for conv in conversations:
        format.append({
            "messages": [
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": conv["user_input"]},
                {"role": "assistant", "content": conv["ai_response"]}
            ]
        })
    return openai_format

*# 使用示例*
conversations = [
    {"user_input": "你好,今天天气如何?", "ai_response": "你好!今天天气晴朗,温度适宜,非常适合户外活动。"},
    *# 更多对话...*
]

openai_data = convert_to_format(conversations)

5. 数据扩增

数据扩增是准备微调时是一个有可能发生的步骤,但不是必须的。在处理特定领域或任务时,我们往往面临着高质量数据不足的问题。数据扩增技术可以帮助我们在保持数据质量的同时,增加数据的数量和多样性,从而提高模型的泛化能力和性能。

以下是几种常用的数据扩增方法:

  1. 同义词替换:使用同义词词典或预训练的词嵌入模型,替换句子中的某些词语。这种方法可以增加语言的多样性,同时保持原有的语义。
  2. 回译:将原文翻译成另一种语言,然后再翻译回来。这种方法可以产生表达相同意思的不同句子结构。
  3. 文本生成:利用已有的大语言模型生成新的、相似的文本。这种方法可以产生大量的新数据,但需要注意控制生成内容的质量和相关性。
  4. 上下文扩展:为现有的对话添加更多的上下文信息,使对话更加丰富和自然。
  5. 句子重组:将长句拆分成短句,或将多个短句组合成长句,增加句子结构的多样性。

在数据扩增的过程中,使用大语言模型(LLM)进行扩增已经成为一种非常有效且创新的方法。这种方法不仅能够生成大量高质量的数据,还能保持数据的语义一致性和多样性。

以下是几种利用 LLM 进行数据扩增的方式,特别适用于角色扮演(roleplay)模型的训练:

基于 Prompt 的数据生成:我们可以使用 LLM 来生成符合特定角色和场景的对话。

“生成一段医生和病人之间的对话,医生性格温和,病人有些焦虑。”

LLM 会基于这个提示生成相应的对话,这样我们就可以快速获得大量符合特定角色设定的对话数据。

对话扩展:对于已有的简短对话,我们可以使用 LLM 来扩展它们。

原始对话:用户:我今天感觉不太舒服。
助手:我很抱歉听到这个。能具体说说哪里不舒服吗?

扩展后
用户:我今天感觉不太舒服。
助手:我很抱歉听到这个。能具体说说哪里不舒服吗?
用户:我感觉头很晕,而且有点恶心。
助手:听起来你可能是有些头晕和恶心。这种症状可能有多种原因。你最近有熬夜或者压力大吗?或者是不是吃了什么不合适的食物?用户:确实最近工作压力挺大的,经常熬夜到很晚。
助手:我明白了。工作压力和睡眠不足确实可能导致这些症状。我建议你先尝试调整作息,保证充足的睡眠。同时,也要注意放松身心,可以尝试一些简单的冥想或深呼吸练习。如果症状持续或加重,最好去看一下医生。你觉得这些建议可行吗?

场景变换:我们可以使用 LLM 来将已有的对话转换到不同的场景中。例如:

原始对话(在咖啡店):
用户:这里的咖啡真不错。
助手:是的,这里用的是精选的阿拉比卡豆,口感确实很棒。
我们可以让LLM将这段对话转换到不同的场景,如餐厅、书店等

转换后(在餐厅)
用户:这里的牛排真不错。
助手:没错,这里使用的是精选的安格斯牛肉,口感确实很棒。

风格转换:LLM 可以帮助我们将同一段对话转换成不同的语言风格,以增加数据的多样性。

例如:原始对话(正式风格):用户:您能为我推荐一本关于人工智能的书籍吗?
助手:当然可以。我建议您可以考虑阅读Stuart Russell和Peter Norvig合著的《人工智能:一种现代方法》。这是一本全面介绍AI领域的经典教材。

转换后(轻松风格):
用户:嘿,有啥好看的AI书推荐不?
助手:哇,说到AI的好书,我立马想到一本超赞的!Russell和Norvig写的《人工智能:一种现代方法》,简直是本宝藏书。里面讲的AI知识可全面了,绝对能让你大开眼界!

更多内容可以参考 https://github.com/tsaol/finetuning-on-aws/tree/main/data-preparation, 通过结合传统的数据扩增方法和基于 LLM 的扩增技术,我们可以创建一个更加丰富、多样化的训练数据集。这不仅可以提高模型的性能和泛化能力,还可以帮助模型更好地处理各种复杂的对话场景。在角色扮演模型的训练中,这种方法尤其有效,因为它可以帮助模型学习更自然、更符合角色特征的对话方式。

我们也可以通过 Dify workflow 这类 LLM 编排工具,来更加便捷地构建整个流程。

Dify 的 workflow 可以参考链接:https://github.com/tsaol/finetuning-on-aws/blob/main/data-preparation/data-preparation-workflow.yml

结论

在数据准备过程中,我们需要在数据量和质量之间找到平衡。高质量的数据集虽然可能规模较小,但往往能带来更好的微调效果。同时,我们也要注意数据的多样性,确保覆盖各种可能的场景和表达方式,以提高模型的泛化能力。通过精心准备的数据集,我们可以显著提高微调的效果,使模型更好地适应特定的任务或领域。在接下来的微调过程中,这些高质量的数据将成为模型学习的基石。值得注意的是,数据准备是一个迭代的过程。在初次微调后,我们可能需要根据模型的表现来调整数据集,可能包括添加更多特定类型的样本,或者修改现有样本以纠正模型的错误倾向。持续的数据改进和模型评估循环是达到最佳微调效果的关键。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考链接

https://github.com/tsaol/finetuning-on-aws

https://www.solwey.com/posts/fine-tuning-large-language-models-a-comprehensive-guide

https://dify.ai

https://registry.opendata.aws

https://www.kaggle.com/datasets

https://huggingface.co/docs/hub/en/datasets

系列文章

炼石成丹:大语言模型微调实战系列(二)模型微调篇

炼石成丹:大语言模型微调实战系列(三)模型评估篇

本篇作者

曹镏

亚马逊云科技解决方案架构师,拥有 16 年企业级架构设计经验。作为生成式 AI 落地实践的专家,专注企业数字化咨询与架构设计,已成功帮助 50+ 家企业完成 AI 转型,涵盖零售、制造、金融、教育等核心行业。主导构建百卡规模的企业级 AI 基础设施,开源多个企业级 AI 项目,累计获得 1000+ Stars。目前专注于大模型在企业场景的创新应用,包括 AI 治理平台、Agentic AI、智能硬件等关键领域以及相关解决方案。热衷技术创新与分享,追求卓越工程品质,在生活中享受美食和旅行。

肖培庆

亚马逊云科技解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内的应用和推广。现主要负责初创企业行业解决方案,曾任职于 IBM、联想、Avnet,多年大型企业网络架构和运维经验。