AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


dify案例分享-基于文本模型实现Fine-tune 语料构造工作流
发布日期:2025-01-08 09:46:26 浏览次数: 1597 来源:wwzhouhui


AI模型的微调和训练是人工智能领域中非常重要的技术手段,尤其是在大模型时代,这些技术的应用范围和重要性日益增加.

一、什么是AI模型微调?

微调(Fine-tuning)是指在已经预训练好的大规模模型基础上,通过进一步训练来适应特定任务或数据集的过程。这一过程体现了迁移学习的思想,即利用预训练模型在通用数据上学习到的知识,通过微调使其更好地服务于特定的应用场景.

微调的主要步骤:

  1. 选择预训练模型:从现有的大型预训练模型(如BERT、GPT、T5等)中挑选适合任务需求的模型作为基础。

  2. 准备数据集:为特定任务准备高质量的训练和验证数据集,确保数据与目标任务紧密相关。

  3. 调整模型结构(可选) :根据任务需求,可能需要对模型结构进行微调,如增减层数、调整激活函数等。

  4. 设置训练参数:包括学习率、批处理大小、训练轮次等,这些参数将直接影响微调效果。

  5. 开始训练:在选定数据集上迭代训练模型,并观察验证集上的表现,适时调整训练策略。

  6. 评估与部署:使用测试集评估微调后的模型性能,满足要求后即可部署到实际应用中。

以上就是AI模型微调步骤,不管是模型微调和模型训练都少不了模型微调和模型训练需要的数据集。我们知道要想微调和训练模型数据集非常重要。早期数据集都是靠人工标注或者是通过程序来实现,对非技术人员不太友好,换句话说微调数据集制作门槛就非常高,普通小白是很难上手的。那么有没有什么好的办法快速实现数据集的制作呢?答案是有的今天给大家带来使用dify 实现一个微调(Fine-tuning)语料构造工作流,话不多说,下面带大家实际操作一下。

二、微调(Fine-tuning)语料构造工作流

 我们首先给大家先展现一下制作好的工作流,工作流如下界面


 这里主要是分为5个部分。分别是:开始、文档提取器、代码执行、LLM大语言模型、结束 5个部分。

开始

 我们打开dify,创建一个空白页面-选择工作流,我们给应用起个名字。

创建完成后我们进入工作流画布界面

 我们在开始节点中新建2个输入参数。1个是用户上传的文件,1个是触发词(训练中的 system prompt)

  下面我们先看第一个参数attachments,

         我们参考上图完成第一个参数的设置。接下来我们在设置第二个参数触发词

        

        

    通过以上方式我们完成了开始节点2个输出参数的设置。

   

文档提取器

接下来我们开始节点右边的加号点击打开,选择文档提取器节点。

    文档提取器输入变量,填写开始节点中的attechments 数组参数

  

代码执行

 接下来我们在文档提取器右边加号节点中选择代码执行工作流和文档提取器节点连接上。

  

在代码执行右边窗口中,我们这里是需要一个输入参考,参数名和参数值分别如下

参数名:articleSections

参数值:文档提取器text(数组)

 

执行的代码如下:

def main(articleSections: list) -> dict:
    try:
        # 将列表项合并为字符串
        combined_text = "\n".join(articleSections)
        
        # 截取前80000个字符
        truncated_text = combined_text[:80000]
        
        return {
            "result": truncated_text
        }
    except Exception as e:
        # 错误处理
        return {
            "result": ""
        }

输出变量,参数值result  类型 string

    这里简单解释一下,代码执行主要目的是合并前面流程中合并多个文档内容,并截取前 8W 字符。为什么是8w 主要是dify 沙箱运行环境长度限制导致,如果有的小伙伴觉得这个不够用可以自己写接口服务实现合并多个文档内容。

LLM

接下来我们需要代码执行连接一个LLM大语言模型,这个大语言模型主要的目的就是处理上面文档内容 通过提示词转其转换成符合我们模型微调的数据集。

以下是一条典型的微调数据示例:

{"messages": [{"role": "system", "content": "你是当代大儒"}, {"role": "user", "content": "应该怎么学习?"}, {"role": "assistant", "content": "贤贤易色;事父母,能竭其力;事君,能致其身;与朋友交,言而有信。虽曰未学,吾必谓之学矣。"}]}

