LLM+RAG: 关于知识问答优化的思考总结

news2024/9/21 20:54:31

本文分享实践中对LLM+RAG实现知识问答系统的相关调研和思考。

LLM的知识库问答有3种实现路径:RAG 或 微调,或两者结合。而RAG和微调都各有利弊,比如说:

- RAG: 低成本易部署,适用于知识会更新的场景,但知识内容多的情况下,检索成本会变高。

- 微调: 算力成本高,微调效果不稳定,训练不好容易出现幻觉,不适用于知识频繁更新场景,但调好后,LLM回复速度很可观。

在实践RAG+Langchain开源知识问答项目时,我发现有以下难点:

(1) 对文本切片基本采用的是:固定长度分割文本,且分割窗口之间留一定重叠内容,以避免损失上下文语义信息。虽然简单便捷,但缺点也很明显,比如在以下场景:

# 一级标题
## 段落一
## 段落二
## 段落三

# 某系统主要由以下内容构成:
# 1. 组件1:xxx
# 2. 组件2:xxx
# 3. 组件3:xxx

如果文本分片长度限制过小,一级标题下的段落二和三就会丢失一级标题这个关键信息,同理,如果对系统构成做提问,可能RAG只检索出组件1,因为组件2和3因分片长度限制没归到同一文本块内。但放大文本分片长度又容易给LLM带来冗余噪声信息,影响模型回答(特别是部分开源LLM对上下文长度支持和语义理解相对较弱)。

(2) 单纯RAG+LLM做知识问答,当出现知识内容较多,检索成本就很高,因为要遍历所有文本块。

(3) 用户用关键字提问,RAG检索不到相关文本,往往需要补全问题信息。

(4) 有些知识内容是多模态的,如pdf内带有图表,ppt等。如何将多模态知识加入知识库并做知识问答?

技术交流

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了大模型技术交流群, 想要进交流群、获取完整源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2060,备注:技术交流

用通俗易懂的方式讲解系列

  • 用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库
  • 用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程
  • 用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain
  • 用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库
  • 用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结
  • 用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调
  • 用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了
  • 用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理
  • 用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南
  • 用通俗易懂的方式讲解:大模型训练过程概述
  • 用通俗易懂的方式讲解:专补大模型短板的RAG
  • 用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践
  • 用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践
  • 用通俗易懂的方式讲解:大模型微调方法总结
  • 用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了
  • 用通俗易懂的方式讲解:掌握大模型这些优化技术,优雅地进行大模型的训练和推理!
  • 用通俗易懂的方式讲解:九大最热门的开源大模型 Agent 框架来了

难点1&2&3

先回答第一个难点:如何做好文本切片? 我查了些网络上的解决方案,答案是:语义切分。公开网络上的语义切分主要有以下2类方法[3]:

(1) 篇章分析: 利用NLP的篇章分析(discourse parsing)工具,提取出段落之间的主要关系,把所有包含主从关系的段落合并成一段。这样对文章切分完之后保证每一一个文本分块在说同一件事情。

(2) BERT判断段落相似度: BERT等模型(如BERT-base-Chinese)在预训练的时候采用了NSP(next sentence prediction)的训练任务,因此BERT完全可以判断两个句子(段落)是否具有语义衔接关系。这里我们可以设置相似度阈值t,从前往后依次判断相邻两个段落的相似度分数是否大于t,如果大于则合并,否则断开。其实,本质上就是段落分割,最近试了阿里语音实验室的SeqModel模型,还可以,有兴趣的伙伴可以用modelscope直接调用。

那切完后,又会存在难点(1)中大块切片的噪声问题 和 难点(2)中检索成本高的问题,;为此,我们可以利用层次检索或称树形检索的方式去做,对应方式如下图所示:

图片

像篇章分析获取的文本块是具有层次的依存关系的,则可以如上图左1所示。检索时,从上至下检索,检索过程中配合剪枝(即,只选择每层topk相似度的节点往下检索)。而BERT段落相似判断,由于没有依存关系,所以需要适用LLM做总结获取摘要。而2024年斯坦福大学提出的RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)[5] 是对固定长度分割后的文本块embedding做语义聚类后,将各类内文本用LLM总结出摘要,生成摘要embedding作为树的节点。

在以上3种层次结构中,由于语义切分后的一个文本块(即一个段落)可能会很多字,所以还是会采用固定长度分割下文本块,好处是检索时能抓住细节的同时避免引入段落内其他冗余文本(再啰嗦一句,很多开源开源LLM对上下文长度支持和语义理解相对较弱)。如果说你不担心检索成本问题(比如你采用并行检索),那你将层次结构压平后检索也更好。

图片

至此难点(1)和(2)都解决了,我们来看看难点(3):用户用关键字提问,RAG检索不到相关文本,往往需要补全问题信息。针对此难点,公开资料也有一些解决方案:

