6
【AppBuilder知识库应用调优】如何让大模型听你的话!——应用「王者荣耀英雄档案」
AI原生应用开发/技术交流
- 千帆杯挑战赛
- Prompt
6月19日9026看过
在人工智能的浪潮中,大模型以其强大的处理能力和丰富的知识库,成为了许多开发者和企业实现智能化转型的关键工具。然而,如何让把AI引入到我们实践工作中呢,知识库就是一种最常见,最容易上手的场景。就先做个知识库应用来学习学习。能来这里看文章的相信你已经对AI,对AI原生应用已经有所理解了。如果你对大模型、RAG、知识库、向量数据库、AI agent 没有一个概念性的了解的话,建议你到你手机的视频软件里搜索一下相关的视频,快速学习一下。
我自己学习AI相关知识也没有多久,把自己的开发过程中的一点点经验分享出来供大家讨论,有不对的地方,请大佬们多多指教。正如我上面提到的,在经过一段时间的疯狂学习AI知识之后,对这些模型、RAG、知识库、向量数据库、AI agent等等,有了一定的理解,正想自己试试手,在一个视频中得知百度《千帆杯挑战赛》提供了AI原生应用的开发平台。耗费将近三天的时候开发了这个应用。
应用名称:王者荣耀英雄档案
欢迎大家体验,如果感觉还可以欢迎点个赞支持👍,感谢!
进入上方比赛链接,找到王者荣耀英雄档案,右下角即可点赞~
创意
看到本次常规赛的题目是 知识库/数据库 ,首先确定要做一个基于【知识库】的应用,然后就想能把什么数据装到知识库呢?经过多一段时间的冥思苦想,最总锁定王者荣耀中的英雄档案。首先,这个数据很好获取,直接从官网爬。其次数据结构化非常清晰,而且数据量不大。用于练手非常适合。(由于这个思路出发点是选合适的数据,就注定这个应用其实没有什么实际意义,主要价值还是个人练练手。还请大家不要见笑😜。如果大家要做一个好的应用,还是应该从解决问题和用户的需求出发)
需求分析
这里说一下我想要实现的效果:
-
-
当用户要查询某一个英雄的档案的时候,大模型需要从知识库中查询这个英雄的信息,按知识库的内容展示给用户。
-
当用户想看档案中的某一项信息的时候,大模型就把知识库中的这个英雄的,这一下信息展示出来。
-
严格按知识库来回答
-
搭建知识库
看一下导入知识库的界面,总共有三种方式,三种方式。三种方式我都简单试了。
首先是第三种直接读取url,我把各个英雄的主页逐个复制进去,然后就发现url最多支持10个。直接放弃(没有试效果)
第二种尝试用文本直接导入,这种方式没有太理解它的分片逻辑,尝试了自定义的切分策略,可能是哪里没有用对。对分片的结果依然是不满意。
第三种,一问一答,一个问题就是一个分片。这种显示非常符合我这个知识库的场景,直接把用户可能问的问题都预设好。所以开始我就对我这个知识库很有信心。(接下来就是一通python操作)
这里跟大家分享几个经验点:
-
-
一个问题,或者说一个切片的大小是有上限的,应该是1200个字符,如果一个问题超过了上限,在文件导入的时候就会报错。
-
这种方式,在知识库检索的时候,应该是按你设置问题,进行检索的。这点很重要,用户的问题跟你导入知识库的这些问题,越接近匹配度就越过,这个问题(这个切片)就会被召回。这就对咱们问题的设计要求比较高了。
-
要对知识库进行多次命中测试,根据测试的结果来设置,召回的匹配度和召唤切片的数量,具体设置看下面的截图:
-
-
-
这个召唤的匹配度是个经验值,太低找回的内容太多,没有办法保证大模型会采纳你期望的答案。这时大模型的表现就很不稳定,同样的问题多次尝试,结果完全不同。(这让我这种搞编程的很崩溃,这也是为什么我要跟大家分享【如何让大模型听你的话】的原因)
-
还有这个召唤数量,并不是越多越好,首先我猜测,所有召唤的内容都会当作输入,连同我们的问题一起喂给大模型。一方面会增加了大模型在众多信息种找到最适合的难度,降低响应速度。另一方面还会消耗我们更多的token哦。
-
要准确的召唤我们预设的那个最佳答案,就要求我们在问题设置上下功夫。还是用我自己这个知识库为例:
-
-
最初我的问题设置是这样的:
-
-
-
赵云的英雄档案是什么
|
赵云的铭文推荐
|
赵云的出装建议
|
赵云的英雄关系
|
赵云的英雄故事
|
赵云的历史上的TA
|
每个英雄我都设置了六个问题,开始我为了让检索更方便,开始的思路是把问题打散,每个问题只包含很少的内容。
又因为我看最大召唤数是6。就想着问题太多就无法全部召唤(其实当时的想法是不对的,上面咱们已经说过召唤不是越多越好)。
英雄档案这个问题里包含了很多属性,包含 技能、简介、皮肤 等等
如果用户的问题里没有提到档案,而是想查看英雄的技能,比如 “赵云的技能有哪些?” 就无法成功召唤
-
-
-
后来我进行了优化:
-
-
赵云的英雄档案是什么(包含技能和简介)
|
赵云的铭文推荐
|
赵云的出装建议
|
赵云的英雄关系
|
赵云的英雄故事
|
赵云的历史上的TA
|
在档案的问题了增加(技能和简介)这样对于上面的问题就可以解决了。
-
-
-
再后来我我发现用户往往只会输入英雄的名字,这样就没有办法成功匹配到档案,跟这个英雄相关的问题,匹配的很接近。
-
-
我没有想到特别好的办法,只好把英雄档案的问题换了一个问法,问题就是英雄的名字,档案与英雄档案的内容一样的。效果还不错。
我这个知识库重建过好几次,目前的效果还不错,但是任然有优化的空间。如果大家有好的建议欢迎分享,大家互相学习。
角色指令优化
终于轮到跟大模型对话了。创建好了知识库就迫不及待的发问验证了,开始确实感觉挺“神奇”,大模型这么聪明啊,问题回答的很有好吗!但是随之更深入的验证就会发现很多问题,就明显的问题就是,同一个问题答案不一样,甚至相差很大。如果一个问题,你不知道标准答案你问他一次,可能回答看上去还算可以。但是你有预期的标准答案,你就发现大模型“太不听话了”,明明都从知识库里检索到了正确答案了,还能给出各种“花样”的回答。(尤其是程序员们根本无法接受的😄)
直觉告诉我是时候使用“魔法🪄”了。一个多礼拜的AI不是白学的,一定是要在“角色指令”的地方,增加设定,大模型才能按你的设定进行回答。于是各种尝试,这个过程确实有点难受,主要问题还是咱不知道怎么表达大模型才能按要求去做。(不如咱们写代码控力那么强,很不适应)。先看过图,就是我红框框住的地方:
过程就不再唠叨了,还是分享几个小的经验
-
首先像知识库的这种场景,咱们希望用咱们预设的标准答案来回答用户的问题,就在“角色指令”提要求:“你要将提供给你的信息进行整理,不得篡改或增加英雄档案的信息。”不用客气,直接告诉他,不能改。——提要求
-
还是我自己应用的例子,加上限制,好了一些,但是还是不稳定,他还是对一些信息进行了省略,(太顽皮!)没有办法我只能一点点再给他提出更具体的要求,比如我发现他在给出英雄技能的时候总是只说技能名称,我就增加一条:“在描述英雄技能时,详细给出 被动技能、技能1、技能2、技能3 包括技能的冷却值和消耗”。效果好很多了,果然就不敢擅自做省略了。——细化要求,不行就再细化
-
后来我又发现,在回答英雄档案的时候多个属性经常一行打印,效果不佳,我就增加一条“档案中的各项属性要纵向排列展示,这种方式会更清晰易读。”——格式也可以提要求
-
说一个场景的场景,查看某个英雄的档案,然后可能用户会继续发问,比如他的皮肤啊、他的出装啊等等,这时候就隐含了一个人称的替换。“他的出装”到知识库里没有办法搜索到正确的答案。要让大模型知道这里的他是谁,看一下我给他的提示:“ 关注用户提到的英雄名字,若问题中未提及,则引用用户上文中提到的英雄,直至用户提及新的英雄。”确认大模型可以领会这个意思,在知识库搜索的时候会替换成英雄的名字——可以支持逻辑处理
-
这里我再分享一个我认为非常有意义的经验,还是从实际的场景出发,用户经常是上来就给一个英雄的名字。于是我就告诉大模型,“当用户只告诉你英雄的名字,就表示用户想要查询这个英雄的英雄档案。你要把英雄名字拼成‘xxx的英雄档案’,然后查询知识库”。经过多次尝试,在用户第一次输入英雄名字的时候,这条提示不会生效。后来我通过了解知识库问答的流程,明白了这条提示肯定是无法执行的。我看看这流程图就明白了,我们的问题会先到知识库里检索,然后才会一起给大模型处理,所以肯定是没有办法做到的。——第一个问题的解锁大模型无法对问题进行加工
-
还有就是如果召唤多个切片,大模型会综合各个切片的内容,选择对符合问题的答案来回答。但是还是尽量给他最准确的那一个。——优质的知识库和巧妙的问题设计至关重要
好了,今天就总结道这里吧,有不对的地方,还请大家多多指教。
最后,希望大家能为我的应用点赞,感谢🙏
评论