在上一篇中讲解了微调的理论,具体要如何实现呢?首先让我们看一下微调的效果。
微调的最终目的是提升模型在特定任务上的表现。我们通过对比原始模型、添加系统提示词的模型和微调后的模型在回答脑筋急转弯问题时的表现,来展示微调的效果。
一、原始模型的输出
首先,我们可以展示原始模型(不微调)的输出效果:
输入问题:"在所有植物中,什么植物最老实?"
from openai import OpenAI
client = OpenAI(
api_key="<你的API key> ",
base_url="https://api.siliconflow.cn/v1"
)
messages = [
{"role": "user", "content": "在所有植物中,什么植物最老实?"},
]
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=messages,
stream=True,
max_tokens=4096
)
print("原始输出:")
for chunk in response:
print(chunk.choices[0].delta.content, end='')
模型的输出相当“理性”:
这个问题其实是一个有趣的玩笑话。通常,植物并不能表现出“老实”这一人类社会行为特征,因为我们不能赋予它们人类的感情或行为方式。但在这种幽默的提问方式下,我们可以理解为哪种植物最不具有攻击性或者生长过程中最不会给人们带来麻烦。
如果我们从这个角度来看,在所有植物中,被认为最“老实”的可能是**苔藓**。苔藓生长缓慢,对环境适应性强,且通常不会对人类或其他植物造成威胁。当然,这也只能作为一种幽默的比喻来理解。实际上,每种植物都有其独特的生存方式和价值。
原始模型在回答“在所有植物中,什么植物最老实?”时,给出了一个理性的答案,解释了植物没有“老实”这一人类行为特征,并从生物学角度提出了苔藓作为一个可能的答案。虽然这个回答在逻辑上没有问题,但它没有抓住脑筋急转弯的核心——幽默和文字游戏。
二、系统提示词引导的模型
当我们给模型添加一个系统提示词,设定它为“脑筋急转弯高手”时,模型的回答开始向我们期望的方向转变。
messages = [
{"role": "system", "content": "你是一个脑筋急转弯高手,用户将向你提问脑筋急转弯问题,你需要根据问题做出回答。"},
{"role": "user", "content": "在所有植物中,什么植物最老实?"},
]
输出结果有了变化:
这个问题的答案是一个脑筋急转弯,需要从字面上而不是常识上理解。答案是“竹笋”,因为它总是老实“涨”。这里的“涨”与“老实”相似,又与竹笋生长迅速的特点相结合,形成了幽默的玩笑。
它给出了“竹笋”作为答案,解释了“涨”与“老实”的联系。这表明系统提示词能够在一定程度上引导模型的行为,但仍有不足,未能给出最经典的答案。
三、微调后的模型
现在,我们选择微调后的模型,询问相同的问题:
response = client.chat.completions.create(
model="ft:LoRA/Qwen/Qwen2.5-7B-Instruct:用户ID:模型名称:任务ID-ckpt_step_16",
messages=messages,
stream=True,
max_tokens=4096
)
print("微调输出:")
for chunk in response:
print(chunk.choices[0].delta.content, end='')
模型的输出精准而巧妙:
芭蕉——老实巴交
经过微调的模型在回答相同问题时,给出了精准而巧妙的答案:“芭蕉——老实巴交”。这个答案巧妙地利用了“芭蕉”与“巴交”的谐音,准确命中了脑筋急转弯的幽默点。这展示出微调技术的强大能力,它让模型在特定任务上实现了从“通用”到“专用”的转变。
为了实现上面的微调的效果,需要我们一个优质的数据集能够引导模型学习。
四、数据集:微调的基石
数据集的质量直接决定了微调的效果。在脑筋急转弯的例子中,我们需要收集大量高质量的问答对,这些问答对需要准确体现脑筋急转弯的特点,即通过语言的巧妙运用产生幽默效果。例如,“什么门永远关不上?”答案是“足球门”,这样的问答对能够帮助模型理解脑筋急转弯的精髓。
五、数据集格式转换
在准备数据集时,我们需要注意数据的格式。现代微调框架通常偏好JSON Lines (JSONL) 格式,这种格式允许每个训练样本单独成行,便于处理大型数据集。我们将收集到的脑筋急转弯数据从标准JSON格式转换为JSONL格式,使其符合微调框架的要求。转换后的数据集每一行代表一个训练样本,包含用户的问题和模型的预期回答,模拟了一次完整的对话过程。
数据集格式转换如下:
import json
# 打开原始数据
with open('data.json', 'r', encoding='utf-8') as f:
data_json = json.load(f)
data = data_json['data']
# 将数据转化为jsonl格式
jsonl = []
for item in data:
question = item['instruction']
answer = item['output']
messages = {
"messages": [
{"role": "user", "content": question},
{"role": "assistant", "content": answer}
]
}
jsonl.append(str(json.dumps(messages)) + "\n")
# 保存jsonl文件
with open('data.jsonl', 'w', encoding='utf-8') as f:
f.writelines(jsonl)
经过上述代码处理后,我们会得到一个名为data.jsonl的文件。文件的转换后的数据每一行都是一个独立的JSON对象,代表一个训练样本。数据集的部分内容如下:
{'messages': [{'role': 'user', 'content': '什么门永远关不上?'}, {'role': 'assistant', 'content': '足球门'}]}
{'messages': [{'role': 'user', 'content': '小明晚上看文艺表演,为啥有一个演员总是背对观众?'}, {'role': 'assistant', 'content': '乐队指挥'}]}
{'messages': [{'role': 'user', 'content': '什么人一年只上一天班还不怕被解雇?'}, {'role': 'assistant', 'content': '圣诞老人'}]}
{'messages': [{'role': 'user', 'content': '什么人一年中只工作一天却永远不会被炒鱿鱼?'}, {'role': 'assistant', 'content': '圣诞老人'}]}
{'messages': [{'role': 'user', 'content': '什么床不能睡?'}, {'role': 'assistant', 'content': '牙床'}]}
{'messages': [{'role': 'user', 'content': '什么酒不能喝?'}, {'role': 'assistant', 'content': '碘酒'}]}
{'messages': [{'role': 'user', 'content': '什么车子没有轮?'}, {'role': 'assistant', 'content': '风车'}]}
每一行JSON数据包含的字段如下:
- messages键: 对象内部包含一个名为messages的键。messages 的值是一个列表,这个列表记录了对话的轮次。列表中的每个元素都是一个字典,代表对话中的一个“回合”或“消息”。每个这样的字典包含两个键:
- role: 指定消息发送者的角色,通常是 "user"(代表用户或提问者)或 "assistant"(代表模型或回答者)。
- content: 包含该角色发送的具体文本内容。
当我们有了一个优质的数据集时,我们就可以引导模型学习了
尽管LoRA技术降低了微调的技术门槛,但对于非专业开发者或希望快速验证想法的用户而言,实现LoRA微调仍涉及编程、环境配置、参数选择和训练监控等一系列步骤,构成了一定的挑战。为了让LoRA这项强大的技术真正普及,无代码/低代码的解决方案应运而生,旨在将复杂的微调流程简化为用户友好的图形化操作。硅基流动平台就是这样一个将LoRA微调流程进行极致简化和封装的AI开发与应用平台,它为用户提供了无代码的操作体验,让微调变得更加便捷。
六、硅基流动平台:让微调变得触手可及
我们可以通过硅基流动平台,实现LLM的微调。用户只需进入硅基流动的官方主页,注册登录后点击左侧工具栏的“模型微调”,并在页面中点击“新建微调任务”,就可以轻松开始微调之旅。接下来,用户需要填写微调的基础信息,包括任务名称、基础模型、微调数据集等。例如,任务名称可以填写为“脑筋急转弯微调”,基础模型选择DeepSeek-R1 7B的基础模型Qwen2.5-7B,微调数据集选择之前生成的data.jsonl数据集。验证数据集可以直接选择训练数据集的10%,用于评估模型微调的效果。最后,用户还可以自定义设置微调模型名称。
接下来填写微调训练过程中的参数。
在所有参数填写完成后,用户就可以点击“开始微调”,提交微调任务。完成训练后,用户可以在页面中看到微调后的模型信息,包括训练过程中保存的检查点。用户可以直接复制最终模型的标识符,作为模型名称进行调用。
接下来,通过这段代码即可实现与微调模型的交互:
response = client.chat.completions.create(
model="ft:LoRA/Qwen/Qwen2.5-7B-Instruct:用户ID:模型名称:任务ID-ckpt_step_16",
messages=messages,
stream=True,
max_tokens=4096
)
print("微调输出:")
for chunk in response:
print(chunk.choices[0].delta.content, end='')
输出结果:
芭蕉——老实巴交
结语:微调技术的广阔应用
微调技术不仅在脑筋急转弯这样的趣味任务中大显身手,更在众多专业领域有着广阔的应用前景。无论是医疗、法律还是教育,微调都能让模型更好地适应特定需求,提供更加精准和专业的服务。通过精心准备的数据集和合理的设计,我们可以利用微调技术为各个行业打造专属的“专家”模型,推动人工智能在更多场景中的深度应用。