LLM应用实战:当图谱问答(KBQA)集成大模型(三)

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
简介: 本文主要是针对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.2 prompt长度缩减

经过分析比对,不同文本长度,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.3 LLM输出结果简化

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之间,满足项目的验收标准。但引入的问题还是需要进一步验证。如prompt输入长度缩减、LLM输出结果长度缩减、切换量化版LLM是否引入问答准确性的降低呢?

针对该问题,基于先前整理的测试集,进行测试验证,准确率层面效果基本保持不变,说明以上优化方法有效!

3. 多轮对话效果优化

3.1 示例

怎么辨认慈母龙

它有啥能力

分布在那些地方?

海百合是百合么?

那它分布在哪里?

上述示例为多轮问答,在测试验证中,运行10次该多轮问答,其中会出现2次”那它分布在哪里?”中的指代到了慈母龙,而非正确的海百合,因为对齐prompt调用LLM后,输出了“(E-慈母龙)&(P-分布区域)”原因当然可以归咎于LLM的基础能力不足,但如何进行优化呢?

尝试了两种方案:a. 对齐prompt中增加历史参考内容;b. 当前问题与历史问题通过LLM比较,判定是否二者存在关联性。

3.2 历史参考内容

想法也非常简单,LLM直接针对历史的问题和答案进行总结,大概率会存在指代不清的问题,那么如果将历史的问题以及对应指代的实体或概念作为参考项,提供给LLM,那么LLM就多了一层参考,进而可以提高指代的准确性。

历史参考内容引入到对齐prompt部分内容如下:

第一个问题prompt, 历史输入为空,ref也为空

历史输入:

```

 

```

 

现在回答:

in: 怎么辨认慈母龙

 

out:

第二个问题prompt, 存在第1个问题及实体,当前问题的参考ref为慈母龙

历史输入:

```

in: 怎么辨认慈母龙

ref: 慈母龙

```

 

现在回答:

in: 它有啥能力

ref: 慈母龙

out:

第三个问题prompt, 存在第1,2个问题及实体,当前问题的参考ref仍为慈母龙

历史输入:

```

in: 怎么辨认慈母龙

ref: 慈母龙

in: 它有啥能力

ref: 慈母龙

```

 

现在回答:

in: 分布在那些地方?

ref: 慈母龙

out:

第四个问题prompt, 存在第1,2,3个问题及实体,当前问题的参考ref也为慈母龙,即将之前的实体继续带入下一轮,大模型会根据当前问题,结合历史输入,进行实体抽取

历史输入:

```

in: 怎么辨认慈母龙

ref: 慈母龙

in: 它有啥能力

ref: 慈母龙

in: 分布在那些地方?

ref: 慈母龙

```

 

现在回答:

in: 海百合是百合么?

ref: 慈母龙

out:

第五个问题prompt, 存在前四个问题及实体,ref当前为海百合

历史输入:

```

in: 怎么辨认慈母龙

ref: 慈母龙

in: 它有啥能力

ref: 慈母龙

in: 分布在那些地方?

ref: 慈母龙

in: 海百合是百合么?

ref: 海百合

```

 

现在回答:

in: 那它分布在哪里?

ref: 海百合

out:

这样即使是20轮以上的问答,LLM也能根据当前ref进行分析比较,保障当前问题描述的实体或概念

3.3 当前问题与历史问题关联性分析

理论上通过引入历史参考内容可以有效解决多轮对话中的指代消解问题,但由于LLM本身泛化能力问题,偶尔会出现ref引入错误的情况,例如,上述第二个问题,当前的ref引入为海百合、慈母龙,如何针对该问题进行优化呢?

原因可能是历史问题存在多个时,大模型偶尔无法按照指令针对历史问题进行语义分析,因此可以将当前问题与历史中最后一次出现实体或概念的问题进行关联性分析,比较是否描述的是同一个对象,进而基于分析结果,将ref中的内容进一步约束。即,如果当前问题与历史最后一次出现的问题的实体相关时,则引入历史的实体,否则不引入历史实体。

举个例子说明下,怎么辨认慈母龙分布在那些地方?存在关联性(默认第二个问题不存在实体,自动引用前一个问题的实体),则ref为慈母龙,而怎么辨认慈母龙海百合是百合么?不相关,则ref中只保留海百合

关联性分析也是通过prompt调用LLM实现,对应的prompt内容如下:

你是一个关于自然博物馆的多轮对话的识别器,主要用于识别当前问题与历史问题是否在讨论同一个或一组对象,以便进一步区分多轮对话的边界,请参考如下要求和示例进行输出:

1. 输出只能包含"是", "否",禁止输出其他内容;

