垂直领域大模型落地思考

相比能做很多事,但每件事都马马虎虎的通用大模型;只能做一两件事,但这一两件事都能做好,可被信赖的垂直大模型会更有价值。这样的垂直大模型能帮助我们真正解决问题,提高生产效率。

本文将系统介绍如何做一个垂直领域的大模型,包括继续预训练,领域微调数据构建,减缓幻觉,知识召回多个方面。也会介绍整体的系统设计,并串讲一系列相关的论文和产品。

图片

背景

通用大模型的尴尬

图片

「你会为一个闲聊的玩具买单吗?」

虽然2023年以来几乎很多公司都发出了自己的通用大模型,但是都还停留在“开放闲聊”阶段,这种泛娱乐的方式是不能带来实际生产力的。所以,以“开放闲聊”为产品形态的ChatGPT,“尝鲜“的流量在6月达到巅峰之后,就开始了出现下滑。

图片

「大模型不能只会开放闲聊」,人们需要的是能实实在在解决问题,提高生产力和工作效率的工具。

图片

例如我们需要一个能帮助写SQL的大模型,这个模型能跟专业的数据工程师一样,准确地给出可信赖的SQL语句,让人们放心的在生产环境执行。如果模型没理解人们的意图,或者不会写,也能进行拒识,而不是“强行”给出一个错误的SQL。

这就要求大模型能忠实于领域内的要求,同时克服“幻觉”,严谨准确地进行作答。当下作为通才的通用大模型很难有这样的能力。

垂直大模型产品

基于上面的思考,开始涌现出越来越多的垂域大模型,这些模型只针对一个特定的领域,甚至只能针对一两个场景。但是已经能初步的产品化落地,不再是一个只会「闲聊的玩具」,开始真的帮人们在解决问题。

下面是一些垂直领域大模型产品化的例子:

法律大模型 法律大模型具备提供基础的法律咨询,完成简单的法律专业文书写作等功能。 https://github.com/PKU-YuanGroup/ChatLaw (北京大学)

图片

医疗大模型 医疗大模型能给人们进行问诊,并支持多模态的输入。 https://www.jiuyangongshe.com/a/dvb0030135 (医联)

图片

教育大模型 多邻国的教育大模型能提供语言学习上的支持,例如答案解析,学习内容规划等。 https://blog.duolingo.com/duolingo-max/ (多邻国)

图片

金融大模型 金融领域大模型数量众多,基本的应用场景也围绕金融的日常工作,例如研报解读等。

图片

垂直大模型基本套路

参考通用的大模型的训练流程,可以得出垂直领域大模型的基本套路。

图片

  • Continue PreTraining: 一般垂直大模型是基于通用大模型进行二次的开发。为了给模型注入领域知识,就需要用领域内的语料进行继续的预训练。

  • SFT: 通过SFT可以激发大模型理解领域内各种问题并进行回答的能力(在有召回知识的基础上)

  • RLHF: 通过RLHF可以让大模型的回答对齐人们的偏好,比如行文的风格。

需要注意的是一般垂直领域大模型不会直接让模型生成答案,而是跟先检索相关的知识,然后基于召回的知识进行回答,也就是基于检索增强的生成(Retrieval Augmented Generation , RAG)。这种方式能减少模型的幻觉,保证答案的时效性,还能快速干预模型对特定问题的答案。

所以SFT和RLHF阶段主要要培养模型的三个能力:

(1) 领域内问题的判别能力,对领域外的问题需要能拒识 (2) 基于召回的知识回答问题的能力 (3) 领域内风格对齐的能力,例如什么问题要简短回答什么问题要翔实回答,以及措辞风格要与领域内的专业人士对齐。

下面本文将从继续预训练,领域微调数据构建,减少幻觉,知识召回四个方面进行具体的介绍。

继续预训练

重要的一步

通过继续预训练能给通用的大模型注入领域知识,领域内的专业词能更充分的学习。这部分只需要准备领域内的语料即可,然后进行LLM任务的继续训练。

图片

