ChatGLM多轮对话微调-多轮对话训练数据的自动生成(标注)

文章介绍了在使用大模型如ChatGLM进行业务数据微调时,如何处理历史对话数据以进行1-3轮的对话任务。提到微调可能导致模型理解能力下降,解决方法是数据增强,尤其是人工标注。提供了一个Python脚本,用于自动从历史对话数据中生成1-3轮对话的标注数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        通常使用大模型进行业务数据微调的时候,需要对历史对话数据进行细粒度的整理,比如:1-3轮对话数据的微调,以便模型能够学会多轮对话。以ChatGLM为例,微调对话任务的时候,微调会导致模型的理解能力别削弱(无法理解相似语义的输入),即当输入数据prompt的分布与训练数据分布不一致时,模型不会按照训练集的response进行输出,而是使用模型原有的能力进行输出,模型输出结果出现不可控的情况。这个时候需要对输入的数据进行数据增强,数据的方法很多,但个人认为对于样本比较少的对话,最有效的方式应该是人工进行标注,即人工写出输入数据prompt的各种可能的语义相似的样本来(根据对数据增强方式的理解,如:释义、采样和加噪),有人说数据增强的方式怎么做也无法与人工标注的效果相比,只适合于写论文,这里不做评价和扩展。仅针对多轮对话进行1-3轮的对话数据自动标注说明。

       假定历史对话的格式为:

#test.txt
坐席:Y0
客户:X0
坐席:Y1
客户:X1
.....
坐席:Yn
客户:Xn

        说明:1轮指的是n=0时,坐席和客户说的话作为输入,3轮指的是n=2时,坐席和客户说的话作为输入。

        最多3轮,个人认为1-3轮的叠加能解决大部分场景的多轮对话的问题。

1.读取历史对话文本test.txt

import pandas as pd
data =[]
file_name = 'test'
with open(f'{file_name}.txt') as f:
    data = f.readlines()
print(data)

2.自动生成1-3轮对话标注

#to ChatGLM格式
lines=[]
prompt=''
for i,row in enumerate(data):
    if i>0 and i%2==0:
        temps = data[i-3:i-1]
        if len(temps) == 2:
            history = [[temps[0],temps[1]]]
        else:
            history = [['','']]
        lines.append({"prompt":prompt.replace('\n',''),"response":row.replace('\n',''),"history":history})
        prompt = row
    else:
        prompt = row
    if i==len(data)-1:
        prompt = ''
prompt=''
for i,row in enumerate(data):
    if i>0 and i%2==0:
        temps = data[i-5:i-1]
        if len(temps) == 4:
            history = [[temps[0],temps[1]],[temps[2],temps[3]]]
        else:
            history = [['','']]
        lines.append({"prompt":prompt.replace('\n',''),"response":row.replace('\n',''),"history":history})
        prompt = row
    else:
        prompt = row
    if i==len(data)-1:
        prompt = ''
prompt=''
for i,row in enumerate(data):
    if i>0 and i%2==0:
        temps = data[i-7:i-1]
        if len(temps) == 6:
            history = [[temps[0],temps[1]],[temps[2],temps[3]],[temps[4],temps[5]]]
        else:
            history = [['','']]
        lines.append({"prompt":prompt.replace('\n',''),"response":row.replace('\n',''),"history":history})
        prompt = row
    else:
        prompt = row
    if i==len(data)-1:
        prompt = ''
print(lines)

3.显示自动标注的结果

df = pd.DataFrame(lines)
df

4.保存生成的标注数据

import json
with open ('train.json','w') as f:
    json.dump(lines,f)

### 多轮对话模型的微调方法 多轮对话模型的微调可以通过多种方式进行优化,具体取决于目标场景以及可用资源。以下是几种常见的微调方法及其特点: #### 数据准备 为了提高模型性能,在微调之前需要准备好高质量的训练数据。一种常见做法是对历史对话数据进行整理并生成用于微调数据集[^1]。例如,可以采用人工标注的方式来增加输入数据的多样性,从而减少因数据分布差异而导致的模型输出失控现象。 #### 自动化生成标注数据 除了手动标注外,还可以通过自动化手段来自动生成标注数据。这种方法尤其适用于样本数量较少的情况下。例如,利用释义技术、随机采样或者加入噪声等方式来扩充原始数据集合。 #### 单轮与多轮对话格式的选择 在实际操作过程中,可以根据需求选择不同的对话格式来进行微调。如果希望充分利用每一轮次中的交互信息,则建议采取包含完整上下文的形式;反之则可以选择简化版仅保留当前回合的内容作为输入[^3]。 #### 实战案例分析 - ChatGLM系列模型 以ChatGLM为例,在其官方文档中提到了具体的微调流程及相关参数设置指南[^2]。其中包括但不限于以下几个方面: - **数据预处理**:将收集到的真实世界会话记录转换成标准Prompt-Response形式; - **算法选型**:支持全量Fine-tune、P-Tuning V2以及LoRA等多种策略供开发者灵活选用; - **硬件配置考量**:考虑到计算成本等因素影响,提供了关于不同设备环境下最优解法的相关讨论; - **功能扩展方向**:不仅限于单纯提升聊天质量本身,还可进一步探索集成外部API服务等功能模块的可能性。 ```python from transformers import AutoTokenizer, AutoModelForCausalLM import torch tokenizer = AutoTokenizer.from_pretrained("path/to/model") model = AutoModelForCausalLM.from_pretrained("path/to/model") def generate_response(input_text, history=None): inputs = tokenizer.encode_plus( input_text, max_length=512, truncation=True, padding="max_length", return_tensors='pt' ) with torch.no_grad(): outputs = model.generate(**inputs) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response ``` 上述代码片段展示了如何加载预训练好的权重文件并通过`generate()`函数接口快速获取对应回复内容的功能演示示例。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jacky_wxl(微信同号)

喜欢作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值