2. 一定要结合历史的问题,与当前问题进行语义层面分析与比较,判断当前问题是否有历史的问题是否在讨论同一个或一组对象,如存在指代消解等;

3. 如果输出为"是",表示当前问题与历史问题存在关联性,则表示二者共同;

4. "q"表示问题,"a"表示输出;

5. 如果当前问题存在"它"或"它们",表示存在指代情况,则输出"是";

6. 如果当前问题没有明确任何询问的对象,表示默认使用历史讨论的对象,输出"是";

7. 如果当前问题存在具体的询问对象,且与历史问题不存在指代问题,则输出"否";

 

 

示例如下:

```

示例

q: 怎么辨认慈母龙

q: 有啥能力?

a: 是

示例

q: 怎么辨认慈母龙

q: 分布在那些地方?

a: 是

示例

q: 怎么辨认慈母龙

q: 海百合是百合么?

a: 否

示例

q: 海百合是百合么?

q: 那它分布在哪里?

a: 是

示例

q: 霸王龙的体长?

q: 梁龙有何生活习性?

a: 否

```

 

现在请根据上述要求及示例,针对以下问题进行关联性分析:

q: {}

q: {}

a:

 

4. 总结

一句话足矣~

本文主要是针对KBQA方案基于LLM实现存在的问题进行优化,主要涉及到响应时间提升优化以及多轮对话效果优化,提供了具体的优化方案以及相应的prompt

读者可以按照这套方案进行其他KBQA的构建尝试,如有问题,可私信沟通。

 


 

 

目录
相关文章
|
17天前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
28 2
zabbix agent集成percona监控MySQL的插件实战案例
|
3天前
|
人工智能 自然语言处理 机器人
谷歌将大模型集成在实体机器人中,能看、听、说执行57种任务
【9月更文挑战第17天】近年来,人工智能在多模态大模型领域取得显著进展。谷歌最新研发的Mobility VLA系统,将大模型与实体机器人结合,实现了视觉、语言和行动的融合,使机器人能理解并执行复杂多模态指令,如“我应该把这个放回哪里?”系统在真实环境测试中表现出色,但在计算资源、数据需求及伦理问题上仍面临挑战。相关论文发布于https://arxiv.org/abs/2407.07775。
22 9
|
1天前
|
存储 机器学习/深度学习 物联网
CGE:基于Causal LLM的Code Embedding模型
CodeFuse-CGE 项目在外滩大会展出,吸引众多技术与产品从业者的关注。“文搜代码”功能备受好评,模型表现令人期待。CodeFuse-CGE 采用大语言模型,通过 LoRA 微调提取文本与代码嵌入,实现在多个 NL2Code 基准测试中超越现有 SOTA 模型。现已开源 CGE-Large 与 CGE-Small 两种模型,欢迎访问 GitHub 页并支持本项目。[项目地址](https://github.com/codefuse-ai/CodeFuse-CGE)
17 1
|
6天前
|
安全 测试技术
世界模型又近了?MIT惊人研究:LLM已模拟现实世界,绝非随机鹦鹉!
【9月更文挑战第14天】麻省理工学院最近的研究揭示了大型语言模型(LLM)展现出的新潜能,其不仅能模仿真实环境,更在一定程度上理解并模拟程序在特定环境下的运作。通过使用Transformer模型并结合特定探测分类器,研究团队发现模型能逐步掌握程序的形式语义。为了验证这一发现,团队创建了一个独特的干预基准测试,进一步证实了模型的仿真能力,为世界模型的发展提供了新方向。尽管存在模型可能仅习得统计规律而非真正理解语义的争议,这项研究依然为理解复杂系统提供了新工具与视角。论文详情见:https://arxiv.org/abs/2305.11169。
14 1
|
12天前
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
27 1
|
20天前
|
存储 消息中间件 前端开发
Web2py框架下的神秘力量:如何轻松集成第三方API,让你的应用不再孤单!
【8月更文挑战第31天】在开发现代Web应用时,常需集成第三方服务如支付网关、数据存储等。本文将指导你使用Web2py框架无缝接入第三方API。通过实例演示从注册获取API密钥、创建控制器、发送HTTP请求到处理响应的全过程。利用`requests`库与Web2py的内置功能,轻松实现API交互。文章详细介绍了如何编写RESTful控制器,处理API请求及响应,确保数据安全传输。通过本教程,你将学会如何高效整合第三方服务,拓展应用功能。欢迎留言交流心得与建议。
29 1
|
27天前
|
监控 数据安全/隐私保护 异构计算
借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
【8月更文挑战第8天】借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
52 1
|
19天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
80 0
|
20天前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
42 0
|
20天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
64 0