正常微调的数据集不可能只有一个应该是多条,数据格式是以jsonl格式的数据集

 这里面说一下 以上数据集合格和我们前面的数据集格式不一样,这个没关系只要符合常见数据集格式规范即可。关于数据集方面这里我就不详细展开了,不是文本的重点。

 LLM 配置信息如下

1.模型我们选择了调用 SiliconCloud 的 Qwen/Qwen2.5-72B-Instruct-128K 模型

2.系统提示词

3.用户提示词

 系统提示词内容如下:

【角色】
你是一位 LLM 大语言模型科学家,参考用户提供的内容,帮助用户构造符合规范的 Fine-tune(微调)数据

【任务】
- 对于给定的「内容」,你每次回列出 10 个通俗「问题」;
- 针对每个「问题」,引用「内容」原文及对内容的合理解释和演绎,做出「解答」;
- 并将「问题」「解答」整理为规范的 JSONL 格式

【要求】
1. 问题 **不要** 直接引用「内容」,应该贴近当代现实生活;
2. 问题应该是通俗白话,避免“假、大、空“;
3. 答案应忠于原文,对于原文的解释不能脱离原文的主旨、思想;

【输出规范】
* 输出规范的 JSONL,每行一条数据
* 每条数据应包含一个 message 数组,每个数组都应该包含 role 分别为 system、user 和 assistant 的三条记录
* 其中 role 为 system 的数据,作为训练中的 system prompt 格外重要,其 content 使用用户指定的「触发词」
* role 为 user 的数据对应列出的「问题」
* role 为 assistant 的数据则对应针对「问题」的「解答」
* 示例如下:
```
{"messages": [{"role": "system", "content": "你是当代大儒"}, {"role": "user", "content": "应该怎么学习?"}, {"role": "assistant", "content": "贤贤易色;事父母,能竭其力;事君,能致其身;与朋友交,言而有信。虽曰未学,吾必谓之学矣。"}]}
```

   这里主要的目的是告诉LLM大语言模式在取得上面文档内容 的是需要转换成符合微调数据集格式输出规范要求,这个你得告诉大模型应该输出上面样子数据,这样它才能按照你的要求输出。

用户提示词 这里主要是接受 文本内容以及我们在开始节点中要求的触发词(训练中的 system prompt)

结束

 这里我们需要从llm大语言模型中右边节点中添加一个结束节点。输入参数是llm输出text

 

通过以上方式我们就完成了微调(Fine-tuning)语料构造工作流的制作。

三、测试

记下来我们对这个工作流进行测试。点击工作流上面的运行按钮

 输入训练的预料文件,我这里为了方便测试就输入一个单个txt文档(少年歌行小说一部分)。触发词输入:你是少年歌行小说专家

运行结果

生成结果内容

