打造领域专属的大语言模型

简介: 大模型虽擅长自然语言处理,但在专业领域常表现不足。微调通过利用特定领域的数据,在已有大模型基础上进一步训练,能显著提升模型的专业表现,同时有效控制成本。微调前需确定领域、收集并格式化数据;过程中涉及数据上传、模型训练及状态监控;最后通过验证测试评估效果。此法既经济又高效,特别适合中小型企业及个人用户。

6e6dd611edfa13f9da7b741115c82a4.jpg

简介

大模型具有生成和理解自然语言的强大能力,但在专属领域中,通用模型往往表现不尽如人意。为了解决这一问题,越来越多的人希望能够使用基于专业或行业领域的大语言模型,以提高回答问题的准确性。

从零开始训练一个大模型所需的算力、成本以及数据质量和数量的要求都非常高,因此并不适用于所有人。

然而,我们可以选择在已有的大模型(例如GPT系列)上进行微调。微调是指在已经训练好的大模型的基础上,使用专业领域的数据进行进一步训练。通过在原有大模型的基础上添加专业领域的数据,可以对模型进行微调,从而减少大模型出错的概率和降低模型出现幻觉的次数。这种方法不仅能够显著提升模型在特定领域的表现,还能够在一定程度上控制成本,是一种切实可行的解决方案。

image.png

微调模型的优点

  1. 赋予大模型新的数据

微调允许我们在已有大模型的基础上,加入特定领域的新数据,从而增强模型在该领域的知识和表现能力。例如,通过加入医学领域的数据,模型可以更准确地回答医学相关的问题。

  1. 帮助大模型修正错误信息

通用大模型在某些专业领域可能会出现错误或不准确的信息。通过微调,我们可以利用高质量的领域特定数据来修正这些错误,从而提高模型的准确性和可靠性。

  1. 微调成本可控

与从零开始训练一个大模型相比,微调所需的资源和成本大大降低。微调只需要在已有模型的基础上进行进一步训练,这使得微调的成本和算力需求更容易计算和管理,对于中小型企业和个人用户来说尤其实用。

微调前的准备工作

在开始微调之前,需要确认微调的方向并收集相应的专业知识,以便模型能够学习该领域的专业内容,这样,经过多次微调后,模型才能给出令人满意的结果。需要包含如下步骤:

  1. 确定微调方向:明确希望模型在什么领域表现出色(例如,医学、法律、金融等)。
  2. 收集数据:收集该领域的专业知识和数据,确保数据的准确性和全面性。
  3. 准备数据格式:
    • 整合数据,使其符合 OpenAI 可接受的格式,即一组演示对话。
    • 对话应包括希望在实际使用过程中出现的相应类型。
  4. 格式化对话
    • 数据需要符合 Chat Completions 的消息格式。
    • 每条消息应包含角色、内容和可选名称。
    • 添加预期和辅助消息,帮助模型提供更理想的响应。

可微调的模型如下:

  • gpt-3.5-turbo-0125(推荐)
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613
  • babbage-002
  • davinci-002(实验)
  • gpt-4o-2024-05-13

数据示例格式如下:


