如何在大模型中实现图谱问答(KBQA)的实战应用?
摘要:本文主要是针对KBQA方案基于LLM实现存在的问题进行优化,主要涉及到响应时间提升优化以及多轮对话效果优化,提供了具体的优化方案以及相应的prompt。
1.背景
最近比较忙(也有点茫),本qiang~想切入多模态大模型领域,所以一直在潜心研读中...
本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结,对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战:当KBQA集成LLM》、《LLM应用实战:当KBQA集成LLM(二)》。
针对KBQA集成LLM项目,该系列文章主要是通过大模型来代替传统KBQA的相关功能组件,实现知识图谱问答,以及如何针对问答效果、多轮对话、响应时间等优化工作总结,是妥妥的干货篇,感兴趣的客官可以持续关注!
本次的主要优化点在于如下:
1. 响应时间
项目的验收标准是流式首字的响应时间在3s内,而当前服务的平均响应时间在5s-7s之间,不符合项目验收标准。
2. 多轮对话
由于当前多轮对话中的指代消解、默认实体或概念对齐均由大模型处理,由于基座大模型的不稳定性,存在偶现的多轮对话中的对象指代错误的情况。
2.响应时间优化
2.1响应时间统计
基于前文展示的流程图,针对每个节点进行单次响应时间的统计,结果如下:
模块
耗时
图谱初始化
558ms(仅第一次会耗时)
候选schema召回
49ms
对齐prompt调用LLM完整响应时间
2800ms
对齐校准
15ms
对话prompt调用LLM首字响应时间
1800ms
可以发现两次调用大模型的响应时间耗时基本都在3s,因此重点对LLM调用环节进行优化。
优化方案包括三方面:prompt长度缩减、LLM输出结果简化、使用量化版LLM。
2.2prompt长度缩减
经过分析比对,不同文本长度,LLM的首字响应时间差别较大,尤其是增加安全机制的非公开LLM。
原因也众所周知,LLM推理过程是基于前文预测下一个token,纵然增加了KV缓存机制、FA2机制,较长的prompt首字响应时间必然大于较短prompt,因此可以针对prompt长度进行缩减,以提高LLM首字响应时间。
由于项目中对齐prompt的平均字符长度为5000字左右,且需要等待LLM全部输出结果后,方才进行后续流程,因此本次优化重点优化对齐prompt中的示例部分。
提供的fewshot示例大概40+条,且大部分示例和用户当前问题不相关,因此将fewshot示例向量化进行存储,当用户提问时,基于语义相似度将问题与fewshot示例进行pk,筛选出语义相似的10条示例作为对齐prompt中的fewshot,以达到缩减prompt长度的效果。
实验结果表明,将40条fewshot减小为10条,响应时间提高0.8s左右。
对话prompt没有进行优化,因为对话prompt不需要等待全部结果输出,只需要首字响应并流式输出即可。
2.3LLM输出结果简化
LLM输出结果越长,输出全部结果的时间就越长,所以针对对齐prompt的输出长度也做了一些优化,虽然响应时间提升不高。
原始对齐prompt调用LLM的输出如下:
(属性-等于-体重)且(属性值-等于-最大);(属性-等于-食性)且(属性值-等于-肉食性);(概念-等于-恐龙)
主要优化点在于:
1)属性、实体、概念、属性值分别用“P”, “E”, “C”, “V”表示
2)属性、实体、概念中三元组删除“等于”
3)属性值中的等于用“eq”代替
4)且、或分别用“&”, “|”表示
因此优化后的LLM输出结果如下:
(P-体重)&(V-eq-最大);(P-食性)&(V-eq-肉食性);(C-恐龙)
2.4大模型量化
先前使用的非量化版的LLM,更换了INT 8量化版的LLM后,LLM的首响及完整响应时间有了质的提升。
其中对齐prompt完整输出结果由先前的2.8s提升至1.6s,对话prompt的首响时间由1.8s提升至0.6s。
由于使用的是私有化部署的量化版,中间没有安全审核机制,再加上量化的有效推理,所以响应时间提升非常明显。
2.5思考
经过上述三方面的优化后,平均响应时间2.1s-2.9s之间,满足项目的验收标准。但引入的问题还是需要进一步验证。
