超详细!!传统NLP算法结合大模型私有化部署简易知识问答体系工程实践

作者:京东物流 郭卓勋

一、业务背景

在物流私域体系构建中,形成了多个微信群生态,需要投放自动回复机器人来自动化回复用户问题,希望能够用最小的成本满足基本问答。由于需要从头开始自建全流程算法问答体系,需要面临一下几个问题:

1.数据不外流:用户数属于隐私数据,不可以直接调用外部API接口,防止数据泄露。

2.回答准确:用户提问各种各样,需要精准匹配用户问题,避免"答非所问"。

3.大模型幻像:面对直接ToC业务,尽可能避免大模型产生"幻觉",机器人已读乱回容易为公司招致法律风险。

二、技术方案

  1. 项目背景:

当前现有数据为业务方提供的200+条左右的问答数据,我们需要根据用户的query来匹配问答库中最相似的知识,并整合成标准回答,返还给用户。整理流程分为召回,精排,改写,总共三个过程。

  1. 技术细节

(1)数据清洗

业务方所提供数据不甚规整,是客服人员手工写的excel表格,格式很随意,需要花费一些时间将数据清洗成指定格式,我们希望的格式为query-answer对:

json 复制代码
{"query": "更换电池时是否有旧电池回收的服务?", "answer": "电池更换时会提供一个旧电池回收的价格链接,所以更换下来的电池是不需要寄回的哦~"}

这样构造数据集的好处:

•能够更方便为DNN模型构造正负样本标注。正样本就是本条query对应的answer,负样本就是随机选取10个其他query对应的answer

•能够同时利用query语义信息和answer语义信息,能够匹配用户提问更加精准。

(2)数据增强

◦为什么要做数据增强?

1.现有数据量太少,难以用于支撑模型训练,需要增加数据量。

2.并且用户提问方式复杂多样,query改写有助于增加模型命中正确答案概率。

3.同一条answer中可能包含了多个知识点,可以把这些涵盖的知识点进行拆分,形成多个query- answer对,丰富知识文本库能够覆盖的范围。

◦具体怎么做的数据增强?

利用大模型的生成能力对训练数据进行改写和增加,我们提供一个示例prompt,具体可根据业务场景进行改写。值得注意的是,{question_num}这个变量为 answer的token总数除以40,即每40个token生成一个QA pair。这样能够尽可能的保证长文本被切割为多个知识点。

ini 复制代码
zh_prompt_template = """
如下三个反引号中是{product}的相关知识信息, 请基于这部分知识信息自动生成{question_num}个问题以及对应答案
```
{knowledge}
```
要求尽可能详细全面, 并且遵循如下规则:
1. 生成的内容不要超出反引号中信息的范围
2. 问题部分需要以"Question:"开始
3. 答案部分需要以"Answer:"开始
"""

◦最终整合的数据形式如下:

▪对该数据,仅需按比例切割为训练集和测试集数据即可。

▪注意:可能会有同学有疑问,由于该部分数据已经被增强过,即同一个原始QA pair经过增强后可能产生多个相似的衍生QA pair,这样的数据随机进入训练集和测试集会不会导致数据穿透、评估结果虚高?我仔细思考了一下这个问题,结合业务场景,我认为过拟合(overfit)是一个相对过程,我们的目标就是把测试集最大程度接近于线上数据,并非认为线上数据完全是陌生数据。对训练集中的类似数据能够正确识别,也算做模型的正向效果,故不认为有数据穿透的风险。

markdown 复制代码
Question: 甲醛治理所用的光触媒有什么作用?
Answer: 甲醛治理通常需要用到的工具包括气泵,标准的药剂有三种:甲醛捕捉剂、TVOC清除剂和光触媒。
=====
Question: 佳能打印机使用的定影方式是什么?
Answer: 佳能打印机使用的是高温定影方式。这种方式通过高温加热使墨粉附着在纸张上,从而完成打印过程。然而,这种高温定影方式不适用于打印不干胶,因为不干胶在加热过程中会融化,可能会损坏打印机。
```
=====
Question: 对于C3326及以上机型,扫描处一次可以放多少张纸?
Answer: 您好,对于C3326及以上机型,扫描处最多可以放100张纸一起扫描。
```
=====
Question: 使用服务+ 的光触媒技术除甲醛的效果如何?
Answer: 您好,我们使用进口光触媒技术,除醛率可高达97%,并且会出具国家认证的权威CMA检测报告。我们的药剂经过权威检测机构检测,对人体无害。在不添加新污染源的前提下,治理达标后5年内,如有任何问题,您可以随时联系专家免费上门勘察。所有工程师均受过专业培训和严格评选认证,治理工具为原装进口设备。

(3)模型训练

模型部分为两个部分:召回+精排。召回层结合了传统BM25倒排索引和向量索引互补的多路召回方法,精排层采用了复杂度更高的DNN基础的rerank模型,返还最高相似度答案传递给大模型作为背景知识,再把大模型改写后的回答返回消费者。

BM25召回: 倒排索引是一种比较传统的文档检索方法,主要方法是首先对用户输入文本进行分词,然后通过BM25公式进行打分,原理不详细介绍了,感兴趣同学可自行学习。

