【大模型应用开发极简入门】微调(一):1.微调基础原理介绍、2. 微调的步骤、3. 微调的应用(Copilot、邮件、法律文本分析等)

news2024/11/28 11:40:08

文章目录

  • 一. 开始微调
    • 1. 选择合适的基础模型
    • 2. 微调和少样本学习
      • 2.1. 对比微调和少样本学习
      • 2.2. 微调需要的数据量
  • 二. 使用OpenAI API进行微调
    • 1. 数据生成
      • 1.1. JSONL的数据格式
      • 1.2. 数据生成工具
      • 1.3. 数据文件的细节注意
    • 2. 上传数据来训练模型
    • 3. 创建微调模型
    • 4. 列出微调作业
    • 5. 取消微调作业
  • 二. 微调的应用
    • 1. 法律文本分析
    • 2. 自动代码审查-类Copilot
    • 3. 财务文档摘要
    • 4. 技术文档翻译
    • 5. 为专业领域生成内容
  • 三. 微调的成本

OpenAI提供了许多可直接使用的GPT模型。尽管这些模型在各种任务上表现出色,但针对特定任务或上下文对这些模型进行微调,可以进一步提高它们的性能。

一. 开始微调

假设你想为公司创建一个电子邮件自动回复生成器。由于你的公司所在的行业使用专有词汇,因此你希望生成器给出的电子邮件回复保持一定的写作风格。要做到这一点,有两种策略:要么使用之前介绍的提示工程技巧来强制模型输出你想要的文本,要么对现有模型进行微调。

本文对微调进行讨论。

 
微调的基本逻辑

  • 收集大量数据:对于这个例子,你需要收集大量电子邮件,其中包含关于特定业务领域的数据、客户咨询及针对这些咨询的回复。然后,你可以使用这些数据微调现有模型,以使模型学习公司所用的语言模式和词汇。
  • 微调后的新模型:微调后的模型本质上是基于OpenAI提供的原始模型构建的新模型,其中模型的内部权重被调整,以适应特定问题,从而能够在相关任务上提高准确性。

通过对现有模型进行微调,你可以创建一个专门针对特定业务所用语言模式和词汇的电子邮件自动回复生成器。

 

下图展示了微调过程,也就是使用特定领域的数据集来更新现有GPT模型的内部权重。微调的目标是使新模型能够在特定领域中做出比原始GPT模型更好的预测。

在这里插入图片描述

 

需要注意的是:新模型仍然在OpenAI服务器上

即使你使用自己的数据对LLM进行了微调,新模型也仍然保存在OpenAI的服务器上。你需要通过OpenAI API与新模型进行交互,而不是在本地使用它。

 

1. 选择合适的基础模型

在微调时,必须使用基础模型,而不能使用InstructGPT系列中的模型。

目前,微调仅适用于davinci、curie、babbage和ada这几个基础模型。这些模型都在准确性和所需资源之间做出了权衡。
 

开发人员可以为应用程序选择最合适的模型:

  • 较小的模型(ada和babbage)可能在简单任务或资源有限的应用程序中更快且更具成本效益
  • 较大的模型(curie和davinci)则提供了更强的语言处理和生成能力,从而适用于需要更高准确性的复杂任务。

微调后的专有能力

  • 上述模型不属于InstructGPT系列,它们没有经过RLHF阶段。
  • 通过微调这些基础模型,比如根据自定义数据集调整它们的内部权重,你可以针对特定的任务或领域定制模型。
  • 虽然没有InstructGPT系列的处理能力和推理能力,但是它们提供了强大的基础,让你可以利用其预训练的处理能力和生成能力来构建专门的应用程序。

 

2. 微调和少样本学习

2.1. 对比微调和少样本学习

模型是否进行了更新

  • 微调是指针对特定任务在一组数据上重新训练现有模型,以提高模型的性能并使其回答更准确。在微调过程中,模型的内部参数得到更新
  • 少样本学习则是通过提示词向模型提供有限数量的好例子,以指导模型根据这些例子给出目标结果。在少样本学习过程中,模型的内部参数不会被修改。

 