{
   
   "messages": [{
   
   "role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {
   
   "role": "user", "content": "What's the capital of France?"}, {
   
   "role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{
   
   "messages": [{
   
   "role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {
   
   "role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {
   
   "role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{
   
   "messages": [{
   
   "role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {
   
   "role": "user", "content": "How far is the Moon from Earth?"}, {
   
   "role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

模型微调过程

示例文件下载:点击下载 jsonl 文件

在准备好数据之后,就可以开始模型的微调。主要分为以下几个步骤:

  1. 上传数据

上述准备好的数据可以保存进jsonl文件,主要在这个文件中,每行都是完整的一条json数据,即每一行都是完整的一次对话。使用文件 API 上传文件,以便与微调作业一起使用。


from openai import OpenAI
client=OpenAI()
client.files.create(
    file=open('<jsonl文件路径>','rb'),
    purpose='fine-tune'
)

一次上传文件的大小最大为 1G,但是不建议使用这么大的数据量进行微调,上传文件需要时间并且不太可能需要那么大的数据量才能看到改进。

  1. 微调模型

确保数据集上传正确后,就可以创建微调作业,可以通过界面化或者编程的方式来创建微调作业。示例如下:


from openai import OpenAI
client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-abc123", # 训练文件上传到 OpenAI API 时返回的文件 ID。可以使用后缀参数自定义微调模型的名称
  model="gpt-3.5-turbo" # 要微调的模型的名称
)
  1. 查看微调状态

使用上述创建微调任务后,一般情况下会有一个等待微调成功的时间,可以使用以下的 API 随时查看微调的结果:


# 检查微调任务的状态
job_retrieved = client.fine_tuning.jobs.retrieve('ftjob-abc123')
# 列出存在的10条job
client.fine_tuning.jobs.list(limit=10)
# 列出微调中的10条事件
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", limit=10)
# 删除一个微调的模型
client.models.delete("ft:gpt-3.5-turbo:abc276")
  1. 模型验证与测试

等待模型微调成功后,即可直接调用该模型进行测试,为了方便看出差异,可以同时调用 gpt-3.5-turbo 和微调后的模型并且询问同一个问题,便能看出微调的效果:

completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
   # 修改调用的模型类型
   # model="<微调后的模型>",
    messages=[
        {
   
   "role": "system", "content": "<给出系统角色需要提前给出的提问背景信息>"},
        {
   
   "role": "user", "content": "<用户提问的问题>"}
    ],
   #  控制生成文本时的随机性
    temperature=0.7,
   #  生成的响应数量
    n=1,
   #  用于终止生成的令牌列表或字符串。
    stop=None
)
# 打印看出答案
print(completion_fine.choices[0].message.content)

微调后数据的评估

为了完成对模型的微调,需考虑到一次微调的结果很可能不如预期,因此可以通过不断调整训练数据集来提高模型输出的质量。具体可参考内容如下:

检查现有示例:

  1. 确保训练示例包含响应所需的信息:每个示例应明确并充分地涵盖预期地回答内容,确保模型有足够的信息来生成准确的响应。
  2. 查看训练示例中的一致性:确保所有示例在格式、语调和结构上保持一致,以便模型能从中学习到统一的风格和逻辑。
  3. 确保所有实例都使用相同的格式:一致的格式有助于模型更好的理解和学习。

追加新的示例:

  1. 收集预期不对的示例:将模型输出的预期不正确的示例收集起来,并将修改后的预期回答作为新的训练示例,补充进下一次微调的数据集中。
  2. 检查现有示例:根据回答的内容判断示例是否存在语法、逻辑等问题,确保每个示例都是高质量的。
  3. 考虑数据地平衡性和多样性:不同类型的回答应该均衡分布,并且包含各种不同类型的内容,以确保模型在各种情境下都能生成适当的响应。

总结

  • 微调的概念
  • 微调的优点
  • 微调前的准备工作
  • 模型微调过程
  • 微调后数据的评估
相关文章
|
搜索推荐
Gitlab----设置页面语言为简体中文
Gitlab----设置页面语言为简体中文
6880 0
Gitlab----设置页面语言为简体中文
|
7月前
|
存储 人工智能 搜索推荐
保姆级教程:OpenClaw阿里云/本地部署多 Agent,“一个人=24小时在线 AI 团队”,附20个实用案例
OpenClaw并非普通的AI聊天工具,而是一套可嵌入日常工作流的开源AI助手框架,核心价值在于“长期进化”与“多场景闭环执行”。它能通过配置文件定制身份与行为,依托本地记忆系统越用越懂用户,更能连接多渠道终端,将分散的工作流程整合为可持续运行的自动化系统。从定制CRM、会议闭环管理到代码安全审查、食物过敏追踪,OpenClaw能覆盖20+高频场景,真正成为个人与轻量团队的“全天候AI团队”。
2811 2
|
5月前
|
弹性计算 数据挖掘 测试技术
阿里云服务器带宽怎么选?1M/3M/5M/10M价格介绍与选购省钱技巧
本文介绍了2026年阿里云服务器带宽的计费方式与选购策略。阿里云提供固定带宽(包月/包年)和按流量计费两种模式,带宽独享且价格随档位非线性增长。以热门的经济型e实例(99元/年,3M固定带宽)和通用算力型u1实例(199元/年,5M固定带宽)为例,详细对比了1M至10M带宽的年付成本差异。文章建议用户根据业务流量模型合理选配,优先通过官方活动入口购买以享折扣,善用优惠券实现折上折,并选择"续费同价"产品保障长期成本可控,避免因初期选择低带宽而导致后期付出更高升级代价。
|
存储 安全 C++
Odoo 安装方式选择:源码安装 vs Docker
Odoo部署常采用源码编译或Docker容器化,但分别面临依赖复杂、版本风险和服务化难题,以及镜像臃肿和扩展受限的问题。Websoft9提出混合方案,融合两者优势:通过智能环境适配、三阶段部署流程(环境预检、混合模式选择、持久化配置)及声明式YAML配置,实现高效、灵活的双模运行时。此方案显著降低依赖冲突解决时间(从83分钟至0),生产环境构建耗时缩短至8分钟,并达100% CVE漏洞修复率,适合ERP定制开发与规模化部署的企业需求。
|
11月前
|
JSON 程序员 开发者
‌Notepad++ 8.6:轻量级开发者的效率加速器!详细安装教程,附安装包
Notepad++ 8.6 是一款免费开源的轻量级代码编辑器,支持80+语言语法高亮与代码折叠,采用Scintilla内核,运行高效。支持插件扩展、跨文件搜索、正则替换及多编码转换,适用于编程开发与文本处理。
853 0
|
机器学习/深度学习 人工智能 数据可视化
一文讲透:信息化、数字化、智能化、智慧化、数智化,到底啥区别?
本文深入解析了企业数智化转型中的关键概念——信息化、数字化、智能化、智慧化与数智化,厘清它们的内涵与发展脉络。信息化重在流程系统化,数字化强调数据价值释放,智能化实现自动分析与预测,智慧化推动系统协同决策,而数智化则是数字与智能能力的融合升级。通过清晰的阶段划分与实际案例,帮助企业认清自身转型阶段,明确下一步方向,避免盲目跟风,真正实现提质增效的可持续发展。
|
消息中间件 JavaScript 安全
HarmonyOSNext性能核弹:用Node-API引爆ArkTS/C++跨语言
本文介绍HarmonyOS Next中通过Node-API实现ArkTS与C++的跨语言交互,适合教育科普学习。内容涵盖三步核心流程:C++模块注册(开店准备)、接口映射(设计菜单)及ArkTS调用(点外卖)。重点包括SO库命名规则、线程安全规范及实战示例(如两数相加)。附带血泪经验总结,助你掌握丝滑跨语言调用技巧。
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
1025 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
存储 C语言
C语言中a 和&a 有什么区别
在C语言中,&quot;a&quot; 是一个变量的名字,代表存储在内存中的某个值。而&quot;&a&quot; 则是获取该变量的内存地址,即变量a在计算机内存中的具体位置。这两者的主要区别在于:&quot;a&quot; 操作的是变量中的值,&quot;&a&quot; 操作的是变量的内存地址。
2798 23
|
存储 监控 安全
云存储的安全性:保护你的数据的技术探索
【8月更文挑战第8天】云存储的安全性是保障用户数据安全的重要基础。通过数据加密、访问控制、多副本备份、网络安全和物理安全等多种技术手段,云存储服务提供商能够为用户提供安全可靠的存储服务。然而,用户也需要加强自身的安全意识和管理措施,共同维护云存储环境的安全稳定。
1668 2