如何让RAG性能优化,引入上下文检索成为杀手锏?
- 内容介绍
- 文章标签
- 相关推荐
如何让RAG性能优化,引入上下文检索成为杀手锏?
搞个RAG系统好像成了每个开发者的标配。但是说实话,你真的觉得你的RAG好用吗呃?很多时候,我们辛辛苦苦搭建的系统,回答起问题来就像个只会复读的傻子,完全抓不住重点。这到底是为什么?其实很多时候问题不在于模型,而在于你给它的“饲料”不够好。今天我们要聊的,就是如何通过引入“上下文检索”这个杀手锏,让你的RAG系统性能原地起飞。
说到优化,这让我想起了以前做Android开发时的日子。Android 性能优化之布局 .布局优化,最主要的是层级的优化,一般而言,优秀的app标准是普通布局层级嵌套不要超过三层,这样在绘制布局才能快速,并且findViewById时,才能迅速找到对应的view,缩短时间.其实RAG也是一样, 别纠结... 如果你的检索层级太深,或者切分的块太碎,模型在“绘制”答案的时候就会慢得像蜗牛。我们需要一种更扁平、更直观的方式。

传统RAG的痛点:上下文的丢失
靠谱。 开发者通常通过 RAG AI 模型的知识。RAG 是一种从知识库中检索相关信息并将其附加到用户提示词中的方法,从而显著提升模型的回答能力。但传统的 RAG 解决方案在编码信息时会丢失上下文,导致系统无法从知识库中检索到相关信息。这就像你只告诉别人“吃饭”,却不告诉他“在哪家餐厅”、“跟谁吃”、“吃什么”,他怎么知道你在说什么?
一个相关的文本块可能包含:“公司收入比上一季度增长了 3%。”只是这个块本身并未指明是哪家公司或哪个时间段,导致很难检索到正确的信息或有效使用这些信息。当用户问“ACME公司怎么样?”的时候,系统根本不知道这个块属于ACME,于是它就瞎编,或者干脆说“我不知道”。这就是传统RAG最大的坑。
上下文检索:打破僵局的利器
为了解决这个问题,我们祭出了“上下文检索”。这玩意儿听起来很高大上,其实原理很简单:在把文本块喂给模型之前,先给它加上一段“解释性文字”。 弯道超车。 上下文检索通过在嵌入前将块特定的解释性上下文添加到每个块中以及创建 BM25 索引来解决此问题。
勇敢一点... 比方说 假设你的知识库中嵌入了一个财务信息集合,你收到如下问题:“2023 年第二季度 ACME 公司收入增长了多少?”
说真的... 原始文本块 = “公司收入比上一季度增长了 3%。”
上下文化文本块 = “本块来自 ACME 公司 2023 年第二季度的证券交易委员会文件;上一季度的收入为 3.14 亿美元。公司收入比上一季度增长了 3%。”,牛逼。
看到了吗?加上这段话,模型瞬间就明白了:哦,这是ACME公司, 他急了。 2023年Q2的数据。检索的准确率直接翻倍!
技术实现:别手动, 用AI
当然手动为知识库中的成千上万个块注释上下文太费力。为实现上下文检索,我们转向了 Claude。我们编写了一个提示词,指示模型提供简洁、特定于块的上下文,使用整个文档的上下文来解释该块。我们使用了以下 Claude 3 Haiku 提示词为每个块生成上下文:,这家伙...
{{世卫LE_DOCUMENT}} 这是我们希望在整个文档中定位的块{{CHUNK_CONTENT}} 请提供简短的上下文,以便在文档中更好地定位此块以改进搜索检索。只回答简短的上下文,别无其他。
冲鸭! 生成的上下文文本通常为 50 到 100 个 token,将其附加到文本块之前进行嵌入并创建 BM25 索引。实际预处理流程的示意图虽然我没法画出来 但你可以想象一下每个块都贴上了一个“标签”,写着“我是谁,我从哪里来”。
混合检索:BM25与嵌入的完美结合
没眼看。 光有上下文还不够,我们还得讲究策略。下图显示了在所有知识领域中使用最优嵌入配置并检索前 20 个块的平均表现。我们使用 1 减去 Recall@20 作为评估指标,它衡量前 20 个块中未能检索到相关文档的百分比。你可以在附录中看到完整后来啊——上下文化提高了我们评估的每种嵌入源组合的表现。
尽管嵌入模型擅长捕捉语义关系,但它们可能会错过重要的精确匹配。幸运的是有一种较老的技术可以在这些情况下提供帮助。BM25是一种排名函数,使用词汇匹配来查找精确的单词或短语匹配。对于包含唯一标识符或技术术语的查询,它特别有效。
恕我直言... BM25 基于 TF-IDF的概念。TF-IDF 衡量一个单词在文档集合中的重要性。BM25 通过考虑文档长度并对词频应用饱和函数来改进这一点,这有助于防止常见词主导后来啊。
我懵了。 通过利用 BM25 和嵌入模型, 传统的 RAG 系统可以提供更全面和准确的后来啊,平衡精确术语匹配和广泛语义理解。在运行时当用户向模型输入查询时向量数据库用于的提示词中。
性能提升数据:用事实说话
实验表明:该方法可将检索未命中率减少49%, 结合重新排序后甚至可减少67%。这些改进显著提高检索准确性,进而提升下游任务表现,最后说一句。。
具体而言, 我们发现,重新排序后的上下文嵌入和上下文 BM25 将前 20 个块检索未命中率降低了 67%。这不仅仅是数字的提升,这是用户体验质的飞跃!
| 检索策略 | 未命中率 | 成本 | 适用场景 |
|---|---|---|---|
| 传统嵌入 | 5.7% | 低 | 通用语义搜索 |
| 上下文嵌入 | 3.5% | 中 | 需要上下文的复杂文档 |
| 上下文 + BM25 | 2.1% | 中 | 包含特定术语或代码的查询 |
| 上下文 + BM25 + 重排序 | 1.9% | 高 | 追求极致准确率的企业级应用 |
成本与延迟:不得不考虑的现实
我深信... 虽然效果好,但钱袋子也得顾着。得益于 Claude 的特殊提示词缓存功能,上下文检索在低成本上。使用提示词缓存,你无需为每个块传入参考文档。你只需将文档一次性加载到缓存中,然后引用先前缓存的内容。假设每个块 800 个 token, 文档 8,000 个 token,50 个 token 的上下文指令,以及每个块 100 个 token 的上下文,生成上下文化块的一次性成本为每百万文档 token 1.02 美元。
试着... 重新排序的一个重要考虑因素是对延迟和成本的影响,特别是在对大量文本块进行重新排序时。主要原因是重新排序在运行时增加了额外的步骤,必然会增加少量延迟,尽管重新排序器会并行对所有文本块进行评分。在检索更多文本块以提高性能与检索较少文本块以降低延迟和成本之间存在权衡。我们建议在你的具体用例上进行不同设置的实验,找到合适的平衡点。
其他优化杂谈:从Tomcat到Python
体验感拉满。 说到性能优化,这真是个无底洞。就像我们做后端优化一样, 安装Apache Tomcat Native Library,直接启动就支持apr(它本身是基于APR的. 具体安装方法可以参考其他博客和文章.排除代码问题Tomcat优化到这个层次,可以应对大部分性能需求..Tomcat在各位JavaWeb从业者常常就是默认的开发环境,但是Tomcat的默认配置作为生产环境,特别是内存和线程的配置,默认都很低,容易成为性能瓶颈.幸好Tomcat还有很多的提升空间.下文介绍一下Tomcat优化,可以分为内存,线程,IO.....
我算是看透了。 如果你是在Python环境下搞这些,如果想要在python中使用已经有C类库,使用ctypes是很好的选择,有一些基准测试下,python+ctypes是性能最好的方式。.CPython原生API: 优化 数据结构选择、循环优化并行编程等多个方面,旨在帮助开发者提高程序施行效率。.CPython原生API: 通过引入Python.h头文件,对应的C程序中可以直接使用Python的数据结构.
的终极杀器:多线程处理.“性能优化就像挤出海绵中的水,能挤出多...这些异步化是不能解决的,得需要靠一些算法的优化,或者一些高性能框架. AsyncContext ac=req.startAsync;用于获取异步上下文,后续我们通过这...,就这样吧...
前端视角的优化思考
别以为后端优化完了就万事大吉,前端的展示也很重要。还有啊,优化渲染性能的方法包括理解setData工作原理,减少setData的调用,局部更新列表,谨慎处理后台页面JS,合理使用小程序组件,以及实施图片懒加载等策略。.2020年零基础前端学习路线825512020最全前端面试系列332722020最全前端面试系列194942020最全前端面试系列....,梳理梳理。
使用这些优化方式一般是针对已有项目性能瓶颈模块的优化,可以在少量改动原有项目的情况下大幅度地提高整个程序的运行效率。.CPython原生API: 通过引入Python.h头文件,对应的C程序中可以直接使用Python的数据结构.
大量测试比较上述所有技术的不同组合,跨各种数据集类型,换个角度。。
有时最简单的解决方案就是最好。如你的知识库小于 200,000 个 token, 你可直接将整个知识库包含在给模型的提示词中, 我满足了。 无需 RAG 或类似方法。但对于无法放入的更大知识库,RAG 是典型的解决方案。RAG 通过以下步骤预处理知识库:
1. 始终进行评估的响应可能会得到改进。 2. 方法论代码语言 盘它... :plaintext 3. 性能提升不要只看理论,要看实际效果。
市场上有多种重新排序模型。我们使用 Cohere reranker 进行了测试。Voyage 也提供了重新排序器, 他破防了。 但我们没有时间进行测试。我们的实验表明,跨多个领域,添加重新排序步骤进一步优化了检索。
如果你有兴趣使用上下文检索,可通过我们的操作指南入手。可通过操作指南轻松部署自己的上下文检索解决方案。我们鼓励所有使用知识库的开发者通过我们的操作指南进行实验,以解锁新的性能水平。
再说说需要留意的是过去曾提出过其他使用上下文改进检索的方法。其他提案包括:为文本块添加通用文档摘要,使用假设文档嵌入,以及基于摘要的索引。这些方法与本文提出的方案不同。
所以呢,引入机器学习技术进行数据库性能优化是一种创新且高效的解决方案.在本文中,我们研究了分类和的性能指标,并讨论了优化效果更好的指标.别犹豫了 赶紧去试试上下文检索吧,让你的RAG系统不再是个只会瞎扯的机器人,挖野菜。!
如何让RAG性能优化,引入上下文检索成为杀手锏?
搞个RAG系统好像成了每个开发者的标配。但是说实话,你真的觉得你的RAG好用吗呃?很多时候,我们辛辛苦苦搭建的系统,回答起问题来就像个只会复读的傻子,完全抓不住重点。这到底是为什么?其实很多时候问题不在于模型,而在于你给它的“饲料”不够好。今天我们要聊的,就是如何通过引入“上下文检索”这个杀手锏,让你的RAG系统性能原地起飞。
说到优化,这让我想起了以前做Android开发时的日子。Android 性能优化之布局 .布局优化,最主要的是层级的优化,一般而言,优秀的app标准是普通布局层级嵌套不要超过三层,这样在绘制布局才能快速,并且findViewById时,才能迅速找到对应的view,缩短时间.其实RAG也是一样, 别纠结... 如果你的检索层级太深,或者切分的块太碎,模型在“绘制”答案的时候就会慢得像蜗牛。我们需要一种更扁平、更直观的方式。

传统RAG的痛点:上下文的丢失
靠谱。 开发者通常通过 RAG AI 模型的知识。RAG 是一种从知识库中检索相关信息并将其附加到用户提示词中的方法,从而显著提升模型的回答能力。但传统的 RAG 解决方案在编码信息时会丢失上下文,导致系统无法从知识库中检索到相关信息。这就像你只告诉别人“吃饭”,却不告诉他“在哪家餐厅”、“跟谁吃”、“吃什么”,他怎么知道你在说什么?
一个相关的文本块可能包含:“公司收入比上一季度增长了 3%。”只是这个块本身并未指明是哪家公司或哪个时间段,导致很难检索到正确的信息或有效使用这些信息。当用户问“ACME公司怎么样?”的时候,系统根本不知道这个块属于ACME,于是它就瞎编,或者干脆说“我不知道”。这就是传统RAG最大的坑。
上下文检索:打破僵局的利器
为了解决这个问题,我们祭出了“上下文检索”。这玩意儿听起来很高大上,其实原理很简单:在把文本块喂给模型之前,先给它加上一段“解释性文字”。 弯道超车。 上下文检索通过在嵌入前将块特定的解释性上下文添加到每个块中以及创建 BM25 索引来解决此问题。
勇敢一点... 比方说 假设你的知识库中嵌入了一个财务信息集合,你收到如下问题:“2023 年第二季度 ACME 公司收入增长了多少?”
说真的... 原始文本块 = “公司收入比上一季度增长了 3%。”
上下文化文本块 = “本块来自 ACME 公司 2023 年第二季度的证券交易委员会文件;上一季度的收入为 3.14 亿美元。公司收入比上一季度增长了 3%。”,牛逼。
看到了吗?加上这段话,模型瞬间就明白了:哦,这是ACME公司, 他急了。 2023年Q2的数据。检索的准确率直接翻倍!
技术实现:别手动, 用AI
当然手动为知识库中的成千上万个块注释上下文太费力。为实现上下文检索,我们转向了 Claude。我们编写了一个提示词,指示模型提供简洁、特定于块的上下文,使用整个文档的上下文来解释该块。我们使用了以下 Claude 3 Haiku 提示词为每个块生成上下文:,这家伙...
{{世卫LE_DOCUMENT}} 这是我们希望在整个文档中定位的块{{CHUNK_CONTENT}} 请提供简短的上下文,以便在文档中更好地定位此块以改进搜索检索。只回答简短的上下文,别无其他。
冲鸭! 生成的上下文文本通常为 50 到 100 个 token,将其附加到文本块之前进行嵌入并创建 BM25 索引。实际预处理流程的示意图虽然我没法画出来 但你可以想象一下每个块都贴上了一个“标签”,写着“我是谁,我从哪里来”。
混合检索:BM25与嵌入的完美结合
没眼看。 光有上下文还不够,我们还得讲究策略。下图显示了在所有知识领域中使用最优嵌入配置并检索前 20 个块的平均表现。我们使用 1 减去 Recall@20 作为评估指标,它衡量前 20 个块中未能检索到相关文档的百分比。你可以在附录中看到完整后来啊——上下文化提高了我们评估的每种嵌入源组合的表现。
尽管嵌入模型擅长捕捉语义关系,但它们可能会错过重要的精确匹配。幸运的是有一种较老的技术可以在这些情况下提供帮助。BM25是一种排名函数,使用词汇匹配来查找精确的单词或短语匹配。对于包含唯一标识符或技术术语的查询,它特别有效。
恕我直言... BM25 基于 TF-IDF的概念。TF-IDF 衡量一个单词在文档集合中的重要性。BM25 通过考虑文档长度并对词频应用饱和函数来改进这一点,这有助于防止常见词主导后来啊。
我懵了。 通过利用 BM25 和嵌入模型, 传统的 RAG 系统可以提供更全面和准确的后来啊,平衡精确术语匹配和广泛语义理解。在运行时当用户向模型输入查询时向量数据库用于的提示词中。
性能提升数据:用事实说话
实验表明:该方法可将检索未命中率减少49%, 结合重新排序后甚至可减少67%。这些改进显著提高检索准确性,进而提升下游任务表现,最后说一句。。
具体而言, 我们发现,重新排序后的上下文嵌入和上下文 BM25 将前 20 个块检索未命中率降低了 67%。这不仅仅是数字的提升,这是用户体验质的飞跃!
| 检索策略 | 未命中率 | 成本 | 适用场景 |
|---|---|---|---|
| 传统嵌入 | 5.7% | 低 | 通用语义搜索 |
| 上下文嵌入 | 3.5% | 中 | 需要上下文的复杂文档 |
| 上下文 + BM25 | 2.1% | 中 | 包含特定术语或代码的查询 |
| 上下文 + BM25 + 重排序 | 1.9% | 高 | 追求极致准确率的企业级应用 |
成本与延迟:不得不考虑的现实
我深信... 虽然效果好,但钱袋子也得顾着。得益于 Claude 的特殊提示词缓存功能,上下文检索在低成本上。使用提示词缓存,你无需为每个块传入参考文档。你只需将文档一次性加载到缓存中,然后引用先前缓存的内容。假设每个块 800 个 token, 文档 8,000 个 token,50 个 token 的上下文指令,以及每个块 100 个 token 的上下文,生成上下文化块的一次性成本为每百万文档 token 1.02 美元。
试着... 重新排序的一个重要考虑因素是对延迟和成本的影响,特别是在对大量文本块进行重新排序时。主要原因是重新排序在运行时增加了额外的步骤,必然会增加少量延迟,尽管重新排序器会并行对所有文本块进行评分。在检索更多文本块以提高性能与检索较少文本块以降低延迟和成本之间存在权衡。我们建议在你的具体用例上进行不同设置的实验,找到合适的平衡点。
其他优化杂谈:从Tomcat到Python
体验感拉满。 说到性能优化,这真是个无底洞。就像我们做后端优化一样, 安装Apache Tomcat Native Library,直接启动就支持apr(它本身是基于APR的. 具体安装方法可以参考其他博客和文章.排除代码问题Tomcat优化到这个层次,可以应对大部分性能需求..Tomcat在各位JavaWeb从业者常常就是默认的开发环境,但是Tomcat的默认配置作为生产环境,特别是内存和线程的配置,默认都很低,容易成为性能瓶颈.幸好Tomcat还有很多的提升空间.下文介绍一下Tomcat优化,可以分为内存,线程,IO.....
我算是看透了。 如果你是在Python环境下搞这些,如果想要在python中使用已经有C类库,使用ctypes是很好的选择,有一些基准测试下,python+ctypes是性能最好的方式。.CPython原生API: 优化 数据结构选择、循环优化并行编程等多个方面,旨在帮助开发者提高程序施行效率。.CPython原生API: 通过引入Python.h头文件,对应的C程序中可以直接使用Python的数据结构.
的终极杀器:多线程处理.“性能优化就像挤出海绵中的水,能挤出多...这些异步化是不能解决的,得需要靠一些算法的优化,或者一些高性能框架. AsyncContext ac=req.startAsync;用于获取异步上下文,后续我们通过这...,就这样吧...
前端视角的优化思考
别以为后端优化完了就万事大吉,前端的展示也很重要。还有啊,优化渲染性能的方法包括理解setData工作原理,减少setData的调用,局部更新列表,谨慎处理后台页面JS,合理使用小程序组件,以及实施图片懒加载等策略。.2020年零基础前端学习路线825512020最全前端面试系列332722020最全前端面试系列194942020最全前端面试系列....,梳理梳理。
使用这些优化方式一般是针对已有项目性能瓶颈模块的优化,可以在少量改动原有项目的情况下大幅度地提高整个程序的运行效率。.CPython原生API: 通过引入Python.h头文件,对应的C程序中可以直接使用Python的数据结构.
大量测试比较上述所有技术的不同组合,跨各种数据集类型,换个角度。。
有时最简单的解决方案就是最好。如你的知识库小于 200,000 个 token, 你可直接将整个知识库包含在给模型的提示词中, 我满足了。 无需 RAG 或类似方法。但对于无法放入的更大知识库,RAG 是典型的解决方案。RAG 通过以下步骤预处理知识库:
1. 始终进行评估的响应可能会得到改进。 2. 方法论代码语言 盘它... :plaintext 3. 性能提升不要只看理论,要看实际效果。
市场上有多种重新排序模型。我们使用 Cohere reranker 进行了测试。Voyage 也提供了重新排序器, 他破防了。 但我们没有时间进行测试。我们的实验表明,跨多个领域,添加重新排序步骤进一步优化了检索。
如果你有兴趣使用上下文检索,可通过我们的操作指南入手。可通过操作指南轻松部署自己的上下文检索解决方案。我们鼓励所有使用知识库的开发者通过我们的操作指南进行实验,以解锁新的性能水平。
再说说需要留意的是过去曾提出过其他使用上下文改进检索的方法。其他提案包括:为文本块添加通用文档摘要,使用假设文档嵌入,以及基于摘要的索引。这些方法与本文提出的方案不同。
所以呢,引入机器学习技术进行数据库性能优化是一种创新且高效的解决方案.在本文中,我们研究了分类和的性能指标,并讨论了优化效果更好的指标.别犹豫了 赶紧去试试上下文检索吧,让你的RAG系统不再是个只会瞎扯的机器人,挖野菜。!