都可以用来增强GPT模型

  • 微调可以帮助我们得到高度专业化的模型,更准确地为特定任务提供与上下文相关的结果。这使得微调非常适合有大量数据可用的场景。这种定制化确保模型生成的内容更符合目标领域的特定语言模式、词汇和语气。
  • 少样本学习是一种更灵活的方法,其数据使用率也更高,因为它不需要重新训练模型。当只有有限的示例可用或需要快速适应不同任务时,这种技巧非常有益。

 

2.2. 微调需要的数据量

微调通常需要用到大量数据。可用示例的缺乏往往限制了我们使用这种技巧。

  • 简单任务:为了了解微调所需的数据量,可以假设对于相对简单的任务或仅需稍微调整的模型,通过几百个提示词示例才能获得相应的目标结果。当预训练的GPT模型在任务上表现良好但需要微调以更好地与目标领域对齐时,这种方法是有效的。
  • 复杂任务:对于更复杂的任务或需要更多定制化的应用场景,模型可能需要使用成千上万个示例进行训练。前述的电子邮件自动回复生成器正是这样一个应用场景。
  • 专业性强的任务:针对非常专业的任务微调模型,可能需要数十万甚至数百万个示例。这种微调规模可以显著地提高模型的性能,并使模型更好地适应特定领域。

ing

迁移学习是指将从一个领域学到的知识应用于不同但相关的领域。正因为如此,你有时可能会听到人们在谈论微调时提到迁移学习。

 
 

二. 使用OpenAI API进行微调

本节使用OpenAI API来微调LLM。我们将学习如何准备数据、上传数据,并使用OpenAI API创建一个经过微调的模型。

1. 数据生成

1.1. JSONL的数据格式

更新LLM需要提供一个包含示例的数据集。该数据集是一个JSONL文件,其中每一行对应一个<提示词:补全文本>对,如下示例:

{"prompt": "<prompt text>", "completion": "<completion text>"}
{"prompt": "<prompt text>", "completion": "<completion text>"}
{"prompt": "<prompt text>", "completion": "<completion text>"}
...

JSONL文件是文本文件,其中每一行表示一个单独的JSON对象。你可以使用它来高效地存储大量数据。

 

1.2. 数据生成工具

OpenAI提供了一个工具,可以帮助你生成此训练文件。

  • 该工具接受各种文件格式(CSV、TSV、XLSX、JSON或JSONL)作为输入,只要它们包含<提示词,文本补全,输出即可直接用于微调过程的JSONL文件。
  • 该工具还会验证数据,并提供改进数据质量的建议。

安装:当执行pip install openai时,该工具会自动安装。

终端使用此工具:

$ openai tools fine_tunes.prepare_data -f <LOCAL_FILE>

 

1.3. 数据文件的细节注意

  • 工具建议:该工具会提出一系列建议来改善最终文件的结果。你既可以接受这些建议,也可以不接受,还可以指定选项-q,从而自动接受所有建议。
  • 分为训练集和验证集:如果你有足够的数据,那么该工具会询问你是否要将数据分为训练集和验证集。这是一种推荐的做法。
    • 算法将使用训练集来微调模型参数。
    • 验证集则用于衡量模型在未用于更新参数的数据上的性能。
  • 示例审核:对LLM的微调受益于高质量示例,最好由专家审核。
    • 当使用已有数据集进行微调时,请确保对数据进行筛查,以排除具有冒犯性的内容或不准确的内容。如果数据集过大而无法手动审核所有内容,则可以检查随机样本。

 

2. 上传数据来训练模型

准备好数据后,需要将其上传到OpenAI服务器。OpenAI API提供了不同的函数来操作文件。以下是一些重要函数。

上传文件:

openai.File.create(
    file=open("out_openai_completion_prepared.jsonl", "rb"),
    purpose='fine-tune'
)

# 两个参数是必需的:file和purpose。
# 在微调时,将purpose设置为fine-tune。这将验证用于微调的下载文件格式。

此函数的输出是一个字典,你可以在id字段中检索文件ID。目前,文件的总大小可以达到1 GB 。

 

删除文件:

openai.File.delete("file-z5mGg(...)")

 

列出所有已上传的文件:

openai.File.list()

 

3. 创建微调模型

如下:微调已上传文件是一个简单的过程。

