当前位置: 首页 > news >正文

产品经理的大语言模型课 03 - 定制自己的大语言模型

文章目录

    • 什么时候需要定制大语言模型
    • 提示词工程
    • RAG、知识库与文本嵌入
        • 在数据准备阶段
        • 用户提问与回答
    • 微调
      • 模型蒸馏
      • 适配器训练
    • 总结

什么时候需要定制大语言模型

在很多时候直接使用公共、通用的大语言模型无法满足需求,例如:

  1. 垂直领域专业化:医疗和法律等领域,知识高度垂直化,需要非常专业的知识
  2. 数据隐私与安全:某些数据只能本地部署,或者只能通过本地进行访问
  3. 深度业务集成:例如针对某个企业的具体业务数据
  4. 其他需要自定义输出的场景:例如品牌人格化、考虑宗教因素等

在这种时候,我们通常希望定制自己的大语言模型(或者说让现有的大语言模型学习新的知识),那么有哪些方法呢?这里对一些“定制”大语言模型的方法进行介绍。

提示词工程

在大语言模型(LLM)中,“提示词”(Prompt)是指用户输入给模型的一段文本,其实就是你输入给大语言模型的内容,这些内容用于引导模型生成期望的输出。
例如“帮我写一首诗”就是简单的提示词,我们可以在这个基础上做更多细化:

给我写一首七言律诗,气势恢弘,文风细腻,诗中需要描绘冬日大雪的夜晚,一名网约车司机的生活,表现他对生活的希望。

我们得到了输出

寒风凛冽雪纷飞,夜幕沉沉路渐微。
车影摇曳灯光冷,归人脚步踏冰回。
街头巷尾穿梭急,都市繁华梦境追。
纵使疲惫身躯倦,心怀希望暖意偎。
星辰闪烁照归途,明日阳光更明媚。

好的提示词需要遵循一些规则,例如避免模糊或笼统的措辞、为大模型做一些背景设定(例如你是一个学习能收,擅长把大段的课件整理成笔记)、指定输出的格式(请使用 markdown 的方式输出结果,内容不超过 500 字)。

“如何写提示词”,演变成了提示词工程(Prompt Engineering)。简单来说,提示词工程就是研究如何更好地“告诉”大语言模型你想让它做什么,从而获得更理想的输出。
通过提示词工程,可以使大语言模型更好地适应各种应用场景,从而扩展其应用范围。

通过“提示词”来做大语言模型的定制,通常是把一些检索到或者企业提供的文本直接输入到提示词中,并要求大语言模型在理解文本的基础上,完成输出,以下就是一个示例:

prompt = f'''
你是一个企业客服小助手,请学习以下内容,并根据这些内容作答

{knowledge}

如果客户产生了辱骂行为,请回答“感受到您的情绪不好,十分抱歉”
如果你检索不到内容,请回答“对不起,我还没有学习相关知识,可以为您转接人工客服”。
如果你检索到内容,请用简单、礼貌的方式来输出内容。
'''

通常来说大语言模型能够接收的上下文长度是受限的,因此提示词工程比较适合背景知识比较短的场景。
提示词工程的优点在于简单、高效,输入的上下文类似“短期记忆”,非常容易被检索到,相应的准确度会比较高(较少遗忘)。
至于缺点和限制,提示词工程会增加每次请求的上下文长度,或者说导致 token 数量增加,这一定程度上会降低速度,并增加成本,并限制了用户自定义 token 的数量。

RAG、知识库与文本嵌入

如果需要学习的背景知识太长了怎么办?从提示词工程的思路延伸下来,我们不难想到:

  1. 我们可以把所有背景材料都先存储起来
  2. 当用户提问时,我先在这些背景资料中进行检索,取出其中最有可能与用户问题相关的材料片段
  3. 把这些相关的片段作为这次提问的背景知识一起提交给通用大语言模型,并在这些背景知识中进行检索

这就好像开卷考试,为了提升答题效率,我们可以先给所有的参考资料进行“编号”,当遇到考题的时候,我们按照编号找到相关的材料,并根据材料答题。

为了实现这个效果,通常需要解决几个问题:

  1. 如何把所有背景资料进行存储,并方便检索
  2. 因为大模型有上下文长度限制,对于大段的材料,怎么进行切割
  3. 问题和相关背景资料应该如何关联

实际上这就是 RAG(Retrieval-Augmented Generation,检索增强生成)技术了。

在数据准备阶段

在这个阶段,我们要形成知识库:

第一步:内容的提取
把 pdf、word、网页 等文件中的文本和图片抽取出来,并进行“净化”,去掉杂乱的内容。
如果把扫描版 pdf 转成结构化文本,也有一些模型和工具,但最终构成知识库的还是一段段的文本。

第二步:大段文本的切割
因为大模型上下文长度的限制,我们需要把大段的背景资料进行切割,通常我们都希望把一个完整的小知识放到一段内容里

目前已经有的一些 RAG 的工具,都提供了知识库的功能,其中两个重要的参数,分别是块大小 (Chunk Size)和块重叠 (Chunk Overlap),指的就是我们切割的时候每个“小知识”有多长,以及每个小知识之间保留多少重叠。

第三步:让内容方便检索
回顾 上一篇 的内容,我们知道计算机无法直接理解文字,通常需要把文字内容编码成多维向量,并存储到数据库中。
当检索的时候,我们把用户输入的内容也用同样的算法进行向量化编码,再将输入的向量与数据库中的内容进行比对后,把“相似度”最高的几篇内容作为回答的背景知识进行提供。

这里就涉及到几个重要概念:

将知识进行向量化,也需要通过模型来完成,这个“模型”就是语义向量模型(Embedding),或者可以称为嵌入模型。
OpenAI 提供的嵌入接口,就是调用部署在云端的语义向量模型,把文本进行向量化编码,这就是文本嵌入

存储这些向量的数据库,就是向量数据库(vector database),并针对向量比对和检索进行了优化。

用户提问与回答

完成了上面的准备工作后,我们就完成了大语言模型的“定制”,在用户提问阶段:

  • RAG系统首先使用检索系统(例如,向量数据库)在外部知识库中查找相关文档。
  • 然后,RAG系统将检索到的相关文档与用户的问题一起提供给 LLM
  • LLM 利用这些额外的信息来生成更准确、更相关的答案。
  • 最终 LLM 根据检索到的信息,和用户提问,生成最终的答案。

微调

上边提到的两个方法,用户用来交互的大语言模型,本质上还是通用模型。如果用户希望真正拥有自己的模型,就可以使用大模型微调(fine-tuning),即在已经预训练好的大型语言模型基础上(基座模型,pre-training)投喂一些数据进行进一步的训练,形成真正自己微调后的模型。

微调的过程中,大语言模型中的各个参数被真正调整(可以理解为神经元之间的连接被重塑,形成新的记忆和反射路径)。

OpenAI 也提供微调的功能,通过用户提供语料和素材,例如问答对,完成模型的调整,并形成用户自己的模型。

模型蒸馏

众所周知,越复杂、越大型的模型,效果越好、准确度越高,但同时计算成本高、对设备要求也很高。
如果服务运行在移动设备和嵌入式系统中,资源受限,那么模型输出的结果,准确度就比较差。如何在资源受限的设备上,实现媲美大模型的效果呢?

于是就有人提出了**蒸馏(distillation)**的方法,这种方法的核心思想,就是将一个复杂、庞大的模型(称为“教师模型”)的知识转移到一个更小、更简单的模型(称为“学生模型”)中:

  • “教师模型”在训练过程中学到了丰富的知识,包括数据中的细微模式和类别之间的关系。
  • “学生模型”通过学习“教师模型”的输出,可以有效地继承这些知识,从而提高自身的性能。

蒸馏当然是一种微调的方法。能够实现模型的压缩。

适配器训练

大模型的参数非常多,如果直接在这个模型上进行所有参数的微调(类比于整个大脑的重塑)不仅速度慢,而且成本高昂。
正如人脑的学习可以对应在某一个皮层区域,我们也可以让整个模型中只开放一小部分用于微调,这样的训练速度就会有很大的提升,成本也会降低很多。

这些专门预留用于微调学习的模型组件,就是适配器(adapter),这种微调训练的方法,就是适配器训练(adapter training)

总结

最后,我们总结一下

特性提示词工程(Prompt Engineering)RAG(检索增强生成)模型微调(Fine-tuning)
基本含义通过优化提示词,引导模型产生期望的输出。结合外部知识库,增强模型生成的内容。使用特定数据集,调整模型参数。
工作原理设计清晰、明确的提示词,利用模型的上下文学习能力。从外部知识库检索相关信息,将其作为上下文提供给模型。使用特定任务的数据集,迭代更新模型的权重。
优势* 简单易用,快速迭代。
* 成本较低。
* 无需大量数据。
* 结合外部知识,提供更准确、实时的信息。
* 增强模型的知识覆盖面。
* 高度定制化,使模型更适应特定任务。
* 提升模型在特定领域的性能。
劣势* 受限于模型的固有知识。
* 对复杂任务的适应性有限。
* 依赖于知识库的质量。
* 可能增加系统的复杂性。
* 需要大量高质量的数据。
* 计算成本高,耗时较长。
* 可能导致过拟合或灾难性遗忘。
应用场景* 通用问答、文本生成。
* 快速原型开发。
* 需要实时信息或特定领域知识的场景。如:客服机器人、知识密集型问答。* 特定领域的专业应用。如:医疗、金融、法律等。需要模型具备高度专业性的场景。
成本较低中等较高
数据需求无需大量数据需要高质量知识库需要大量高质量的训练数据
灵活性非常灵活,快速迭代灵活,可以动态更新知识库相对较低,需要重新微调才能改变模型行为

相关文章:

  • Qt 驾校考试系统项目实现
  • AWS容器化部署指南
  • 【C++】特殊类设计
  • 【CXX】6.4 CxxString — std::string
  • 第十七:go 反射
  • Spring Boot中@Valid 与 @Validated 注解的详解
  • macOS 终端优化
  • 使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
  • 从0到1:JavaScript小白进阶之路
  • mapbox-gl的Popup的使用详解
  • 旋转位置编码(3)
  • HarmonyOS
  • Spring Boot 项目中使用责任链模式实现复杂接口解耦和动态编排(带示例)
  • 前端技术百宝箱
  • Tweak Power:全方位电脑系统优化的高效工具
  • MySQL 与 MongoDB 的区别
  • CAN总线协议攻防实战:从漏洞分析到攻击模拟
  • 衣联网的商品列表页面结构是怎样的?
  • 设计基于锁的并发数据结构_第六章_《C++并发编程实战》笔记
  • 新一代开源数字供应链安全审查与治理平台:悬镜源鉴SCA
  • 慢品巴陵,看总编辑眼中的岳阳如何书写“山水人文答卷”
  • 调查丨永久基本农田沦为垃圾堆场,整改为何成“纸面工程”?
  • 以军在加沙北部和南部展开大规模地面行动
  • 纽约市长称墨西哥海军帆船撞桥事故已致2人死亡
  • 俄乌直接谈判结束
  • 国寿资产获批参与第三批保险资金长期投资改革试点