科技大模型Mozi[1]在arXiv的4B语料上进行了继续的预训练。可以看到继续预训练之后在领域内数据上的PPL会明显减少(6.95 -> 3.46),同时在下游任务上相比没有预训练也有明显的提升(0.38 -> 0.52)。

混合数据

如果想要领域的模型还具备一定的通用能力,即通用的能力不会退化(或者灾难性遗忘)这就需要在语言模型训练的时候混杂通用的数据。

例如度小满提出的XuanYuan[2]金融领域大模型,在Bloom基础上进行继续预训练。训练数据包括了通用数据以及领域内的数据。

图片

值得注意的是XuanYuan在训练的过程中还采用了hybrid-tuning的策略,即将预训练的数据(通用+金融领域)以及指令微调的数据(通用+金融领域)混合一起进行训练,而不是拆分成继续预训练+指令微调两个阶段,这样模型能很好回答金融领域的问题,也能保持对一般问题的作答_(论文中的说法,还没有对比实验支撑)_。

如果足够有实力也是可以不基于通用大模型进行二次预训练的,而是直接从0训练一个领域大模型,金融大模型BloombergGPT[3]就是这么做的。如果从0进行训练,那就一定要混合通用语料了,这能让模型学习到基本的语言语法,世界常识。可以看到BloombergGPT的训练数据中有近一半的数据(48.73%)都是通用领域的数据。

图片

要不要从零训

个人观点是垂域大模型可以不用从零开始训练。

回顾人对知识的理解:小学中学都在学习通用领域的知识,然后大学阶段继续进一步学习特定领域的知识。所以在通用模型的基础上继续二次预训练注入领域知识是合理的。

但是如果想通过二次预训练进行语言层面的迁移就会比较难,没有从零开始训练好。回顾人对语言的学习,如果刚“出生”时候就在学习一门语言,进行听说读写的训练,这就是母语了。会比长大以后再去学习一门外语要容易的多,效果也要好很多。所以基于llama做的中文适配 不如 纯中文训练的baichuan 在中文任务上效果好。

领域微调数据构建

领域微调的核心是构建高质量大规模的领域微调数据。让人去收集一个领域内的语料是容易的,但是让人去编写领域内的微调指令和回答是很难的。下面介绍的方法都是来尝试解决这个问题。这些方法的核心都是基于一些已有的数据+GPT4,然后生成领域内的微调数据。

数据生成方法已有数据生成数据
Self-Instruct一些单轮/多轮的种子数据单轮/多轮指令微调数据
Self-QA文档数据单轮指令微调数据
Self-KG知识图谱单轮指令微调数据

Self-Instruct

Self-Instruct[4]是一种微调数据扩充的方法。如果已经一些种子微调数据(大约100条),可以通过Self-Instruct+GPT4进行扩充,生成更多相对符合要求的微调数据。

步骤

Self-Instruct整体流程如下:

图片

一条微调数据包括三个部分:指令,输入 和 输出。下面具体介绍如何生成这三个部分。

首先从种子指令(人工编写的指令/业务侧积累的问题)中随机选择一些指令,然后让GPT4参考这些指令,生成一系列类似的指令。

图片

有了指令后,再让GPT4判断这个指令是一个“分类”问题还是一个“生成”问题。后面会采用不同的答案生成策略。

图片

如果一个问题是“分类”问题,则采用“output-first”的生成方式,即首先生成输出(具体哪个类别),然后再根据指令和输出,生成输入。例如指令是:“判断下面句子的情感是消极还是积极”,首先生成输出的类别:“积极”,然后再根据指令和类别生成输入的句子:“我今天很开心”。

图片

如果一个问题是“生成”问题,则采用“input-first”的生成方式,即首先生成输入,然后再根据指令和输入,生成输出。例如指令是:“将下面的句子翻译成英文”,首先生成输入的句子:“我今天很开心”,然后再根据指令和输入生成输出的答案:“I am happy today”。如果一个指令不需要输入的句子,则输入为空。例如指令:“有哪些减肥的运动?”

图片

经过上面的步骤就能初步获得一批微调数据,还需要进行进一步的过滤。例如过滤与已有数据相似度很高的结果,过滤明显低质的结果(指令过长或者过短)。

