如何在大模型中实现图谱问答(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之间,满足项目的验收标准。但引入的问题还是需要进一步验证。
阅读全文