{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "萧瑟的客栈为什么生意不好?"}, {"role": "assistant", "content": "因为那几个月雪落山庄附近的雪下得很大,路被封住了,所以很少有人来客栈歇脚。而且萧瑟自己也不愿意出钱修整客栈,导致房间漏风,客人们冻得受不了,宁愿挨风雪也上路了。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "雷无桀为什么不怕冷?"}, {"role": "assistant", "content": "雷无桀身上有一种特殊的武功叫‘火灼之术’,能让他在寒冷的环境中保持身体温暖。这种武功让他在冰天雪地中依然能保持战斗力。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "唐莲为什么不让雷无桀继续打?"}, {"role": "assistant", "content": "因为唐莲知道雷无桀已经受了重伤,再打下去可能会有生命危险。而且唐莲明白对手的实力很强,单靠雷无桀一个人是无法取胜的。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "无心和尚为什么带着雷无桀和萧瑟?"}, {"role": "assistant", "content": "无心和尚认为雷无桀和萧瑟是不受他‘心魔引’影响的人,而且他们看起来很有钱。无心和尚需要钱和帮手,所以带上了他们。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "为什么萧瑟说忘忧大师变成了魔僧?"}, {"role": "assistant", "content": "因为忘忧大师在一次接见香客时突然疯了,用剑杀死了面前的香客,并且在之后坐化成灰。江湖传言他练功走火入魔,变成了魔僧。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "唐莲为什么会被白发仙和紫衣侯打伤?"}, {"role": "assistant", "content": "因为唐莲护送的黄金棺材里装着非常重要的东西,白发仙和紫衣侯为了抢夺这个东西而攻击了唐莲。唐莲虽然武功高强,但面对这两个顶尖高手还是受了伤。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "无心和尚为什么会被废去武功?"}, {"role": "assistant", "content": "因为无心和尚身负罗刹堂武功,引起了各方势力的争夺。为了保护自己和他人,无心和尚主动废去了自己的武功。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "雷无桀为什么会被飞剑击中?"}, {"role": "assistant", "content": "因为雷无桀虽然武功高强,但面对御剑少年无双的飞剑攻击时,他的反应速度和内力都不足以完全抵挡。而且他不想暴露自己的真实身份和武功底细。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "司空长风为什么被称为枪仙?"}, {"role": "assistant", "content": "因为司空长风的枪法非常高超,能斩杀烈鬼亡魂,曾经一枪破去祁连山下魔教六位长老合力布下的孤虚鬼阵。他的枪法在武林中几乎无人能敌,因此被称为枪仙。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "为什么无双城要抢无心和尚?"}, {"role": "assistant", "content": "因为无心和尚身负罗刹堂三十二门秘技,这些武功非常珍贵。无双城希望将这些秘技归还给佛宗,并且将无心和尚带回城中,以增强自己的实力。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "为什么大觉禅师会用金刚不坏神功?"}, {"role": "assistant", "content": "因为大觉禅师是九龙寺的住持,武学成就非常高。面对无心和尚的攻击,他使用了金刚不坏神功来保护自己和寺中的其他僧人。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "萧瑟为什么一直说自己不会武功?"}, {"role": "assistant", "content": "因为萧瑟虽然有轻功和一些机关技巧,但他并不擅长正面交战。他自称不会武功是为了避免引起不必要的麻烦,并且保持自己的安全。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", "content": "雷无桀为什么愿意帮无心和尚?"}, {"role": "assistant", "content": "因为雷无桀觉得无心和尚救过他们两次性命,而且他觉得这个和尚很有趣。虽然他还不完全了解无心和尚的背景,但他愿意帮助他完成心愿。"}]}
{"messages": [{"role": "system", "content": "你是少年歌行小说专家"}, {"role": "user", 《少年歌行》中的“大罗汉伏魔金刚无敌神通”是什么?}, {"role": 《“大罗汉伏魔金刚无敌神通”是无心和尚传授给雷无桀的一套拳法。这套拳法结合了佛门基本的大罗汉拳和更高级的伏魔拳,威力巨大,能够对抗强大的敌人。虽然名字听起来很厉害,但实际上只是佛门的基础拳法加上一些高级技巧。}]}
{"messages":[{"role":"system","content":"你是少年歌行小说专家"},{"role":"user","内容":"司空长风为什么说要让雷无桀记住他?"},{"role":"assistant","内容":"因为司空长风是武林中绝世高手之一,他的枪法无人能敌。司空长风希望雷无桀记住他,是因为这样的高手在江湖中非常罕见,记住他们的名字对雷无桀来说是一种激励和学习的机会。"}]}
{"messages":[{"role":"system","content":"你是少年歌行小说专家"},{"role":"user","内容":"为什么萧瑟说唐莲会‘三步唐门’?"},{"role":"assistant","内容":"‘三步唐门’是指唐门暗器高手能够通过听风辨位的能力,在三步之内判断出敌人的位置和攻击方式。唐莲作为暗器高手,在客栈中用这种技巧提醒萧瑟和雷无桀注意危险。"}]}
{"messages":[{"role":"system","content":"你是少年歌行小说专家"},{"role":"user","内容":"忘忧大师为什么要收养叶鼎之的儿子?"},{"role":"assistant","内容":"因为叶鼎之的儿子叶安世(即无心和尚)在六岁时就展现出了非凡的天资,并且叶鼎之与忘忧大师有深厚的交情。忘忧大师认为叶安世有潜力成为一个好的修行者,所以决定收养他并传授佛法。"}]}

 上面的数据是符合模型微调json格式的数据,把他保存为XX.jsonl。后面模型微调时候就可以用这个构造好的XX.jsonl作为模型微调的数据集了。 

这个大家可能有个疑问了,为什么输出的数据集只有十几条。这个主要是为了测试方便。

四、总结

今天我们就带大家dify新功能dify案例分享-微调(Fine-tuning)语料构工作流,来感受一下dify的强大。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询