目录
1.微调玩法攻略
1.1.微调思路
1.2.什么是大模型人格化?
1.3. 大模型人格化的应用场景
1.4 构建对应格式的数据集
1.4.1 选择数据格式
1.4.2 Alpaca 格式要求
1.4.3 构建数据集
1.4.4 没有剧本怎么办
1.4.5 整理成 json 格式
1.微调玩法攻略
1.1.微调思路
我找了三个火枪手的txt文件作为本次的主题
1.2.什么是大模型人格化?
以语言表达风格的人格化为例,可以包括:
-
语气和措辞 :模仿人类在不同场景下的语气,如正式、亲切、幽默等。在回答问题时,使用符合人类语言习惯的措辞,使交流更自然流畅。
-
语言风格的多样性 :根据不同的应用场景和用户需求,展现出不同的语言风格。比如在文学创作领域,能够模仿不同作家的文风进行创作;在客服场景中,使用专业、耐心的语言风格为用户解答问题。
更多相关研究内容可见:
Human Simulacra: Benchmarking the Personification of Large Language Models
ChatHaruhi: Reviving Anime Character in Reality via Large Language Model
Chat凉宫春日
1.3. 大模型人格化的应用场景
大模型人格化具有丰富的应用场景,如:
-
智能客服 :以更亲切、自然的方式与客户交流,提高客户满意度。例如,当客户咨询问题时,智能客服可以用友好的语气回答问题,并根据客户的情绪做出相应的安抚,让客户感受到更贴心的服务 。
-
教育领域 :作为AI老师,根据不同的教学风格和学生的特点进行个性化教学。比如,有的AI老师可以是幽默风趣的,通过讲笑话、举例子等方式让学生更容易理解知识;有的AI老师则可以是严谨认真的,注重知识的系统性和逻辑性 。
-
情感陪伴 :扮演朋友、家人等角色,与用户进行情感交流和陪伴,缓解用户的孤独感和压力。例如,当用户晚上睡不着觉时,可以和大模型聊天,分享自己的心事,大模型则可以给予安慰和鼓励 。
-
内容创作 :根据用户的需求和指定的人格化特点,生成具有不同风格和情感色彩的文本内容,如小说、诗歌、文案等。比如,为广告文案生成亲切、有感染力的内容,吸引消费者的注意力;为小说创作不同性格的人物对话,使故事更加生动有趣 。
1.4 构建对应格式的数据集
1.4.1 选择数据格式
对于语言模型来说,微调数据必须是文本。如果你的数据源是WORD、PDF等格式,需要使用专门的解析工具,提取其中的文本。如python的docx、PyPDF2包。
其次,微调数据除了当前对话的输入和输出之外,还有一些其他的属性,如想要大模型扮演的角色、对话历史等等。因此,为了更好地对数据进行处理,通常会对数据进行结构化,并以json或者jsonl的格式进行存储。
具体来说,目前主流的数据集有两种格式: Alpaca 格式和 ShareGPT 格式,其主要特点如下表所示。
图一、 Alpaca 格式和 ShareGPT 格式主要区别
1.4.2 Alpaca 格式要求
此部分内容为讯飞用户手册描述的格式要求
-
instruction列对应的内容会与input列对应的内容拼接后作为模型输入,即为instruction\input。
-
output列对应的内容为模型回答。
-
如果指定,system列对应的内容将被作为系统提示词。
-
history列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。
1.4.3 构建数据集
确定了数据格式,接下来就是数据集的构建了。 一种构建人格化数据的大致思路是:
-
从原始数据中提取出角色和对话
-
筛选出我们关注的角色的对话
-
将对话转换成我们需要的格式
def extract_dialogues(file_path):
result = []
current_act_dialogues = []
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
line = line.strip()
if line.startswith("("): # 过滤旁白行
continue
if line.startswith("第") and line.endswith("幕"): # 解析新的一幕
if current_act_dialogues:
result.append(current_act_dialogues)
current_act_dialogues = []
elif ":" in line: # 按:切分角色和对话内容
role, content = line.split(":", 1)
role = role.strip()
content = content.strip()
current_act_dialogues.append({"role": role, "content": content})
if current_act_dialogues: # 保存最后一幕
result.append(current_act_dialogues)
return result
file_path = '三个火枪手.txt'
dialogues = extract_dialogues(file_path)
print(dialogues)
图二、构建人格化数据集
对于这样格式比较规整的数据,我们可以使用正则表达式或者其他方法进行快速的提取,并抽取出我们关注的角色的对话。
def extract_huoqiangshou_dialogues(dialogues):
result = []
huoqiangshou_dialogues = []
for act in dialogues:
for i, dialogue in enumerate(act):
if "达达尼昂" in dialogue["role"] and i > 0:
huoqiangshou_dialogues.append(act[i-1])
huoqiangshou_dialogues.append(dialogue)
result.append(huoqiangshou_dialogues)
huoqiangshou_dialogues = []
return result
huoqiangshou_dialogues = extract_huoqiangshou_dialogues(dialogues)
print(huoqiangshou_dialogues)
图三、使用正则表达式或者其他方法进行快速的提取,并抽取出达达尼昂的对话
1.4.4 没有剧本怎么办
对于这种数据,推荐通过 讯飞星辰MaaS平台 的问答对抽取功能,直接进行数据构建。
直达链接:星火大模型精调平台
就可以看到抽取出来的数据啦~
1.4.5 整理成 json 格式
对话抽取完成后,再将其整理成 json 格式的数据
import json
def build_json_data(dialogues, json_file):
result = []
for act in dialogues:
sample = {
"instruction": act[0]["content"],
"input": "",
"output": act[1]["content"]
}
result.append(sample)
with open(json_file, 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=4)
build_json_data(huoqiangshou_dialogues, 'huoqiangshou.jsonl')
图四、对话抽取完成后,再将其整理成 json 格式的数据结果
图五、参照task1构建出完整的模型
图六、体验结果