(1) 引入追问机制 [1]:在Prompt中加入“如果无法从背景知识回答用户的问题,则根据背景知识内容,对用户进行追问,问题限制在3个以内”。这个机制并没有什么技术含量,主要依靠大模型的能力。不过大大改善了用户体验,用户在多轮引导中逐步明确了自己的问题,从而能够得到合适的答案。

假设我在学生档案知识库里提问,
user: 请基于[RAG出的知识context1: 小风是男性],回复[query1:小风的性别?]
assistant: 有答案
user:  请基于[RAG出的知识context2:小王是汉族],回复[query2:小王的民族?]
assistant: 有答案
user:  请基于[RAG出的知识context3:空],回复[query3: 党龄是多少?]
assistant: 没答案
user(自动后端发送): 如果无法从背景知识回答用户的问题,则根据背景知识内容,针对[query3:党龄是多少?],对用户进行追问,问题限制在3个以内

增加追问机制,也仅是让用户去完善自己的问题,比如针对“用户给出的查询条件不足”,有时关键词提问,就会出现检索失败,但对关键词补充成语句,就能增加检索的成功性。(不过如果多轮引导后还是回答不出来,感觉对用户体验也有很大的影响,因此结合猜你所想给出已知的高频QA推荐,应该能一定程度减轻用户观感差的风险)

(2) 关键信息抽取 [3]:利用NLP的句法分析、NER、依存分析、语义角色标注、关键词提取等去抽取关键信息,将抽取到的关键信息加入到前面层次检索的顶部就行。先检索关键信息,然后在检索对应关键信息下的内容。缺点也很明显,如果用户对原始文本的提问涉及到的信息没被提前抽取到位,那就检索不到了。

(3) RAG-Fusion [2]: 让LLM去优化用户query,改写输入query,丰富搜索信息后,都分别喂入LLM,获取到回复后,使用倒数排序融合 (Reciprocal rank fusion, RRF) 得到统一得分,重排取TOP k检索结果。RRF本质是取检索结果在所在召回路内的排名倒数,然后相加后作为得分,用于衡量一个文档是不是在N路召回中都排在前面。RAG-Fusion的缺点是费时,因为要提问多次。

图片

(4) 混合搜索:这是目前看来,我觉得一种值得尝试的低成本高收益方案。将字面相似的传统搜索算法(Best Matching 25, BM25)与向量相似性检索相结合,实现混合搜索[6]。可以加权融合分数、取各自topk检索后并集或RRF+Rerank。

图片

难点4

有些知识内容是多模态的,如pdf内带有图表,ppt等。如何将多模态知识加入知识库并做知识问答?在[1]中,给出了一个方案:单独部署一个多模态模型,通过prompt来对文档中的图片进行关键信息提取,形成一段摘要描述,作为文档图片的索引。缺点是比较考验多模态模型对图片描述程度,比如描述不够细致,导致缺乏与用户query相关的细节信息。其实,可以将图片、表格、ppt都看作图片,然后分别用多模态模型和OCR模型,分别抽取摘要描述和源数据中的数据和文本要素,整理后,作为源数据的知识分片。可以参考下[7] [8]。

参考资料

[1] 对于大模型RAG技术的一些思考 - 队长的文章 - 知乎:https://zhuanlan.zhihu.com/p/670432927

[2] 大语言模型(LLM)之更好的搜索增强生成(RAG)方案——RAG-Fusion - 王鹏的文章 - 知乎:https://zhuanlan.zhihu.com/p/673508315

[3] 基于LLM+向量库的文档对话痛点及解决方案 - Walker的文章 - 知乎:https://zhuanlan.zhihu.com/p/651179780

[4] ChatPDF | LLM文档对话 | pdf解析关键问题 - Walker的文章 - 知乎:https://zhuanlan.zhihu.com/p/65297567

[5] Sarthi, P., Abdullah, S., Tuli, A., Khanna, S., Goldie, A., & Manning, C. D. (2024). RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval. arXiv preprint arXiv:2401.18059.

[6] RAG提效利器——BM25检索算法原理和Python实现 - 王鹏的文章 - 知乎:https://zhuanlan.zhihu.com/p/670322092

[7] 斯坦福 | 提出PDFTriage,解决结构化文档的问题,提升「文档问答」准确率 - NLP自然语言处理的文章 - 知乎:https://zhuanlan.zhihu.com/p/657316158

[8] ChatPDF | LLM文档对话 | pdf解析关键问题 - Walker的文章 - 知乎:https://zhuanlan.zhihu.com/p/652975673

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【兔子机器人】五连杆运动学解算与VMC(virtual model control)

VMC (virtual model control,虚拟模型控制) 是一种直觉控制方式,其关键是在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力。虚拟力不是实际执行机构的作用力或力矩,而是通过执行机构的作用经过机构转换而成。对于一些控制问题…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入: 例题1:按摩师(打家劫舍I) 例题2:打家劫舍II 例题3:删除并获得点数 例题4:粉刷房子 例题5:买卖股票的最佳时机含冷冻 结语: 引入: 相信看到…