过滤后的微调数据就可以继续加入“种子指令”中,以此循环,源源不断地进行生成。

分析

图片

如上图所示,分析表明,通过这种方案自动生成的指令数据:

  • 数量够大:仅基于175条种子数据可以扩充8.2万条新数据

  • 足够多样:分类和生成指令的占比大概4:1;指令的动作也非常多样,包括写作,设计,创造等;指令之间的相似度也不高,长度分布也较合理

  • 质量可接受:采样标注生成的数据可以发现92%的指令都有意义,尽管输入和输出的质量不是很高,但是大部分还是格式正确或者部分正确的,这也能对训练模型遵循指令有一定的帮助。

图片

以上是这种方法生成的可用数据。

图片

实验表明,通过在生成的指令上对GPT3进行微调(通过OpenAI的微调API),可以让GPT3达到逼近InstructGPT的效果,如果进一步混合标注的微调数据集则可以超过InstructGPT效果。另外,生成的指令数据数量越大效果越好,用于数据生成的底座模型越强大效果也会越好。

多轮

对Self-Instruct中的prompt进行调整,也可以基于Self-Instruct生成多轮的对话数据进行微调。例如Mozi[1]中的做法:

图片

Self-QA

如果连基础的种子指令数据都没有,那就不适于Self-Instruct的方法了。这时候可以尝试Self—QA[5]的方法,直接从文档中生成指令数据。整体的流程如下:

图片

基本的思想是:首先根据无结构的文档通过GPT4生成可能的指令,然后输入指令和对应的文档再让GPT4生成问题的答案。这里的文档可以直接就是文档语料,也可以从结构的表格数据或者图谱数据中生成无结构的文档数据。

图片

基于设计的Prompt就可以让GPT4分别进行指令和答案的生成,由此构成指令微调数据。这些数据还需要进一步通过启发式和规则的方法进行过滤,来提高数据的质量。

图片

上图是一个具体的例子。基于上述微调的数据对模型进行微调,可以让模型在特定的场景上优于通用模型。

Self-KG

如果一个领域已经有了高质量的知识图谱,也可以直接基于知识图谱生成指令数据。这种基于知识的指令数据生成方法是HuaTuo[6]中提出的,本文称为Self—KG。

具体而言,首先需要有一个知识图谱,如下图所示,包括节点和属性关系。

图片

然后从知识图谱中采样一条知识,包括这个知识的全部属性,再设计prompt让GPT4基于这则知识生成指令数据。

图片

减缓幻觉

这里我们将探讨如何让大模型的生成结果减缓幻觉,同时如何检测幻觉,并在后处理阶段进行消除。

Generate with Citation

图片

研究“Enabling Large Language Models to Generate Text with Citations”[6]中显示:通过给大模型相关的知识进行参考,并且让模型在生成中附上引用的标注,能提升模型的回答质量,减少幻觉。

让模型输出引用还有一个好处:用户自己可以通过提供的参考快速判断回答对不对(参考不能太长)。这样即使回答错了,用户也能自己知道,相对可控。

作者的分析表明,回答的质量与召回文档的质量有很大关系,这部分还有很大的提升空间。如何提升知识召回的质量我们在后面会重点分析。

Factual Consistency Evaluation

如前文所说,用户可以根据提供的参考快速判断回答是否正确。我们也可以直接训练一个模型来做这样的判断。如果幻觉检测模型判断生成的内容与参考相矛盾,就可以在后处理的阶段对回答进行二次处理。

这个任务叫:事实一致性评估(Factual Consistency Evaluation)[7],属于自然语言推理任务Natural Language Inference(NLI)的一种。具体是给定一个前提知识和一个猜想,判断这个猜想与前提知识的关系,是包含,无关,还是矛盾。

图片

如上图所示,事实一致性评估在很多NLP任务上都有用,包括摘要,转写,基于知识的问答等。所以基于这个任务的数据集(例如Adversarial NLI),可以训练一个评估的模型(例如T5),从而实现对大模型生成的内容进行评估,检测是否在“胡说”。

知识召回

为了减少回答的幻觉,保证时效性,会先召回相关的知识帮助模型进行回答。Langchain中对这部分有很多实现,包括基于关键词的字面召回,基于相似度模型的语义召回等。

但是实际落地就会发现召回的质量往往较差,下面介绍一些具体的优化方案。

DPR

这里根据问题召回相关的文档,本质不是一个相似句子召回问题,因为文档中的回答跟答案的相似度可能是很低的。所以这里应该建模成Dense Passage Retrieval(DPR)[8]问题,即根据问题召回能回答问题的相关文档。

图片

如图所示,在DPR是一个双塔结构,会有两个独立的编码器分别对问题和文档进行编码。在训练的时候是一个对比学习的loss,即让不相关文档的点积近可能为0,相关文章的点积近可能为1。科技大模型Mozi[1]就是在科技领域的DPR监督数据上训练一个DPR模型进行知识的召回。

GTR

GeneralizableT5-based dense Retrievers(GTR)[9]是相对DPR效果更好的方法。

图片

如图所示,直接采用T5对问题和文章进行编码,同样也是对比学习的loss。需要注意的是这里问题和文章是同一个编码器。

图片

进一步分析可以发现,随着模型尺寸的增大效果也会越来越好,这种方法也优于DPR。当然因为参数量更大了,推理速度也要比DPR更慢。

Keyword LLM

在专业的垂直领域,待检索的文档往往都是非常专业的表述,而用户的问题往往是非常不专业的白话表达。所以直接拿用户的query去检索,召回的效果就会比较差。Keyword LLM就是解决这其中GAP的。

例如在ChatDoctor[10]中(下图),会先让大模型基于用户的query生成一系列的关键词,然后再用关键词去知识库中做检索。ChatDoctor是直接用In-Context Learning的方式进行关键词的生成。

图片

我们也可以对大模型在这个任务上进行微调,训练一个专门根据用户问题生成关键词的大模型。这就是ChatLaw[11]中的方案(下图)。

图片

Context Rewriting

再进一步思考多轮的场景,如果直接拿用户当前的问题去检索就会面临信息缺失的问题。例如:

User:"中国的首都是哪里?"
Bot: "中国的首都是北京"
User: "那里有哪些景点?"

此时直接拿“那里有哪些景点?”去做检索,肯定会召回很多无关的内容。用户真实的问题应该是:“北京有哪些旅游景点?”。

所以在多轮的场景中做知识召回需要先整合当前问题和对话历史,然后对当前的问题进行改写,使其能成为一个“独立问题”,然后再用改写后的“独立问题”进行知识检索。这就是Context Rewriting。

这个任务有一些现成的数据集,例如下面的Restoration200K[12]:

图片

对于多轮场景下的完整问答任务(问题改写+知识召回)也有相关的数据集,例如下面的Orca,标注了每个问题需要召回的文档以及基于文档的回答。

图片

Knowledge Selection

还需要思考需要召回多少个文档,如何过滤,如何排序?

图片

Mozi[1]中的实验表明,一个问题的回答,往往分布在多个段落中,更多的召回有助于给出更综合的回答。但是随着召回文章的上升,回答的召回率提升,但是不相关的片段也更多,会导致精确率下降。召回3-4个文档是较优的折中方案。

同样我们也可以利用大模型对召回的结果进行二次的精排(过滤)。例如下图ChatDoctor[9]中的方案,编写prompt让模型在召回的文档中选择对回答问题有帮助的文档。

图片

对于召回文档的排序,一个经验的方案是相关性更高的文档离问题的位置更近。

思考

基于上面的讨论,垂直领域的大模型需要基于检索系统进行构建,不是一个单单的大模型而是一整个系统。

下面是阿里云提出的系统,包括问题解析,知识召回和推理求解三个模块:

图片

下面是ChatLaw[10]的系统架构,包括Kyeword LLM 和 ChatLaw LLM两个大模型和一个召回模块。

图片

