有关bad case的修复,我之前是写过一个小系列,从开始的发现问题到最终解决问题,给大家带来了一条龙的解决方案(这里放最后一篇的连接,其他的这篇里面都有传送门,心法利器[40] | bad case治疗术:解决篇),随着现在算法的版本更新,大家进入了大模型时代,当然也要面临类似的问题,我们是需要解决bad case的,这次给大家介绍一下大模型在这块的修复方案策略。
懒人目录:
- 微调和结构升级
- 前处理和后处理优化
- 围绕模型进行的算法设计
- 前后处理服务于大模型
- 微调和结构升级
- 前处理和后处理优化
微调和结构升级
这应该是做算法的大家最容易想到,也是最“极客”的方式了,希望能把这个错误的结果,通过微调或者结构升级的方式,让模型能学到,快速提升效果。
首先,其中最简单的方式,就是把bad case交给模型学习,从而让模型快速学会,在大模型这个环境下,其实就是通过SFT的方式,让大模型学习到。
而相对复杂的,就是观察bad case的规律,定向找到更多样本,甚至是着手修改模型结构,让模型更容易学到某些信息,例如lora、Adapter等,甚至是其他的方法,这些方案的提出依赖对数据和模型的深刻理解以及前沿知识的储备。
前处理和后处理优化
在讲前处理和后处理的优化之前,想先说一下前处理和后处理是什么。
围绕模型进行的算法设计
比较成熟的模型模块,一般都会配合有前处理和后处理模块。尽管现在的模型已经发展到很前沿的水平,模型能帮我们做很多事,但是前后处理,仍旧在项目的逐步迭代阶段,会被慢慢建立起来,为模型更好服务于整个项目保驾护航。
前处理,即在进入模型之前所做的一系列处理,在NLP领域,可以有如下工作:
- 预处理,例如去标点、改写的一些工作,为了让模型更好地处理。
- 拒识,有些不需要经过模型就能完成的事,直接就先给做了,困难的、模糊的再来交给模型定夺。
当然,在大模型领域,前处理做的最多的就是根据输入,获取足够的信息,然后构造合适的prompt来解决问题,例如这样的。
请根据参考材料回答以下问题:
问题:{query}
参考材料:
{point_num}. {content}
我们需要检索出参考材料,也需要构造出合适的prompt,才能给模型提供足够的信息回答问题。
而后处理,则是指在模型结果输出后,要对结果进行再处理,例如下面这些工作:
- 对内容进行整合,例如分类后的卡阈值、模型召回后的过滤、最终结果返回的格式化等。
- 再加工。对结果进行解码(某种程度上文本生成后的解码其实也算后处理的:心法利器[89] | 实用文本生成中的解码方法)、小幅度调整等。
- 内容质检,检测是否有异常,是否有失败,为了解决异常而进行降级或者其他处理。
前后处理服务于大模型
在了解了前后处理的任务和功能后,就可以开始了解前后处理如何为大模型的bad case处理进行调优了。结合前面聊bad case修复大家反馈的问题,我这里尝试用例子的方式来给大家解释一下。
案例1:封闭域用户经常会输入一些领域外的内容,例如类似医疗之类的领域,用户还会在里面问到“今天天气怎么样”之类的,这类问题进入到我们的领域大模型肯定是有风险的,此时,比较容易的思路是,在大模型之前加一个拒识模块,只让大模型处理领域内的内容,这个拒识其实和早先搜索和对话场景的意图识别类似,用分类模型可以做到,当然也可以配合RAG对应的知识库划定知识范围。值得提醒的是,对于被拒绝的句子,记得设计好对应的回复话术,让用户得到完整的体验(别报了错就跑了)。
案例2:很多人提到的重复问题。模型在生成一小段以后,开始重复出现某个内容。这个问题的根源其实是在于解码层发现了某些得分很高的文段,所以就开始重复输出,要解决这个问题,最直接的方案,就是在解码层,使用有关重复的惩罚项,可以参考这个(https://huggingface.co/blog/how-to-generate),当然对应transformers中有关generate函数的文档里也有。这个解码层的处理,其实就算是在后处理中实现,这个应该是最直接高效的方案了。
案例3:话术上的调整。很多场景用大模型,对话术的要求会比较高,例如语言风格要古朴、热情等,或者是有一些字数要求,类似这些要求,其实在prompt层面进行修改,会比较方便,只要不是太小的模型,或者效果不太差,这种类型的指令还是会比较简单。当然了,指令的执行还是会有漏网之鱼,偶尔会失效,此时比较好的方案就是在后处理模块加质检模块,有些内容是可以比较轻松地检查到的,例如不能提及某些内容,直接在后面进行后处理删掉,或者把原有话术加上特定的要求让模型再生成一次,质量就能得到更高程度的约束。
从这些分析我们能够得到如下启示:
- 一定要多做实验多看数据多分析数据,上面这些问题能被发现,都离不开看数据的分析思考,而且要带着目标去看去想,只盯着指标是肯定不行的。
- 上下游的调整,对最终结果提升的反馈非常明显,是小幅度优化的重要策略。
- 围绕模型构造前后处理模块,能有效支撑模型应对业务,降低模型在训练、数据层面的多种压力。
方案优缺点分析
说完了方法,肯定是要做优缺点分析的,尤其是他们之间的差异性,以便我们后面进行方案选择的,这里我按照我的理解给大家分享。
模型微调和结构升级
首先是优点:
- 对大量、难以抽象、不可控的复杂问题,有显著的效果。
- 比较容易想到,pipeline简单,可构成自动化优化方案。
- 技术影响力。
然后是缺点,缺点也比较明显:
- 训练资源消耗大,成本高。
- 知识壁垒,需要对微调等技术有比较多的了解。
- 因为小问题就修改,容易对其他模块产生影响。
- 收益伤害不可控,无法高把握确定收益。
前处理和后处理优化
首先是优点:
- 小修小补效率高。
- 结果基本可控,立竿见影。
- 不容易对其他模块产生影响,可以分开处理。
- 节约资源。
然后是缺点:
- 依赖对问题、数据的理解,对新人不友好。
- 补丁多了,前后处理会变得厚重。
- 技术影响力。
小结
本文主要给大家介绍了有关大模型bad case的修复方案,笼统地分为了微调结构升级和前处理和后处理优化两个思路,主要是为了方便大家进行结构化思考和思路启发,并给出一些案例让大家进行方案的理解,最后还给出一些各个方案的优缺点,为大家在方案选型上提供一些帮助。
我是朋克又极客的AI算法小姐姐rumor北航本硕,NLP算法工程师,谷歌开发者专家欢迎关注我,带你学习带你肝一起在人工智能时代旋转跳跃眨巴眼