PowerBI怎么修改数据库密码

第一步:点击转换数据 第二步:点击数据源设置 第三步:点击编辑权限 第四步:点击编辑 第五步:输入正要修改的密码就可以了

c++中使用lambda表达式的作用和用法

lambda表达式: 这是C11引入的一种新特性,它可以让您在需要定义函数对象的地方,直接编写一个匿名的、可以捕获上下文变量的函数体,非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似,也有…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget,可以安装一下,有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

pdf.js使用步骤

使用pdfjs 网页在线预览需要后端服务器支持 1、下载PDF.js 源码包 地址:PDF.js 2、解压源码包,将源码包放置到后端服务器 3、后端部署完成后 访问 viewer.html 类似上图 4、访问在线pdf文件 http://localhost:8081/web/viewer.html?filexxxx.pdf …

超好用的自动化测试工具——Python脚本

前言 ⾃动化测试会越来越受到重视 在移动互联⽹时代,对于质量的要求⽐PC时代⾼的多,⽽投⼊产出⽐最⾼的⾃动化测试,将会是⼤部分公司的⾸选⽅向,但需要严格掌握⼀门语⾔。 快速、高效的测试工具及脚本,能使程序猿的…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

2024腾讯云服务器优惠价格表又降价了,给同行干emo了

腾讯云优惠活动2024新春采购节活动上线,云服务器价格已经出来了,云服务器61元一年起,配置和价格基本上和上个月没什么变化,但是新增了8888元代金券和会员续费优惠,腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

C++条件变量

概述 条件变量的使用&#xff0c;其实是一种多线程通知模式&#xff0c;当线程一使用完数据后&#xff0c;通过条件变量通知其他线程&#xff0c;C11后开始支持。 说明 条件变量必须配合mutex使用&#xff0c;确保并发访问的排他性 std::unique_lock<std::mutex> loc…

文献笔记:LINE: Large-scale Information Network Embedding

paper 看完√ code复现ing https://arxiv.org/pdf/1503.03578v1.pdf 本文研究了将非常大的信息网络嵌入到低维向量空间的问题&#xff0c;这在可视化、节点分类和链路预测等许多任务中都很有用。大多数现有的图形嵌入方法无法扩展到通常包含数百万个节点的现实世界信息网络。…

【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容 指针2.0 传值调用与传址调用传值调用传址调用 一维数组与指针理解数组名使用指针深入理解一维数组 二级指针指针数组二维数组与指针 传值调用与传址调用 在开始之前&#xff0c;我们需要先了解这个概念&#xff0c;后面才能够正常的学习…

成功解决‘OpenpyxlWriter’ object has no attribute ‘save’

成功解决‘OpenpyxlWriter’ object has no attribute ‘save’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

在UniApp中引入大于40kb字体包的记录

因为项目UI需要特殊字体&#xff0c;所以给了一个80kb字体包&#xff0c;但是在正常的使用导入时候发现不生效 这是我的导入过程 1.把下载好的文件放入static/font目录中 2.在app.vue中引用 font-face { font-family: zitiming; src: url(/static/font/YouSheBiaoTiHei-2.t…

C++ //练习10.3 用accumulate求一个vector<int>中的元素之和。

C Primer&#xff08;第5版&#xff09; 练习 10.3 练习10.3 用accumulate求一个vector中的元素之和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…

【Pytorch】成功解决AttributeError: ‘tuple’ object has no attribute ‘dim’

【Pytorch】成功解决AttributeError: ‘tuple’ object has no attribute ‘dim’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

HTML---表单验证

文章目录 目录 本章目标 一.表单验证概述 二.表单选择器 属性过滤选择器 三.表单验证 表单验证的方法 总结 本章目标 掌握String对象的用法会使用表单选择器的选择页面元素会使用JQuery事件进行表单验证Ajax的概念和作用 一.表单验证概述 前端中的表单验证是在用户提交表…

《Spring Security 简易速速上手小册》第5章 高级认证技术(2024 最新版)

文章目录 5.1 OAuth2 和 OpenID Connect5.1.1 基础知识详解OAuth2OpenID Connect结合 OAuth2 和 OIDC 5.1.2 重点案例&#xff1a;使用 OAuth2 和 OpenID Connect 实现社交登录案例 Demo 5.1.3 拓展案例 1&#xff1a;访问受保护资源案例 Demo测试访问受保护资源 5.1.4 拓展案例…

HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络

HCIA-Datacom实验指导手册&#xff1a;7 构建简单 IPv6 网络 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 设备基础配置设备命名 步骤 2 配置设备及接口 IPv6 功能步骤 3 配置接口的 link-local 地址&#xff0c…