但这也还是不够,距离能产品化还有很大的距离,还有很多的corner case没有解决,例如:

  • 如何拒识领域外的问题?如果不能回答,如何优雅的失败?

  • 对于长文档的切分,太长的文本编码效果比较差,太短就需要能召回多个文档块,如何选择?

  • 当前是基于文档的来生成答案,答案中很多内容都是从文档中直接COPY,能否对这种COPY类生成进行加速?

  • 领域内一般有自己专业的工具,例如制造业中的工程计算软件,大模型如何与这些工具打通?

  • 如果一句话中有多个问题要怎么召回?例如:“自闭症有哪些症状?跟遗传有关吗?能被治愈吗?”

  • 大模型确实容易产生幻觉,但是如果“幻觉”出来的内容是对的,就会很惊喜,我们更愿意称之为模型的“泛化”能力。如果一味减缓幻觉是不是也会让模型丧失泛化的能力?

大模型的产品化落地一定会有很多的挑战,相信会被一个个解决。期待大模型超级应用的出现!

「道路是曲折的,前途是光明的」

参考文献

  • [1] Mozi: A Scientific LLM Technical Report

  • [2] XuanYuan 2.0: A Large Chinese Financial Chat Model with Hundreds of Billions Parameters

  • [3] BloombergGPT: A Large Language Model for Finance

  • [4] SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions

  • [5] SELF-QA: Unsupervised Knowledge Guided Language Model Alignment

  • [6] Enabling Large Language Models to Generate Text with Citations

  • [7] TRUE: Re-evaluating Factual Consistency Evaluation

  • [7] HuaTuo (华驼): Tuning LLaMA Model with Chinese Medical Knowledge

  • [8] Dense Passage Retrieval for Open-Domain Question Answering

  • [9] Large Dual Encoders Are Generalizable Retrievers

    [9] ChatDoctor: A Medical Chat Model Fine-Tuned on a Large Language Model Meta-AI (LLaMA) Using Medical Domain Knowledge

    [10] ChatLaw: Open-Source Legal Large Language Model with Integrated External Knowledge Bases

    [11] Improving Open-Domain Dialogue Systems via Multi-Turn Incomplete Utterance Restoration

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript脚本操作CSS

脚本化CSS就是使用JavaScript脚本操作CSS,配合HTML5、Ajax、jQuery等技术,可以设计出细腻、逼真的页面特效和交互行为,提升用户体验,如网页对象的显示/隐藏、定位、变形、运动等动态样式。 1、CSS脚本化基础 CSS样式有两种形式&…

学习笔记:CANOE模拟LIN主节点和实际从节点进行通信测试

先写点感想,在LIN开发阶段,我一般用图莫斯USB工具来进行模拟主机节点发送数据。后来公司买了CANOE工具就边学习边搭建了LIN的测试工程,网上的资料真的很少,主要是靠自己一点点摸索前进,总算入门。几个月后的今天&#…

基于swing的人事管理系统

概述 个人项目人事管理系统,针对部门和人员之间的管理。 详细 一、项目UI 二、项目结构 三、项目使用方法 Eclipse导入现有现有项目到工作空间即可,会自动加载包内相关jar包,使用的java源文件 四、部分代码 MainFrm.java package view…

Docker指定容器使用内存

Docker指定容器使用内存 作者:铁乐与猫 如果是还没有生成的容器,你可以从指定镜像生成容器时特意加上 run -m 256m 或 --memory-swap512m来限制。 -m操作指定的是物理内存,还有虚拟交换分区默认也会生成同样的大小,而–memory-…

ubuntu系统黑屏,且光标不闪烁

选择第二个,进入恢复模式 选择第二个,进入恢复模式 选择root 输入: startx然后就可以进入文本界面或者图形化界面了,如果不行,报错,可能需要需要下载这个包,把这个错误到网上搜索一下就可以找…

批量迁移redis实例的key

我们知道migrate 命令可以迁移redis的多个key,但是如果redis的key有非常多,那用起来就很不方便了。 所以下面分享一个脚本来实现批量key的迁移,主要使用的命令为dump和restore 脚本如下: #!/bin/bash redis-cli -h host1 -p 63…

Redis被攻击纪实