倒排召回的核心还是关键词命中逻辑,通常具有检索速度快、可解释性强等优点。但是,该方法和现有NLP模型相比,缺乏对语义信息的理解,无法理解"一词多义"等情况,容易产生语义层面的大幅偏差。

向量召回:

1.为了解决倒排召回语义理解不佳的问题,通常需要结合向量召回来弥补。由于向量召回多由语言模型构成,包含了对文本语义信息的理解,语义相近即可命中,无需term精准匹配。但是,向量召回缺乏对专业词汇的理解、可解释性弱、"一词多义"召回不全,这些又可以通过倒排索引弥补。故两种召回方法相辅相成。

2.向量召回模型工业实践中应用较多的还是Bert为基本框架的变体,比如sentence- Bert等模型作为文本embedding获取方式。(此处没有采用现有大模型来抽象embedding,主要是因为考虑到一方面微调大模型需要更多的计算资源,GPU资源紧缺;另一方面考虑到服务部署生产会实时生成用户问答的embedding,这样直接把消费者信息传给大模型API有合规的问题。)

3.该模型的主要原理是抽象query和answer成为embedding 向量表征,再计算cos- similarity或者直接concat向量,用于下游任务计算。为了最终计算用户query- answer的余弦相似度,故采用了cos-similarity作为训练目标。此为向量召回的原理部分(论文链接挂在文末)。

精排模型:

◦精排模型(重排模型)往往需要结合多路召回的结果,而多路召回的结果又不在同一个评分体系下,因此直接结合多路召回结果可能会差强人意。所以,我们决定再训练一个排序模型来对候选结果进一步打分,此处,可以对比一下向量召回模型向量重排模型的主要差别。此处截取了aws技术文档的介绍,我觉得比较合理:左侧为向量召回模型(双塔结构),只有当query和answer分别做了embedding之后才会开始交叉,也就是全连接;而rerank模型(右侧)并不会分别对query和answer做embedding,而是在输入端就会把文本进行拼接,用[SEP]分割不同句子,直接对拼合后的长sequence每个token做embedding,也就是从底层就开始交叉,这样作会使模型参数量急剧增加,模型复杂度直线升高,适用于召回后的小样本数量排序。

输出阶段:

◦为了避免模型"答非所问"或者"语言生硬",我们不能把知识库中的知识直接返还给用户,因为可能发生"用户所提问问题本身就不存在于知识库中"的问题,这种情况即便返回最相近的答案也不是用户期望得到的答案。另外,预置于知识库中的回复难免生硬、不变通,即便回答内容正确但是如果表达方式不佳,也会非常影响用户体验。基于这种考量,我门把模型选择出来的QA pair和用户真实query当作背景知识再次喂给大模型,由大模型进行二次改写,来生成最终答案。

◦另外,为解决用户提问不存在知识库中情况,需设置"拒答"兜底逻辑,避免"已读乱回"。我们需要根据具体业务场景获得拒答相似度阈值,当最高相似度文档仍低于设定阈值的情况,判定模型拒答。

(4)效果评估

下面仅展示几个向量召回对比效果的demo,用来直观感受一下finetune前后的效果。由于本实验同时利用了训练集数据中的query和answer数据,故向量召回分为了qq(query-to-query)和qa(query-to-answer)两种:

•qa召回对比finetune前后效果(左:未finetune & 右:finetune之后):

•qq召回对比finetune前后效果(左:未finetune & 右:finetune之后):

•分析:可以从左右图对比中发现finetune后(右)的正负样本得分分布分隔更加明显,交叉程度更小,由此可见垂类模型训练的效果提升。

三、线上部署

•本实验由于包含了复杂的模型判断、前后处理流程,故无法单独包装为torchscript、onnx等高性能模式,但是可借助九数中台或者行运构造镜像部署至生产。

四、参考资料

本方案参考了亚马逊公开的算法技术方案,并在物流场景下重训练了模型,原始参考文档如下。

这些文档里包含了git连接和部分工程代码可供借鉴:

•aws.amazon.com/cn/blogs/ch...

•aws.amazon.com/cn/blogs/ch...

sbert论文链接:

•arxiv.org/pdf/1908.10...

相关推荐
Ase5gqe6 小时前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·大数据·架构
史嘉庆6 小时前
Pandas 数据分析(二)【股票数据】
大数据·数据分析·pandas
唯余木叶下弦声7 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
重生之Java再爱我一次8 小时前
Hadoop集群搭建
大数据·hadoop·分布式
豪越大豪10 小时前
2024年智慧消防一体化安全管控年度回顾与2025年预测
大数据·科技·运维开发
互联网资讯10 小时前
详解共享WiFi小程序怎么弄!
大数据·运维·网络·人工智能·小程序·生活
AI2AGI11 小时前
天天AI-20250121:全面解读 AI 实践课程:动手学大模型(含PDF课件)
大数据·人工智能·百度·ai·文心一言
贾贾202312 小时前
配电自动化中的进线监控技术
大数据·运维·网络·自动化·能源·制造·信息与通信
Denodo13 小时前
10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据
大数据·数据库·数据仓库·人工智能·数据挖掘·数据分析·数据编织