openai.FineTune.create(  
    training_file='',  # 给定数据集
    model='',  # 根据给定的数据集优化指定的模型
    validation_file='',  
    suffix=''  # 
)

主要的输入参数

字段名称类型描述
training_filestring这是唯一的必填参数,包含已上传文件的 ID。数据集必须格式化为 JSONL 文件。每个训练示例是一个带有 prompt 键和 completion 键的 JSON 对象
modelstring指定用于微调的基础模型。可选项有 ada, babbage, curie, davinci,或曾之前微调过的模型。默认的基础模型是 curie
validation_filestring包含验证数据的已上传文件。该文件中的数据将仅在微调过程中用来生成验证指标
suffixstring这是一个最多由 40 个字符组成的字符串,它将被添加到自定义模型名称中

该函数的响应

包含排队作业的详细信息,如作业的状态、fine_tune_id,以及过程结束时模型的名称。

 

4. 列出微调作业

可以通过以下函数获取OpenAI服务器上的所有微调作业

openai.FineTune.list()

# 结果是一个字典,包含所有微调模型的信息。

 

5. 取消微调作业

可以通过以下函数立即中断在OpenAI服务器上运行的作业:

openai.FineTune.cancel()

# 只有一个必需的参数:fine_tune_id。
# 该参数是以ft-开头的字符串,例如ft-Re12otqdRaJ(...)。
# 它是在使用openai.FineTune.create创建作业后获得的。
# 如果你丢失了fine_tune_id,那么可以使用openai.FineTune.list检索它。

 

二. 微调的应用

微调提供了一种强大的技术手段,有助于提升模型在各类应用场景中的性能。再次提醒,微调的成本比基于提示工程的技术更高,因此在大多数情况下并非必需。不过当需要使用它时,微调可以显著地改善效果。

1. 法律文本分析

场景

在这个案例中,LLM被用来处理法律文本并提取有价值的信息。这些文档通常使用特定的行话写成,这使非专业人士很难理解其内容。

微调

通过在特定主题的法律语料库上对LLM进行微调,或者针对特定类型的最终用户,该模型可以更好地处理法律文本,并在执行与该特定类型的最终用户相关的任务时变得更加熟练。

成果

通过微调可以使模型专门针对特定领域完成任务,或协助非专业人士参与法律程序。
使用大量数据微调LLM,以分析法律文本,使其能够更好地处理超出提示工程技术能力范围的细微差别

 

2. 自动代码审查-类Copilot

在这个案例中,微调可以帮助模型分析开发人员编写的代码,并提出改进建议。

  • 这需要在包含代码片段和注释的数据集上训练模型,使模型能够处理特定语言的语法、语义和最佳实践。
  • 请注意,这个案例类似于GitHub对Copilot的用法,该工具旨在通过实时提供对代码和整个函数的建议来帮助开发人员编写代码。

举例:
你可以使用微调来训练模型完成特定任务,比如代码审查,如下例子:

JSONL文件可以包含代码及相应的审查评论。这将帮助模型学习如何提供准确且相关的代码质量反馈。以下是一个例子。

