随着大模型应用持续火热,应用门槛也越来越低,去年底开始我们利用少部分精力做了一些 AI 探索和实践,并完成了业务所在垂直领域答疑机器人产品的上线。这里主要从普通使用者的视角,把一边学习一边实践的过程记录下来,和大家一起学习交流。
本文定位无门槛。本文受众主要是入门玩家,但对大模型感兴趣想做一些小工具,或者在平常的业务工作中希望使用大模型来提效的读者。
背景
当前大模型的应用还是处于比较初期的阶段,以物流领域常见场景为例,可以看到一些行业常见要求和当前大模型能力有较多冲突,在这些业务生产环境应用之前,我们还是希望先在容错性较高的场景进行一些实践。因此我们尝试基于大模型来优化答疑机器人,为后续更多的深度应用积累实践经验。(下面的示例图片由大模型生成,仅供参考)
▐传统答疑机器人的痛点在大模型崛起之前,传统答疑机器人一般有两种模式:
1. 基于多级目录分类,让用户慢慢翻到想了解的知识。
2. 基于传统关键词检索方式,根据用户提问,在知识库中找到和用户提问相关的知识。
核心痛点是,不能快速准确找到用户想寻找的答案。
▐我们的目标由于我们答疑机器人受众不是C端普通用户,而是内部作业人员,因此机器人给出的回答在语气或者回答方式上不需要过多润色,但我们希望它具备以下一些特点:
1. 可以准确理解提问人员自然语言提问的语义给出标准答案;
2. 希望可以比较快速给出答案(比如5s之内);
3. 不希望答非所问,提供不属于我们业务范围内的回答,如果提问的问题确实没有答案,希望拒绝回答并引导到人工。
迭代过程
我们结合业内经验和自身诉求,大致进行了如下五个迭代,下面详细展开。
▐阶段一:向量搜索● 嵌入(Embedding)是一种向量化方法,把文本,图像,视频等数据转换为向量,同时特别强调保留数据之间的语义关系。比如“苹果”和“橘子”要比“苹果”和“太阳”的向量值更为接近(语义相似)。
● Embedding 模型服务:提供具体的Embedding能力的在线服务,可以直接调用 OpenAI,阿里云等远程服务,也可以本地部署。低成本试用可以尝试阿里云灵积。
● 向量数据库是用于存储和检索高维向量数据的数据库系统,特别擅长相似性搜索。低成本试用可以使用阿里云的 Hologres 数据库。
向量搜索可以类比我们传统的关系型数据库检索,只不过向量搜索是按照语义来进行相似度匹配搜索。
可以看到一端文本转为向量存在向量数据库中的字段展示,根据不同的Embedding模型维度也有不同,通常达到上千维。
向量搜索流程下图是一个简化版的向量搜索流程图,分为数据准备和在线推理两个部分:
1. 数据准备部分,需要把历史沉底的知识库数据清洗为多个QA问答对的格式,把问题,答案,问题对应的向量,存储在向量数据库。
2. 在线推理部分,先把用户提出的问题通过向量服务转为向量,在向量数据库中找到与该问题最为相似的一条数据,然后通过相似度阈值来判断用户提问的问题和数据存储的标准问题是否足够相似,来决定是否把对应的答案返回给用户。
效果分析假设有这样一个标准问答対:
Q:遇到不可抗力因素无法配送,如何操作?
A:1. 系统进行提报,详细步骤XXX
提问类型
现场提问
结果分析
长度和语义相似的泛化问题提问
不可抗力因素无法配送,该怎么办?
问题比较接近时,通过取向量距离最小的问题对应的答案,正确率较高
问题较长且看起来差不多但语义不同的问题提问
不可抗力因素比较难以配送,怎么办?
下雪封路了,不能作业该怎么办?
问题较长时,或者和标准问题类似但语义不同,纯靠向量无法很好地识别语义。导致错误率较高
不相关问题提问
今天天气怎么样?
拒绝回答的向量距离阈值不好把控
尝试下来,纯靠向量搜索的优势在于:对于原始问题或者细微修改的问题,可以比较快速、准确找到答案。
不足之处是:
1. 问题较长且多个问题语义相近时,准确率下降
2. 向量距离的阈值不好把控,对于无关问题的拒绝回答机制不好处理。
▐阶段二:RAGRAG是知识问答领域业内落地最多的实践,同时 RAG 也是应用很广且很容易上手的一种大模型应用方式。
RAG(Retrieval-Augmented Generation 检索增强生成):因为大模型本身没有垂域的知识,RAG其实就是把“查资料”和“写答案”这两个步骤结合在一起。先用检索系统找到一些跟问题相关的资料,然后再用大模型(类似于GPT)来编写一个详细的答案,来提高AI回答垂直领域问题的准确性。
RAG 就像让一个大学理科生(知识储备丰富的大模型)拿着初中生的历史课本做开卷考试(相似度检索),虽然他本来不会,但靠查资料准确率还可以(效果不错)。就算书上没有,他也可以凭借自己的本事写满试卷(存在幻觉)。
RAG流程下图是简化版本的通过RAG实现知识问答的流程图,可以看到,整体和第一阶段的向量搜索是比较类似的:
1. 在数据准备阶段,这里的原始数据可能是大量的文档资料,我们需要尽量清洗为统一格式的文档,每个文档都按照一定的规则进行分段。这里的分段规则和大小需要多次尝试,来保证最终的检索速度和总结效果。然后把分段后的知识向量化,存入向量数据库。
2. 在线推理阶段,首先要做的事情是把用户提问的问题从数据库中检索出N条相似的分段,作为下一步大模型总结的参考资料,然后大模型拿着这些资料按照要求,总结出一个答案给到提问者。
RAG上手目前业内有很多现成的产品可以快速体验RAG,整体可配置的交互和原理大同小异,推荐阿里云百炼的应用中心来进行相关操作。
平台对应的文档中心有详细的实践教程,在准备好基础文档的前提下,基本五分钟就可以搭出来一个智能体应用。以下用一个简单的示例演示下RAG流程和需要关注的点(以下相关截图来源阿里云百炼平台):
核心步骤:
1. 创建一个RAG智能体应用,主要关注模型选择,prompt(希望大模型怎么帮你总结),知识库,召回策略等。
2. 上传知识库,重点关注向量模型的选择,分段规则。
3. 在检索配置这里,设置召回类型和规则。
4. 测试问答效果
效果分析优势:
1.【正确率高】正确率基本可以达到90%以上。
2.【话术控制】回复话术可以根据prompt较为灵活的控制。包括期望的语气,回复格式等。
3.【兜底返回】可以控制知识库没有的内容拒绝回答,只是返回固定文案。
不足:
1. 耗时较长,经常一次完整回复需要10s以上
2. 按调用量产生调用费用,QPS较高时,费用也会较高
3. 因为允许大模型发挥,因此会存在幻觉的情况,也就是会有偶发的答非所问的case。
▐阶段三:SFT上面两种方案各有优劣,之后我们继续尝试了垂域模型微调技术,看看能不能训练出一个无所不知的垂直领域小模型。先贴一些相关的概念:
1. PT(Pre-Training预训练),使用大量机器和未标记数据,如GPT-4,Qwen2-7B等;
2. SFT(Supervised Fine-Tuning监督式微调),使用少量标注好的领域数据来训练基座大模型,来获得可处理专属领域任务的专有模型过程;
3. FFT(全参数微调),模型整个参数结构和权重会变,需要资源多,训练彻底,但容易过拟合和灾难遗忘;
4. lora微调(一种常用的部分参数微调方式),通过矩阵运算原理,只微调小部分参数,达到和全参数微调类似的不错效果;
5. Instruction-Tuning(指令微调),旨在提高对多种自然语言指令的多任务处理能力,训练数据要求特定格式。
SFT的过程就像一个家长教五岁(一个懂不少东西的小模型)的小孩背20篇古诗,背了三天发现还是不会(欠拟合),背了三个月发现挺好的(到位),可以倒背如流,背了三年,还是只会这几首(过拟合),不仅不会自己写诗(并没有理解诗的本质),而且 1+1 等于几都不知道了。(灾难性遗忘)
SFT流程一个SFT的简化版流程图如下所示,一般分为三块内容:
1. 构建数据,高质量的数据非常重要,数据量的大小和质量会极大影响最终模型的效果。
2. 模型微调和评测部分,是SFT最核心的部分,除了选择合适的大模型基座外,重点需要根据评测效果来多次调整训练所需的超参数,直到大模型表现达到自己的预期。
3. 模型部署阶段,可以根据评测结果,选择表现最佳的模型快照进行部署,来为后续提供服务。
SFT上手实践目前模型微调平台也有很多,这里使用阿里云百炼平台简单展示下核心步骤。(以下截图来源阿里云百炼平台)
1. 数据准备:
以知识问答机器人为例,这一步需要整理日常积累的原始问答数据,经过人工打标,转换为指令微调数据集的格式并上传到平台。
2. 创建微调的训练任务,重点关注基座模型,评测下来,小模型中,最新的qwen2-7B 表现较好。
3. 调整训练配置
一些比较核心的配置:
循环次数,表示模型看几遍训练资料,根据我们的目的来,测试下来,这里循环次数越多,模型泛化能力越差,但也更加稳定。学习率:模型开始更新参数时的幅度,可以决定是否学习到数据特征。批次大小:根据训练轮数选择合适的步数,保证一次完整的训练可以保存若干个快照。4. 等待训练完成观察日志,是否有loss(损失函数)跳跃过大,未收敛等异常情况。
5. 模型评测:选择刚才训练好的模型进行数据推理,可以人工评测,也可以利用更强大的大模型来进行评测。
6. 对推理数据打分,可以根据我们的要求来选择评测和打分方式,也可以借助平台能力完成打分。
比如可以写个脚本直接比标准答案完全一致也可以用评测大模型给评测结果打分7. 测评通过后,将模型部署到平台并进行测试,运维,服务提供等。
一些尝试下来的有效手段数据构造:
1. 通过人工 + 通义千问72B 等大模型同义改写问题来扩充训练数据数量以及让模型更好学习特征,进行了十倍扩充。
大模型改写:遇到不可抗力因素无法配送,如何操作?-> 遇到不可抗力因素无法配送,该怎么办?人工改写:遇到不可抗力因素无法配送,如何操作?-> 遇到大雪等特殊情况,不能作业了!2. 打乱训练数据中相似数据的顺序,防止学到顺序相关的错误的特征。
3. 是否有必要放大量无关的数据集?
这里还是和我们训练的期望效果来决定,如果我们希望模型回答稳定,且只希望它处理和训练数据相关的知识,不需要它的通用能力,那这里不需要混合数据训练。
微调:
1. 通过观察 loss 收敛曲线和测评效果;调整初始学习率和训练轮数;我们的场景下,一般会把最终loss收敛在0.1以下。
2. 尝试当loss曲线不再收敛时对应的快照作为最终的产出模型,避免过拟合。
评测 -- 构建丰富的评测数据集:
1.【是否欠拟合】先使用训练集数据进行推理评测,然后再试用改写后的相同语义的测试集进行推理评测,保证两者都有较高分数。
2.【是否过拟合】对和训练数据语义无关的问题进行评测,看是否答案是训练数据集内的。
效果分析实践下来发现的一些不一定对的认知:
1.【过拟合】经过sft,大模型的一些通用能力的遗忘和一些过拟合行为是经常会发生的,不需要完全避免,还是要根据我们的目标来。
2.【prompt】sft 的小模型,使用常见的提示词工程技巧 构造 prompt 提升作用不大,基本保证提问时和训练时的 prompt 保持一致即可。
3.【推理能力】可能和我们较少的原始训练数据(万条)和训练目标(保证准确率)有关,当前微调后的小模型比较难有举一反三的能力,所以构造多样化的训练集和评测集很重要。
优势:
1. 由于使用的 7B 的小模型,因此响应快,一般全量结果3s左右可以返回。
2. 准确率高:经过了完整的测评流程产出,只要提问和训练数据语义相关,就可以有较高的准确率。
缺点:
1. 有一定的微调和部署成本。
2. 对于未训练过的问题因为模型本身无法判断,因此会有乱回答的情况。
▐阶段四:多种技术结合使用1. SFT+向量数据库
希望微调后的大模型,对于未训练过的问题直接拒绝回答:
思路:如果SFT大模型返回的结果和向量搜索返回的前几条结果相似度不高,认为是未训练过的数据,直接拒绝回答。
2. RAG + SFT
将SFT后的模型作为 RAG 里的总结推理模型?--不可行,因为RAG部分的总结推理模型,用的是大模型的通用的总结能力,而不是QA问答能力,因此这里不适合使用经过QA训练数据微调后的模型。
命中 SFT 未训练过的问题时,跳转到 RAG 流程回答-- 综合考虑RAG强大的兜底能力和费用问题,可以根据我们的诉求选择性开启
于是有了让 向量搜索,RAG,SFT 各司其职来实现更好问答效果的实践,以下是一次问答的简化版本的流程图:
▐阶段五:工程优化1.【体验优化】丰富点赞点踩,图片和视频回答,展示相似语义问题列表等体验能力。
2.【自我迭代】数据清洗,模型训练部署等环节通过工程自动化实现模型的自我学习能力(大模型在快速发展,我们需要有快速微调模型并切换的能力,而且未来成本一定会降低)。
3.【数据沉淀】一线反馈数据,高质量人工答疑数据,统一沉淀为文档,作为后续数据资产。
结语
作为从事工程应用领域的开发,我们不能只根据“目前AI能做什么”来构建自己的产品,也要看到未来AI的发展方向,比如之前大家一致诟病的大模型推理能力较弱,于是我们看到很多很重的提示词工程和思维链模式来解决推理问题。但可能在推理方面的表现,很多很重的解决方案并不如最新发布的 OpenAI O1大模型。
可以预见的是,随着技术的发展,大模型的能力一定会越来越强,相关的调用成本一定会越来越低,对模型定制的确定性也会越来越好。除了保持学习实践之外,哪些才是工程应用真正需要沉淀的能力和方向,是我们需要思考的命题。
我的一个细胞蕴含着无限模型[得瑟][得瑟]