LLM应用实战:当图谱问答(KBQA)集成大模型(三)
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的输出如下:
(属性-等于-体重)且(属性值-等于-最大);(属性-等于-食性)且(属性值-等于-肉食性);(概念-等于-恐龙)
主要优化点在于:
- 属性、实体、概念、属性值分别用“P”, “E”, “C”, “V”表示
- 属性、实体、概念中三元组删除“等于”
- 属性值中的等于用“eq”代替
- 且、或分别用“&”, “|”表示
因此优化后的LLM输出结果如下:
(体重)&(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的构建尝试,如有问题,可私信沟通。
相关文章:

LLM应用实战:当图谱问答(KBQA)集成大模型(三)
1. 背景 最近比较忙(也有点茫),本qiang~想切入多模态大模型领域,所以一直在潜心研读中... 本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结,对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战:当KBQ…...

Django框架中Ajax GET与POST请求的实战应用
系列文章目录 以下几篇侧重点为JavaScript内容0.0 JavaScript入门宝典:核心知识全攻略(上)JavaScript入门宝典:核心知识全攻略(下)Django框架中Ajax GET与POST请求的实战应用VSCode调试揭秘:L…...
web前端怎么挣钱, 提升技能,拓宽就业渠道
web前端怎么挣钱 在当今数字化时代,Web前端技术已成为互联网行业中不可或缺的一部分。越来越多的人选择投身于这个领域,希望能够通过掌握前端技术来实现自己的职业发展和经济收益。那么,Web前端如何挣钱呢?接下来,我们…...

基于Python的信号处理(包络谱,低通、高通、带通滤波,初级特征提取,机器学习,短时傅里叶变换)及轴承故障诊断探索
Python是一种广泛使用的解释型、高级和通用的编程语言,众多的开源科学计算软件包都提供了Python接口,如计算机视觉库OpenCV、可视化工具库VTK等。Python专用计算扩展库,如NumPy、SciPy、matplotlab、Pandas、scikit-learn等。 开发工具上可用…...

大型语言模型智能体(LLM Agent)在实际使用的五大问题
在这篇文章中,我将讨论人们在将代理系统投入生产过程中经常遇到的五个主要问题。我将尽量保持框架中立,尽管某些问题在特定框架中更加常见。 1. 可靠性问题 可靠性是所有代理系统面临的最大问题。很多公司对代理系统的复杂任务持谨慎态度,因…...

C语言内存管理
1.进程的内存分布 练习:编写一个程序,测试栈空间的大小 #include<stdio.h>#define SIZE 1024*1024*7void main (void) {char buf[SIZE];buf[SIZE-1] 100;printf("%d\n",buf[SIZE-1]); }如果SIZE 大小超过8M(102410248),…...

AD24设计步骤
一、元件库的创建 1、AD工程创建 然后创建原理图、PCB、库等文件 2、电阻容模型的创建 注意:防止管脚时设置栅格大小为100mil,防止线段等可以设置小一点,快捷键vgs设置栅格大小。 1.管脚的设置 2.元件的设置 3、IC类元件的创建 4、排针类元件模型创建…...

基于MBD的大飞机模块化广域协同研制
引言 借鉴国外航空企业先进经验,在国内,飞机型号的研制通常采用基于模型定义(MBD)的三维数模作为唯一的设计制造协同数据源,从而有效减少了设计和制造部门之间的模型沟通成本和重构所需的时间,也减少或避免…...

鸿蒙轻内核M核源码分析系列二十 Newlib C
LiteOS-M内核LibC实现有2种,可以根据需求进行二选一,分别是musl libC和newlibc。本文先学习下Newlib C的实现代码。文中所涉及的源码,均可以在开源站点https://gitee.com/openharmony/kernel_liteos_m 获取。 使用Musl C库的时候,…...
力扣1818.绝对差值和
力扣1818.绝对差值和 把nums1拷贝复制一份 去重排序 对于每个nums2都找到差距最小的那个数(二分) 作差求最大可优化差值去重排序可以直接用set 自动去重排序了 const int N 1e97;class Solution {public:int minAbsoluteSumDiff(vector<int>& nums1, vector<i…...

矩阵练习2
48.旋转图像 规律: 对于矩阵中第 i行的第 j 个元素,在旋转后,它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组,如果不想使用额外的内存,可以用一个临时变量 。 还可以通…...

2024海南省大数据教师培训-Hadoop集群部署
前言 本文将详细介绍Hadoop分布式计算框架的来源,架构和应用场景,并附上最详细的集群搭建教程,能更好的帮助各位老师和同学们迅速了解和部署Hadoop框架来进行生产力和学习方面的应用。 一、Hadoop介绍 Hadoop是一个开源的分布式计算框架&…...
力扣算法题:将数字变为0的操作次数--多语言实现
无意间看到,力扣存算法代码居然还得升级vip。。。好吧,我自己存吧 golang: func numberOfSteps(num int) int {steps : 0for num > 0 {if num%2 0 {num / 2} else {num - 1}steps}return steps } javascript: /*** param {number} num…...
vue前段处理时间格式,设置开始时间为00:00:00,设置结束时间为23:59:59
在Vue开发中,要在前端控制日期时间选择器的时间范围,可以通过以下方式实现: 使用beforeDestroy生命周期钩子函数来处理时间范围: 在Vue组件中,可以监听日期时间选择器的变化,在选择开始日期时,自…...
Java 8 新特性全面解读
Java 8,作为一次重大更新,于2014年引入了多项创新特性,极大地改善了Java的编程体验和性能。此版本不仅加入了对函数式编程的支持,还增强了接口的功能,引入了新的API,并优化了语言的整体效率。接下来&#x…...

JavaScript知识之函数
javascript函数 在JavaScript基础之上提供了部分函数,同时也可以自定义函数,JavaScript基础详见之前的文章javascript基础知识 自定义函数 //关键字 函数名 参数列表 函数体 function test(a,b,c){alert(a":"b":"c) }function test1(a,b){return a;//不…...

【Pepper机器人开发与应用】一、Pepper SDK for LabVIEW下载与安装教程
🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 📑上期文章:『一文汇总对比英伟达、AMD、英特尔显卡GPU』 🍻本文由virobotics(仪酷智能)原创 🥳欢迎大家关注✌点赞&…...
HCIP-AI EI 认证课程大纲
该阶段详细介绍计算机视觉、注意力机制与Transformer、自然语言处理、语音处理等 AI 核心领域技术,并重点介绍华为云 EI 服务使用。 共计48 课时。第一节:计算机视觉技术概述与图像处理基础 - (3 课时) - 什么是计算机视觉&#x…...

@Test注解方法,方法无法执行
1.背景 写了一个测试方法,执行后如图 2.原因是 该项目是springbootgradle...构建的项目 在build.gradle配置文件中关闭了单元测试: test {useJUnitPlatform()// 是否启用单元测试enabled false } 3.处理方式 开启单元测试 test {useJUnitPlatform()// 是否启用单元测试ena…...

golang函数
【1】函数: 对特定的功能进行提取,形成一个代码片段,这个代码片段就是我们所说的函数 【2】函数的作用:提高代码的复用性 【3】函数和函数是并列的关系,所以我们定义的函数不能写到main函数中 【4】基本语法 func 函…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...