{"prompt": "Review the following Python code:
    'def sum(a, b): return a + b\nresult = sum(5, '5')'",
"completion": "Type error: The 'sum' function is adding an integer
    and a string. Consider converting the string to an integer using
    int() before passing it to the function."}

 

3. 财务文档摘要

针对收益报告、财务报表和分析师报告等财务文档,经过微调的LLM可以生成简明、准确的摘要。

在与财务记录明确相关的数据集上微调后,LLM可以更准确地理解财务文档的术语和上下文。
这样一来,你便可以给模型提供一个包含财务文档及其理想摘要的JSONL文件。

比如,模型可以将央行关于上调利率的详细报告压缩成简洁而富有信息的摘要。要调整现有模型以获得更好的财务文档摘要,你需要拥有大量样本摘要。

{"prompt": "The central bank announced a 0.25% increase in the benchmark
    interest rate, citing concerns about inflationary pressures.
    This move is expected to affect borrowing costs for consumers
    and businesses.",
"completion": "Bank increases rate 0.25% for inflation worry. May
    affect people, business borrowing costs."}

 

4. 技术文档翻译

与少样本学习相比,使用微调后的模型来翻译技术文档可以显著地改善翻译效果。主要原因是,技术文档通常包含专业词汇和复杂的句子结构,少样本学习无法有效处理这种复杂性。

对于技术文档翻译的用例,该文件应该包括将技术文本翻译为目标语言的翻译内容

 

5. 为专业领域生成内容

一个经过微调的模型可以针对高度专业化的主题生成高质量、引人入胜且与上下文相关的内容。

微调模型可以显著提高客户服务聊天机器人的性能,使模型更好地理解和响应特定领域的客户查询。客户服务场景具备天然的优势,即容易收集典型客户服务对话的高质量问答集,通过用户反馈形成回路,再通过微调持续改进模型的响应质量。这使模型能够更准确地识别客户问题的本质,并提供合适的解决方案。比如,模型可以学习如何处理账户查询、故障排除或产品推荐等具体问题。

 

三. 微调的成本

使用微调模型的成本不低。你不仅需要支付模型训练费用,而且在模型准备好后,每次进行预测时需要支付的费用也会比使用OpenAI提供的基础模型略高一些。在我们撰写本书之时,费用如表所示,不过具体的费用会有所变化。

模型训练使用
ada每千个标记 0.0004 美元每千个标记 0.0016 美元
babbage每千个标记 0.0006 美元每千个标记 0.0024 美元
curie每千个标记 0.0030 美元每千个标记 0.0120 美元
davinci每千个标记 0.0300 美元每千个标记 0.1200 美元

作为比较,gpt-3.5-turbo模型的定价是每千个输出标记0.0020美元。可见,gpt-3.5-turbo模型的性价比最高。要了解最新的模型定价,请访问OpenAI的Pricing页面。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 Kotlin 多平台开发构建跨平台应用程序:深入探索 KMP 模板工程

用 Kotlin 多平台开发构建跨平台应用程序&#xff1a;深入探索 KMP 模板工程 Kotlin 多平台开发 (KMP) 是一种强大的工具&#xff0c;可用于构建跨平台移动、桌面和 Web 应用程序。它提供了一种统一的代码基础&#xff0c;使开发人员能够高效地针对多个平台开发应用程序。 KM…

解密有道翻译响应数据末尾出现乱码问题的解决方法

运行解密响应数据程序&#xff1a; D:\Python\Python311\python.exe E:\baichuan\youdaos.py {"code":0,"dictResult":{"ce":{"word":{"trs"D:\Python\Python311\python.exe E:\baichuan\youdaospdm.pyD:\Python\Python31…

ESP32s3与Lsm6ds3通信---i2c【开源】

接线 ESPS3&#xff0c;I2C的初始化 #ifdef __cplusplus extern "C" { #endif #define I2C_MASTER_SCL_IO CONFIG_I2C_MASTER_SCL /*!< GPIO number used for I2C master clock */ #define I2C_MASTER_SDA_IO CONFIG_I2C_MASTER_SDA …

鸿蒙轻内核A核源码分析系列五 虚实映射(5)虚实映射解除

虚实映射解除函数LOS_ArchMmuUnmap解除进程空间虚拟地址区间与物理地址区间的映射关系&#xff0c;其中参数包含MMU结构体、解除映射的虚拟地址和解除映射的数量count,数量的单位是内存页数。 ⑴处函数OsGetPte1用于获取指定虚拟地址对应的L1页表项数据。⑵处计算需要解除的无效…

【文献阅读】一种多波束阵列重构导航抗干扰算法

引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题&#xff0c;文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术&#xff0c;充分利用导航信号功率低于环境噪声功率的特点&…

Navicat平替软件汇总,各种数据库连接软件

文章目录 1、Navicat2、DataGrip3、Chat2DB4、DBeaver Community5、SQLyog6、beekeeper studio参考文档 1、Navicat 作者最喜欢的数据库连接软件Navicat premium 15安装教程报错解决办法 2、DataGrip 个人感觉界面作者就不喜欢&#xff0c;不爱用IDEA同一家公司出的下载地址…

线程池处理Runnable任务

1、线程池处理Runnable任务 1.1、ThreadPoolExecutor创建线程池对象示例 ExecutorService pools new ThreadPoolExecutor&#xff08;3&#xff0c;5&#xff0c;8&#xff0c;TimeUnit.SECONDS&#xff0c;new ArrayBlockingQueue<>(6)&#xff0c;Executors.default…

iOS/iPadOS18Beta是否值得升级体验?Bug汇总和升级办法分享!

苹果昨天发布了iOS/iPadOS18Beta更新&#xff0c;引入了诸多新功能/新特性&#xff0c;很多喜欢尝鲜的用户已经在第一时间进行了升级。 iOS/iPadOS18Beta目前存在不少Bug&#xff0c;建议暂时不要更新&#xff0c;轻则浪费装机时间&#xff0c;重则丢失相关数据&#xff0c;甚至…

【产品经理】ERP对接电商平台

电商ERP对接上游平台&#xff0c;会需要经历几个步骤环节&#xff0c;包括店铺设置等。 电商ERP对接上游电商平台&#xff0c;其主要设置为店铺设置、商品同步、库存同步&#xff0c;本次讲解下店铺设置应该如何进行设置&#xff0c;以及在设置过程中的可能出现的踩坑事项。 …

王德峰视频讲座,王德峰视频全部大全集,百度云百度网盘资源下载

王德峰教授的视频讲座其内容丰富、观点独到&#xff0c;深受广大学者和爱好者的喜爱。很多朋友想下载王德峰教授的讲座视频&#xff0c;今天我给大家分享一个下载王德峰教授视频的方法 搜索 “方圆资源网官网” 打开 “方圆资源网官网&#xff0c;找到王德峰教授的讲座 总之&a…

3D gaussian-splatting项目环境配置记录

1.前景 项目论文&#xff1a;https://arxiv.org/abs/2308.04079 GitHub项目下载地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting git clone时里面的子模块小项目会git不到&#xff0c;需要单独github下来&#xff0c;放入相应文件夹。 sibr_viewer…

GUI编程03-事件监听

事件监听是指当某个事件发生的时候干一些什么。 例如之前在关闭frame窗口时就写过一个window窗口监听&#xff0c;当点击左上角❌时调用System.exit进行程序关闭。 1.按钮监听 下面的例子是监听按钮Button被点击时触发的事件 同时我们将窗口关闭监听事件进行了优化&#xff…

【多线程】进程与线程

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 操作系统2. 进程2.1 进程是什么2.2 进程管理2.3 进程调度2.3 内存管理2.4 进程间通信 3. 线程3.1 线程是什…

Keepalived LVS群集

一、Keepalived案例分析 企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险 单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害 二、Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 支持故障自动切换&#xff08;Failover&#…

VLM训练——Trainer源码解读

本文将以LLaVa源码为例&#xff0c;解析如何使用Trainer训练/微调一个VLM。 1. 参数解析ModelArgumentsDataArgumentsTrainingArguments 2. 加载模型3. 加载数据4. 创建Trainer开始训练 1. 参数解析 VLM 和 LLM 相关训练框架都会引入 ModelArguments、DataArguments、Trainin…

高考志愿填报秘籍:个人篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

Linux环境各种软件安装配置

安装Java 官网 找个喜欢的版本 下载好了传到linux里&#xff0c;xshell的xftp直接拖过去就可以传 #安装rpm包管理 yum install -y rpm or apt-get install rpm #查找Java rpm -qa | grep java\|jdk\|gcj\|jre #卸载java rpm -e --nodeps jdk-1.8-1.8.0_401-10.x86_64 #安装 …

明基的台灯值得入手吗?书客、柏曼真实横向测评对比

近年来人们在工作、学习、娱乐等方面对电子设备的依赖程度也越来越高&#xff0c;长时间使用电子设备会对眼睛造成一定的伤害&#xff0c;如眼疲劳、干涩、近视等。人们对于能够缓解眼疲劳的照明产品的需求逐渐增加。护眼台灯能够更好地模拟自然光&#xff0c;提供更加柔和舒适…

AD24设计步骤

一、元件库的创建 1、AD工程创建 然后创建原理图、PCB、库等文件 2、电阻容模型的创建 注意&#xff1a;防止管脚时设置栅格大小为100mil&#xff0c;防止线段等可以设置小一点,快捷键vgs设置栅格大小。 1.管脚的设置 2.元件的设置 3、IC类元件的创建 4、排针类元件模型创建…

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …