打造政务智能问答助手
场景介绍
大模型(LLM)通过对海量公开数据(如互联网和书籍等语料)进行大规模无监督预训练,具备了强大的语言理解、生成、意图识别和逻辑推理能力。这使得大模型在智能问答系统中表现出色:用户输入问题后,大模型依靠其强大的意图理解能力和从大规模预训练语料及通用SFT中获得的知识,生成准确而全面的回答。然而,依赖通用大模型自身知识来回答问题,在某些垂直领域应用中会面临挑战:
- 通用大模型的原始训练语料中针对特定垂直领域的数据较少,导致在这些领域的问答表现不佳。
- 某些垂直领域拥有大量高价值的私有数据,但这些数据未被通用大模型吸纳。
- 大模型在训练完成后难以快速有效地更新和补充知识,导致其在面对强时效性知识时,可能提供过时的回答。
当前,大模型对于私域数据的利用仍然面临一些挑战。私域数据是由特定企业或个人所拥有的数据,通常包含了领域特定的知识。将大模型与私域知识进行结合,将发挥巨大价值。私域知识从数据形态上又可以分为非结构化与结构化数据。对于非结构化数据,如文档,可以利用大模型+外挂检索库(如Elastic Search)的方式快速实现问答系统,称为检索增强生成(Retrieval Augmented Generation,RAG)技术方案。检索增强生成方案被大量用在智能问答场景中,也称为检索增强问答,如政务问答场景,行业客服智能问答场景等。
下面将以一个具体的政务问答助手为例进行说明。该场景通过收集政务问答数据和相关政务问答文档,基于检索增强问答框架,构建了一个智能化的政务问答助手。
上图给出了政务问答智能助手的整体框架。该框架由query改写模块、中控模块、检索模块和问答模块组成:
- query改写模块:针对多轮对话中经常出现的指代和信息省略问题,对用户输入的query做改写,将指示代词替换为实体词,并补充省略的context信息。基于改写后的query,再去调用中控模块以及检索模块,以便能够更好地检索出相关文档。
- 中控模块:对(经过改写后的)用户输入query,进行意图识别,判断是否是政务问答场景问题。如果是,则控制流程调用检索模块,并将检索文档传输给问答模块以辅助增强问答模块的能力;如果不是,则控制流程不调用检索模块。
- 检索模块:输入待检索的query,输出从文档检索库中检索出来的文档以及对应的相关性得分score,基于score做阈值判断,是否保留该检索所得问答。由于该场景是打造一个政务问答助手,其中,文档检索库可以放入政务文档数据。
- 问答模块:针对用户的输入,由问答模块最终输出。该模块具备多轮对话能力,输入前几轮对话,然后再输入新一轮的query,模型在回答最后一个query时能够利用到历史问答信息。该模块具备检索问答能力,针对输入的query和此query调用检索模块所得的检索文档,进行开卷问答(阅读理解),提取检索文档中的有效信息,完成问题的回答。
- 除了上述提到的四个模块以外,还需要一个编排流程的pipeline,将这些模块提供的API接口进行编排,串联query改写、意图识别模块、检索模块和问答模块。该pipeline负责接收前端用户输入的query和历史问答,逐步处理并最终输出答案,展示在前端界面。
- 在该框架中,query改写模块、中控模块和问答模块由大模型具体实现,因此涉及到大模型的训练、优化、部署与调用等流程。pipeline编排流程可以基于python代码实现,也可以人工模拟每一步的执行情况。检索模块可以使用Elastic Search来搭建,也可以利用外部web搜索引擎。在初步验证大模型效果时,可以假设检索出的文档完全相关,将其与query及特定prompt模板拼接后输入模型,观察输出是否符合预期。
选择基模型/基础功能模型
- query改写模块:盘古-NLP-N1-基础功能模型
说明:该模块用于对多轮对话中的省略和指代问题进行补全,对多轮对话中的query进行改写。当前query改写模块来实现训练和预测需要使用特殊的Prompt,需要注意保持一致。
- 中控模块:盘古-NLP-N1-基础功能模型
说明:该模块需要实现意图识别分类的功能。当输入意图识别模块的是政务问题时,控制下游调用检索模块;当输入不需要调用检索的非政务问题时,不调用检索,直接模型回答问题。实现方法为通过微调获得一个具有二分类能力的模型。
- 问答模块:盘古-NLP-N2-基础功能模型
说明:该模块需要具备多轮对话能力和阅读理解能力。当前基模型已经具备了通用的多轮对话能力和阅读理解能力,可以通过指令微调进一步强化大模型在特定垂域上的多轮对话能力和阅读理解能力。
准备训练数据
本场景不涉及自监督训练,无需准备自监督数据。
微调数据来源:
需要针对涉及的模块分别构造相关的微调数据。
- query改写模块
- 来源:互联网开源数据集
- 问答模块
- 来源一:互联网开源数据集,如政府网站网页、政府在线问答公开数据、政务百科等。
- 来源二:特定的私域数据,针对于具体场景和项目需求,收集相关的文本数据。比如通过与当地政府的政数局进行合作,获取政府部门提供的内部脱敏数据等。相关的数据格式包括但不限于:在线网页、离线word文档、离线txt文件、离线excel表格、离线PDF文件、扫描版word文档、扫描版PDF文件等。
微调数据要求:
- 数据格式样例:JSONL格式,每行是一条JSON,包含“context”和“target”两个字段。示例如下:
- query改写模块:准备对应省略补全任务的数据和对应指代消解任务的数据。
{"context": ["你对李健怎么看 | 音乐诗人李健。请根据以上背景补全以下问题: 喜欢么"], "target": "喜欢李健么"} {"context": ["孩子就是不写作业 | 还是写作业吧。请根据以上背景补全以下问题: 你有什么办法让他写作业吗"], "target": "你有什么办法让孩子写作业吗"}
- 中控模块:对于中控模块,可以首先尝试使用基础功能模型基于prompt来进行相关中控逻辑的判断,一般情况下能够满足绝大部分场景的需求。如果针对特别细分的垂域场景,且需要中控逻辑能够取得接近100%准确率的效果,则可以按照需求可以准备对应的中控分类数据。以简单的二分类场景为例,但中控逻辑可以非常复杂,可扩展到多场景分类。二分类的数据示例如下:
{"context ": ["用微波炉热汤要盖盖子吗? 判断以上问题是否需要调用检索,请回答“是”或”否“"], "target": "否"} {"context ": ["福田区支持哪些组织开展退役军人教育培训工作? 判断以上问题是否需要调用检索,请回答“是”或“否”"], "target ": "是"}
- 问答模块:准备单轮问答和检索增强的数据集。
{"context": ["请问福田英才荟卫生系统人才与福田英才荟高层次人才是不同的部门受理么?"], "target": "您好,福田英才荟卫生系统人才奖励管理办法只针对福田区属医疗卫生事业单位人员,其他高层次人才申领奖励建议咨询区人力资源局。"} {"context": ["请阅读以下文章回答问题,如果问题与文章不相关,则无需参考文章内容,直接回答问题即可。文章:“在福田区社会建设专项资金的使用情况中,如何防止出现损失、浪费和管理不善的情况?在社会建设专项资金的使用情况中,应规范操作,加强管理,及时纠正和化解建设过程中的解释、调取和留置问题,严防管理漏洞,保证应用资金的安全性和真实性。同时,应建立完善的监管机制,严格管理,加强监督,加强专项资金使用情况的评估,加强对建设过程的监管和评估,节约专项资金,杜绝资源的浪费和管理不善的情况。在使用福田区社会建设专项资金中,如何防止遭到挤占、占用和挪用专项资金的情况?在使用福田区社会建设专项资金的过程中,应合法合规,按照相关规定经审批后使用并保存票据。同时,应实行专款专用、监管有力的制度,并加强对专项资金的监督和管理。严格控制专项资金的流向和使用范围,严禁有过度功能的行为,坚决杜绝虚假、虚报和恶意投资,建立完善的监督管理制度,加强随时的监督和核查,确保专项资金使用的规范化、严格化、透明化、便结算。”问题:在福田区社会建设专项资金的使用过程中,如何避免因管理不善导致专项资金重大损失浪费?"], "target": "福田区社会建设专项资金使用过程中,如何保障专项资金的使用事项为重点。管理人员应建立责任所在意识,制定科学规范的使用办法,强化使用过程的监测和评估。必须严格按照项目运作方案来确定资金使用范围,确保所有使用资金都是经过规范操作和审批的,必须严格按照使用资金的监管属性,统一管理各类资金,精细、规范、稳健。在内部管理上,应加强信息通报、关联跨部门协调机制,提高管理精神与管理水平,优化执行方法,简化管理程序,创造良好的运作环境,以推进社会建设事业的合理发展。"}
- query改写模块:准备对应省略补全任务的数据和对应指代消解任务的数据。
- 数据量级要求:综合三个模块,本场景共使用了100000量级的数据进行微调。其中,query改写模块使用了4万量级的sft数据,问答模块使用了6万量级的sft数据 ,包括单轮问答、多轮问答。中控模块使用了1万量级的sft数据。
针对不同的任务类型,所需数据量会所有不同。从经验上来说,对于简单的任务,数据量的要求会少一点,如3000到5000条;对于复杂的任务,需要的数据条数更大一些,如2万~10万条。在构造指令微调数据的成本可以接受的情况下,至少准备1万条以上指令微调数据为宜。
- 数据质量要求:
- 保证微调数据的正确性,多样性,复杂性。
- 保证微调数据能覆盖对应任务所涉及的所有场景。
微调数据清洗:
以下是该场景中实际使用的数据清洗策略,供您参考:
- 原始文本处理。基于爬虫、数据处理平台批量处理收集到的原始数据,需要将文件统一转换成纯文本的txt文件,对错误格式数据进行删除。
- 构建微调数据。生成垂域微调(问答对)数据,将问答对数据分为:单轮问答数据、多轮问答数据、检索增强问答数据和其他特定的指令任务数据等类型。
- 构造特定Prompt格式的数据。通过编写代码对数据进行处理,生成所需的带有Prompt格式的数据,保存成JSON文件。
- 低质量SFT数据过滤。包括:对回答过短的问答对、回答风格不适宜的问答对进行过滤。同时,针对利用大模型从原始文档中抽取出来的问答对数据,您可以基于rouge-score值(https://pypi.org/project/rouge-score/)进行问答对的过滤。
下表列举了该场景常见的数据质量问题,以及相对应的清洗策略,供您参考:
序号 |
数据问题 |
清洗步骤与方式 |
---|---|---|
1 |
问题或回答中带有不需要的特定格式内容或者时间戳等。 |
通过编写代码、正则表达式等进行处理,删除或者修改对应的内容,或者直接过滤掉整条数据。 |
2 |
原始数据不符合特定微调数据的格式。 |
通过编写代码进行处理,修改为特定微调格式的数据,例如对于阅读理解微调数据,需要拼接上阅读理解对应的Prompt。 |
3 |
收集的数据量大,但质量参差不齐,部分数据由于时效性、内容正确性等原因不可用。 |
对收集自不同来源的数据,进行分别处理,分别过滤不可用的低质量的数据。 |
训练模型
自监督训练:
不涉及
有监督微调:
该场景采用下表中的微调参数进行微调,您可以在平台中参考如下参数进行训练:
训练参数 |
设置值 |
---|---|
数据批量大小(batch_size) |
4 |
训练轮数(epoch) |
3 |
学习率(learning_rate) |
3e-6 |
学习率衰减比率(learning_rate_decay_ratio) |
0.01 |
热身比例(warmup) |
0.1 |
评估和优化模型
模型评估:
您可以从平台的训练日志中获取到每一步的Loss,并绘制成Loss曲线。本场景的一个Loss曲线示例如下:
通过观察,Loss曲线随着迭代步数的增加呈下降趋势直至稳定,证明整个训练状态是正常的。
模型持续优化:
本场景采用了下表中的推理参数进行解码,您可以在平台中参考如下参数调试:
推理参数 |
设置值 |
---|---|
最大Token限制(max_token) |
4096 |
温度(temperature) |
0.9 |
核采样(top_p) |
0.4 |
话题重复度控制(presence_penalty) |
0.3 |
部署推理服务后,可以采用人工评测的方案来评估模型效果。以下列出该场景中可能遇到的常见问题,评测过程中如出现这些问题,可参考相应的解决方案:
- 问题一:问答场景问题,针对文档库中的内容可以回答的问题,模型的最终回答不符合预期。
- 解决方案:首先进行问题定位,确定是未检索到相关文档,还是检索到相关内容但模型理解错误。如果未检索到相关文档,则需从入库内容优化、提高检索精度、过滤无关内容等方面进行检索优化。如果检索内容正确,但模型回复不符合预期,则应考虑优化微调数据并重新训练模型。
- 问题二:针对特定问题,问答场景模型可以较好地回复内容,但对闲聊场景,模型的回复很差。
- 解决方案:这里有可能有两方面的原因:一方面是问答模块对应的模型的通用能力较差,另一方面是中控模块执行判断是否需要调用检索出错,检索文档混入导致模型受到干扰。针对前者,说明模型的通用能力退化,需要在微调模型时适当混入一些通用数据。