1、当前大模型数字化应用开发的主流技术路线
世界上做大模型的人可以分成两类:一类是研发基础大模型的人,这类中不需要太多,研发出十几个基础模型可能就足够了;大多数人是基于一个基础模型去工业现场开发智能化应用。
第一,大模型如何基于私有的知识库去做问答?在工业行业里很典型的需求,可能90%的人都能想到这一点。
第二、大模型能不能基于数据库的实时数据去回答?例如当下我的设备情况如何,这需要结合数据库中最新的数据。
第三、还有更少的人会想到大模型能不能帮我画CAD图纸?或者能不能帮我生成一个3D模型?
以上的场景在理论上都是可以的,只是这些场景已经超越了我们最常见的对话模式,需要更多的智能应用开发工作。
2、这样一个递进的过程,大概分哪几个阶段或者是几种类型?
基于大模型的智能应用开发,有一个循序渐进的技术阶梯。从低到高,从简单的复杂,从不灵活到灵活,大概有这么几个阶段:
第一阶段,提示工程,或者叫指令工程。只对输入进行一些约束或者优化,通过重新组织问题去刺激大模型的神经元,让它产生更好的输出。虽然它还没有走到客制化的阶段,但这是后面几个阶段的基础。
第二阶段,私有知识库。原理上次直播也提到了,有一个外部的知识库,当用户提问的时候,通过向量的相似搜索的算法,能够把和问题最相关的几个语料作为问题的上下文,一起传给大模型。提示模板的动态提示技术类似写程序,先写一个“请根据以下材料作答:{}”,括号({})里的内容需要动态填入,这就是一个模板。私有知识库的内容搜出来以后,就填到括号的位置上。所以你问了一个五个字的问题,背后可能生成了几千字的提示词喂给大模型。
第三阶段,工作流(Chain)。通过把大模型交互和自定义逻辑结合起来,在自定义逻辑中可以访问外部系统,做任何加工,实现更复杂的场景。比如说让大模型结合外部数据库,或者调用信息化系统的API。
第四阶段,微调基础模型。前面的3个招儿都使了,效果还不尽如人意,就再把基础模型调一调,调完之后再叠加前面那3把武器一起用。
第五阶段,重新训练一个完整的大模型,最复杂、投入难度最大,一般情况下不建议。
作为工业企业去启动大模型或者基于大模型的智能应用开发,我们建议从第一阶段开始,逐步递进。
3、从第一阶段来看,如何更好地向大模型提问,有什么建议?
提示工程更多的是一些经验的积累。大模型出现了这么长时间,关注我们的受众可能每个人都和大模型至少对话过几次了,也积累了一些技巧。如果把大模型当成是一个人看,那怎么能把这事儿给你讲明白,你的输出会更符合我的期望?就跟带下属是一个感觉!于是有人总结了很多模板,比如写作任务或营销方案,这些任务的最佳实践应该什么?
好的提示词有一些共性的组成部分。首先必须有一个任务,你要完成什么事。第二个成分是给它的输入是什么,比如我的开头是今天天气真好,请你帮我续写一段话,今天天气真好就是输入。第三,为了得到更好的输出,还经常使用上下文,比如我要写一篇散文,大概多少字。这是一种上下文,能够帮助它更好的去生成。第四种,叫做示例,实在说不明白就举几个例子,把输入和期望的输出列举一下,就像排比句,大模型会类比输出。第五,做应用开发的时候,它并不是跟人聊天儿,而是跟程序打交道,就要求它输出特定的格式。例如输入一段快递地址,我要求它以JSON格式输出,其中包含address、mobile
phone和name三个字段,它就能理解并生成JSON。
这些元素有不同的排列组合,就会形成大家总结出来的不同模版,适用于不同的任务。和原来用关键字检索的体验不同,用大模型更强调交互,更自然的交流。提示阶段,大家可以勤快多试,搜索学习别人的经验,也可以把自己的经验贡献给大家。
4、熟悉了提示工程,第二阶段尝试引入行业的专有知识库,做一些行业信息融合,有哪些建议?
首先还是顺着提示工程的思维去想,从提示的角度来看,第二阶段我做的事是什么?举个例子,我问大模型XX是谁?它可能不知道。从提示角度来说,你不知道,我就把XX的简历从电脑里翻出来,粘给大模型说这是XX的简历,你先好好学习一下。再去问,请告诉我XX是谁?它就能通过投喂的语料去回答。
从提示角度来说,用了一个提示词的技巧叫上下文(context)。这个技巧让大模型具有了一个私有知识的能力。这是第二阶段原理从提示词角度的解释方式。
但是,难道每次问点什么都要从电脑里Ctrl
C + Ctrl
V给它才行吗?这不现实,那就要把它程序化。把我希望它掌握的这些知识都放到向量数据库里,再额外写一个程序。每次我问一个问题,让它帮我去数据库把相关信息搜出来之后,输入到大模型里,然后大模型就会回答了。这是第二阶段的基本原理。
如果我们把它变成一个项目的话,可以理解成两个阶段。
第一个阶段是行业知识的预处理加工融合,把它放到向量数据库里;第二个阶段,查询或者提问的时候,会先到向量数据库里去做一些匹配,再把匹配出来的相关信息封装,组成一个完整的提示词,送给大模型,大模型的结果再呈现给用户。
原理很简单,但是里面有一些类似向量这种名词,可能会对非技术人员造成困扰。通俗解释一下,向量是一段实际数据的一种数学表达方式,通过embedding(可以认为它是一种编码)把任何一段数据生成一个向量,也就是多维空间里面的一根带方向的线。
比如我在二维XY坐标上随便随手画一条线,从零点到任何一个点都是一个二维向量。然后我又画了第二根、第三根线,假设前两根线肉眼可见离得比较近,第三根线明显方向反了,我们就认为第一根线和第二根线的相似度比较高。
向量在数据空间也是类似的道理,向量化之后,它会用向量相似度的算法去搜,看哪些内容和你提的问题最相关。它通过相似度算法,去计算问题向量和可参考的数据库中哪些更匹配,然后把搜索结果作为上下文。
5、基于大模型的第二阶段应用中,影响反馈效果的因素有哪些?
一方面取决于事先准备的知识库有多好,另一方面取决于搜索精度有多高。
行业知识库的准备是一项精细化的工程,数据预处理会面临很多专业词汇的分词问题。例如变流器急停,是大家约定俗成的一种简称。类似缩写、同义词、近义词在数据库的数据加工过程中,做行业智能应用的人要去面对的很现实的工程问题。
向量的切分也有不同的粒度,词向量、句向量、段向量。还是以简历举例,简历实际包含了很多段落,有基本信息、工作经历、教育经历、荣誉等。把这些表达不同意思的段落尽量分成不同的向量,这样搜得会更精确。所以人工干预知识库的加工,工作量很大。
为什么要谈到搜索精度?比如说你有10万个向量,挨个对比效率很低,工程应用中用近似搜索,必然会造成一些精度的损失。对于应用来说,能理解到这个程度就可以了。如果有小伙伴致力于研究向量问题,可以继续钻研。
最后,处理过程当中,私有知识库的融入,大模型并不会动态地把它学习进去。外部调用不会改编模型的参数,我们提到的前三层应用都不会改变底层的参数。这种外挂的信息会存在短时记忆,过段时间就忘了。它只是用非常强的语言理解能力,在上下文中去学习,以更好的交互方式来呈现。
第三,与Agent(智能体)的配合度。这一步很关键。对话功能之外,把大模型融入到一个智能的流程,在流程驱动下,可能有关键步骤,需要大模型去产生一些关键的输出。在一个编程的环境下,这时与模型打交道的是一段程序,提示词的用法跟返回的格式都有一定的要求。当大模型没有这方面的能力产生正确的规划,就出不来相应结果。
第四是安全合规和道德素养。不能协助犯罪和违背公德。
从应用角度,主要取决于做哪些场景。当然也需要考虑大模型在社区的口碑如何、是否开源、版本收费问题及费用高低、对资源的消耗如何等等。
7、基于大模型的第三层应用,如何与其他系统实时交互?
例如,我问大模型,二号机组当前的运行状态是怎么样的?把这个问题拆解成两步走。
第一步,让大模型根据我提的问题帮我生成SQL查询语句。第二步,它在一个“助手”的协助下执行SQL语句,从数据库把结果拿回来。再去跟大模型进行第二轮交互,呈现相应结果。
原来问答都是一轮交互,这个例子中是两轮交互。在这个链里除了大模型以外,还有一个“助手”角色去驱动流程的进行,也就是我们要开发的智能应用。
调用外部API的方式也类似。如果把思路打开,很多的工业场景和系统之间就可以关联起来了。大模型打开了一扇窗,用上面的方式,可以让大模型能跟所有的外部系统去打交道,产生无限可能。
在这种场景中,我们认为大模型它是一个“大脑”,只是提供想法,同时由应用程序来补全它的“手和脚”,让它触达外部系统和数据。这些“手”、“脚”和“大脑”封装起来就是一个智能应用。