一、前言 声明:本文仅供技术交流使用,严禁采用本文的方法进行任何非法活动。 上周新来的同事分享Redis的原理和机制,想起2017年的时候测试环境Redis被攻击,最后只能重新安装服务器,今天试验一把利用Redis漏洞进行攻击…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式,它通过线上和线下的融合,提供更加便捷的购物体验。其中,O2O指的是线上与线下的结合,通过互联网平台与实体店面的结合,实现线上线下的互动和协同。线上商城则是指通过互…

AI优秀企业案例——机器人流程自动化:达观数据RPA

通过学习业内领先公司的最佳实践,我们可以更好地将它们应用到我们自己的公司和业务中。特别是第三部分,提供了大量应用案例,让我们一起期待看到这些案例的结尾。 1.简介 达观数据是一家专注于智能文本机器人的国家高新技术企业,…

Leetcode-面试题 02.02 返回倒数第 k 个节点

快慢指针:让快指针先移动n个节点,之后快慢指针一起依次向后移动一个结点,等到快指针移动到链表尾时,慢指针则移动到倒数第n个结点位置。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …

矩阵等价和向量组等价的一些问题

什么是向量组?答:向量组是由若干同维数的列向量(或同维数的行向量)组成的集合。什么是向量组等价?答:两个向量组,各自拼成矩阵A和B,向量组等价就是三秩相等,即r&#xff…

点信息标注_BillboardTextActor3D

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题:点附近创建左边或其他信息,且信息面板显示状态不受相机缩放、旋转影响 prj name: BillboardTextActor3D #include…

STM32笔记—定时器

目录 一、TIM简介 二、基本定时器(TIM6和TIM7) 1. TIM6和TIM7简介 2. TIM6和TIM7的主要特性 3. TIM6和TIM7的功能 3.1 时基单元 3.2 计数模式 3.3 时钟源 三、通用定时器 1. TIMx(2、3、4、5)简介 2. TIMx主要功能 3. 时钟选择 4. 影子寄存…

计算机视觉驾驶行为识别应用简述

一、什么是计算机视觉识别? 计算机视觉识别是一种基于图像处理和机器学习的人工智能应用技术,可以用于多个场景。常见应用场景包括人脸识别、场景识别、OCR识别以及商品识别等。今天以咱们国产系统豌豆云为例,为大家梳理一下在车辆驾驶行为中…

在Google Kubernetes集群创建分布式Jenkins(二)

上一篇博客在Google Kubernetes集群创建分布式Jenkins(一)-CSDN博客我介绍了如何在GCP的K8S集群上部署一个分布式的Jenkins,并实现了一个简单的Pipeline的运行。 在实际的开发中,我们通常都会按照以下的CICD流程来设置Pipeline 在我司的实际实践中&…

如何让群晖Audio Station公开共享的本地音频公网可访问?

文章目录 1. 本教程使用环境:2. 制作音频分享链接3. 制作永久固定音频分享链接: 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station: 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…

9.spark自适应查询-AQE之动态调整Join策略

目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量,Spark join 如果能采取这种策略,那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…

vue 子页面通过暴露属性,实现主页面的某事件的触发

目录 1.前言2.代码2-1 子页面2-2 主页面 1.前言 需求:当我在子页面定义了一个定时器,点击获取验证码,计时器开始倒计时,在这个定时器没有走完,退出关闭子页面,再次进入子页面,定时器此时会被刷…

linux基础:3.linux基础环境开发工具和配置。

linux基础环境开发工具和配置 一.学习yum工具进行软件安装:1.什么是yum:2.查看软件包:3.安装和删除:4.yum生态: 二.vim的使用:一.快速介绍一下vim二.vim正常模式:2-1:命令模式1.光标…

1、C语言面向对象引入类和对象的概念

什么是类和对象 类 类是用户自定义的一种数据类型&#xff0c;也称类类型——C语言中的结构体 对象 类的一种具象 代码测试 #include <stdio.h>//类 struct Animal{ char name[12];//成员属性 int age; char sex; void (*peat)();//成员方法 void (*pbeat)(); };void…