Advanced RAG-混合检索

Advanced RAG-混合检索
jwang混合检索的核心价值:取长补短,动态适配混合检索
- 本质是根据数据特性、查询需求和场景约束,动态组合多种检索技术:
- 向量检索擅长捕捉语义相似性,但可能受限于向量空间的表示能力;
- 关键词 / 全文检索适合精确匹配,但对自然语言表达不友好;
- SQL检索利用数据库,却难以应对非结构化文本。
适用场景
- 异构数据场景:处理多类型、多格式数据
- 复杂查询场景:兼顾精确匹配与语义理解
- 动态知识与实时性需求:融合静态知识与实时数据
- 高准确率与召回率要求:医疗、法律等关键领域
3.4. Post-Retrieval后检索
与检索前处理相对应,这是在完成检索后对检索出的相关知识块做必要补充处理的阶段。比如,对检索的结果借助更专业的排序模型与算法进行重排序或者过滤掉一些不符合条件的知识块等,使得最需要、最合规的知识块处于上下文的最前端,这有助于提高大模型的输出质量。
- 重排序:可以使用模型或者算法进行
- RAG-Fusion
- 上下文压缩和过滤
在多个查询检索后,会检索到大量的上下文,但并非所有上下文都与问题相关,有的不相关文档可能出现在文档前面,影响答案生成的准确性 |
3.4.1. RAG-Fusion
RAG-Fusion 是一种搜索方法,通过使用多重查询生成和互惠排名融合(Reciprocal Rank Fusion)对搜索结果进行重新排序。在Multi Query的基础上,对其检索结果进行重新排序(即reranking)后输出Top K个最相关文档,最后将这top k个文档喂给LLM并生成最终的答案
3.4.2. 上下文压缩和过滤
我们划分文档块的时候,通常不知道用户的查询,这意味着,与查询最相关的信息可能隐藏在一个包含大量不相关文本的文档中,这样输入给LLM,可能会导致更昂贵的LLM调用和较差的响应。
- 使用给定查询的上下文来压缩它们,以便只返回相关信息,而不是立即按原样返回检索到的文档
4. RAG应用评估
当我们准备将一个基于大模型的 RAG 应用投入生产时,有一些问题是需要提前考虑与应对的:
- 大模型输出的不确定性会带来一定的不可预知性。一个 RAG 应用在投入生产之前需要科学的测试以衡量这种不可预知性。
- 在大模型应用上线后的持续维护中,需要科学、快速、可复用的手段来衡量其改进效果,比如回答的置信度是上升了 10%还是下降了 5%?
- RAG 应用的“外挂”知识库是动态的,在不断维护的过程中,可能会产生新的知识干扰。 因此, 定期检测与重新评估是确保应用质量的重要手段。
- 由于 RAG 应用依赖基础大模型,那么如何在大量的商业与开源大模型中选择最适合企业的大模型或如何知道大模型升级一次版本对 RAG 应用产生了多大影响?
4.1. 评估方法
4.1.1. 人工
人工评估是RAG评估的基础方法,通过邀请专家或人工评估员对RAG生成的结果进行质量评估。
评估标准通常包括准确性、连贯性、相关性等。
尽管人工评估能够提供高质量的反馈,但这种方法耗时费力,且受限于评估员的主观性和经验差异
4.1.2. 自动化
自动化评估是当前RAG评估的主流和发展方向。通过利用大型语言模型和相关算法,自动化评估工具能够实现对RAG生成文本的质量评分,从而快速评估模型性能。
这种方法不仅提高了评估效率,还降低了人力成本。
4.2. RAG应用的评估依据与指标
基于大模型的RAG应用与传统应用有很大的不同:传统应用的输出大多是确定的且易于衡量的,比如输出一个确定的数值; |
任何RAG系统的有效性和性能都严重依赖于这两个核心组件:检索器和生成器。
- 检索器必须高效地识别和检索最相关的文档,而生成器应该使用检索到的信息生成连贯、相关和准确的响应。
- 在部署之前,对这些组件进行严格评估对于确保RAG模型的最佳性能和可靠性至关重要。
4.3. RAG应用的评估类型和输入
4.3.1. 评估类型
- 检索评估
检索评估的主要目标是评估上下文相关性,即检索到的文档与用户查询的匹配程度。
它确保提供给生成组件的上下文是相关和准确的。
- 响应评估
响应评估适用于系统的生成组件。
这些评估衡量系统根据检索到的文档提供的上下文有效地生成响应的能力。
4.3.2. 评估依据(评估模块的输入)
- 输入问题(question):用户在使用RAG应用时的输入问题。
- 生成的答案(answer):需要评估的RAG应用的输出,即问题的答案。
- 上下文(context):用于增强RAG应用输出的参考上下文,通常在检索阶段生成。
- 参考答案(reference_answer):输入问题的真实的正确答案,通常需要人类标注
4.3.3. 检索评估
- 上下文相关性(Context Relevancy):检索出的上下文与输入问题之间的相关性,即上下文中有多少内容与输入问题相关
若用户提问 “埃菲尔铁塔的建造年份?”, |
- 上下文精度(Context Precision): 一种是检索出的上下文context中与参考答案reference_answer相关的部分在上下文context中是否出现在最前面的位置,另一种是检索到的上下文中相关信息的比例(上下文中与问题相关的信息数量/上下文总信息数量)
问题:“苹果公司的总部在哪里?” |
- 上下文召回率(Context Recall): 衡量检索到的上下文中是否包含回答问题所需的全部关键信息,或者说检索到的上下文context与参考答案reference_answer之前的一致程度,也称为命中率hit_rate 即context Recall = 上下文中包含的关键信息数量/参考答案中关键信息数量
问题:“《三体》的作者是谁?哪一年出版?” |
4.3.4. 响应评估
响应评估适用于系统的生成组件。这些评估衡量系统根据检索到的文档提供的上下文有效地生成响应的能力。
- 忠实度(Faithfulness):生成的答案( answer)是否完全基于提供的上下文(context)信息,没有捏造、幻觉或与上下文矛盾的内容。将生成答案拆解为原子事实(如时间、地点、事件),逐一检查是否能在上下文中找到直接依据,如果存在上下文未提及的信息,即使正确,若上下文无依据也视为不忠实
问题:“爱因斯坦在哪一年获得诺贝尔奖?” |
- 答案相关性(Answer Relevancy):生成的答案(answer)是否直接、清晰地回答了用户原始的查询问题(question) 。即使答案忠实于上下文,但如果答非所问,那么这个答案也是无效的。
问题:“如何煮咖啡?” |
4.3.5. 评估指标
| 指标 | 归属 | 相关评估输入 | 含义 |
| context_recall | 检索 | 上下文(context)、参考答案(reference_answer) | 上下文中覆盖用户问题所需关键信息的比例 |
| context_precision | 检索 | 上下文(context)+ 参考答案(reference_answer)或者问题( question)+ 上下文( context) | 上下文的关键信息位置是否靠前或者是上下文的关键信息所占比例 |
| faithfulness | 响应 | 答案(answer)、上下文(context) | 生成的答案是否完全基于提供的上下文信息 |
| answer_relevancy | 响应 | 答案(answer)、问题(question) | 生成的答案是否直接、清晰地回答了用户原始的查询问题 |
| context_relevancy | 检索 | 问题( question)、上下文( context) | 上下文中有多少内容与输入问题相关,较少使用 |
4.3.6. 评估工具
ragas
RAGAs是一个用于评测检索增强生成(RAG)应用的评测框架,它的核心目标是提供一套综合性的评测指标和方法,以量化地评测RAG管道(RAG Pipeline)在不同组件层面上的性能。
RAGAs特别适用于那些结合了检索(Retrieval)和生成(Generation)两个主要组件的RAG系统,支持Langchain 和 Llama-Index。工具地址
- 评估检索质量:context_precision context_recall
- 评估生成质量:faithfulness answer_relevancy
Ragas 的 Context Precision(上下文精度)是一种衡量检索系统返回的上下文(文本块集合)中与查询相关的文本块比例的指标。 |
Trulens
TruLens是一款旨在评估和改进 LLM 应用的软件工具,相对独立,可以集成 LangChain 或 LlamaIndex 等 LLM 开发框架。
使用反馈功能来客观地衡量 LLM 应用的质量和效果。包括分析相关性、适用性和有害性等方面。TruLens 提供程序化反馈,支持 LLM 应用的快速迭代,这比人工反馈更快速、更可扩展
5. 实例-助手
在金融领域,开发一个能够仿效专家解读上市公司年报的智能对话系统,一直是人工智能技术进步的关键目标。
尽管目前的人工智能系统在文本对话领域已展现出显著的进展,但在更为精细、更具挑战性的金融领域交互方面,其性能尚需进一步提升。
比如经常看见的企业年报,属于最常见的图片、文本、表格混排的 PDF 文档,图片、表格都可以归属于半结构化或非结构化的数据。
半结构化数据对于传统 RAG 来说可能具有挑战性,文本拆分可能会分解表,从而损坏检索中的数据;嵌入表可能会给语义相似性搜索带来挑战。
通过构建摘要索引解决这个问题:分别为每个文本和表格数据创建摘要,将其嵌入文档
4.3.7. RAG应用中使用RAGAS
指标关联
这四个指标之间是有协同关系的,RAG 的性能是检索器和生成器协同工作的结果,指标之间存在紧密的关联:
- 检索器是生成器的基础: Context Recall 和 Context Precision 直接决定了输入给生成器的上下文质量。
- 理想状态: 高召回率 + 高精确率。检索器能找到所有相关信息,且只找到相关信息。
- 现实权衡: 在大规模数据集中,召回率和精确率往往难以兼得。提高召回率(找全)可能牺牲精确率(引入噪声),反之亦然。
很多业务场景,如技术文档问答或客服,倾向于优先保证信息不遗漏,因此 “高召回率 + 中等精确率” 常常是可接受甚至追求的目标
- 生成器依赖高质量输入: Faithfulness 和 Answer Relevancy 的表现很大程度上取决于检索器提供的上下文。
- 如果上下文不完整(低 Context Recall),生成器可能因缺乏信息而无法给出完整或准确的答案(影响 Answer Relevancy),甚至可能被迫“猜测”(影响 Faithfulness)。
- 如果上下文充满噪声(低 Context Precision),生成器可能难以聚焦关键信息,导致答案冗余、偏题(影响 Answer Relevancy),或错误地依据了不相关信息(影响 Faithfulness)。
同时对于context_recall和context_precision这两个指标,如果各有高低,比较难判断的时候,我们还会引入F1分数进行综合评估,F1分数用来平衡精确度和召回率,目标是找到适合特定应用需求的最佳平衡,是精确度和召回率的调和平均值:F1分数=2*(准确率*召回率/(准确率+召回率))
指标等级标准
| 指标 | 可能的问题场景 | 核心问题指向 |
| context_recall低 | 检索器未覆盖关键文档(如知识库缺失)、嵌入模型语义匹配能力不足等 | 检索器 |
| context_precision低 | 检索器返回大量无关文档、向量数据库索引策略有误、相关文档排名低等 | 检索器 |
| faithfulness低 | 生成模型未严格遵循上下文(如提示词未明确要求 “基于提供的信息回答”)、上下文过长导致信息稀释等 | 生成器 |
| answer_relevancy低 | 生成模型未准确理解问题意图(如问题复杂时未使用链式提示分解)、上下文与问题关联性弱等 | 生成器 |
| 四个指标均低 | 系统性问题,很可能是检索质量极差(Recall 和 Precision 都低),导致生成器输入混乱,进而影响 Faithfulness 和 Relevancy。也可能是问题本身超出系统能力范围。 | 检索器优先 |
系统性优化路径与策略-从基础到协同
- 性能问题,特别是多个指标偏低时
- 核心优化原则:先固根基,再求精进 (检索器优先) |
- 分阶段优化策略
第一阶段:夯实检索基础 (优化 Context Recall & Context Precision) |
提升context_recall(上下文召回率)
检索器增强
混合检索:结合BM25(关键词匹配)和向量检索,例如在医疗场景中,使用BM25召回包含特定症状术语的文档,再用向量检索补充相关病例。 |
- 知识库优化
数据清洗:去除重复或低质量文档(如网页爬取的广告内容),确保检索空间的有效性。 |
- 提升context_precision(上下文精度)
重排序技术,对检索结果进行二次排序,例如在法律场景中,优先展示与案件类型匹配的法律条文。 |
- 提升faithfulness(忠实度):在良好检索,检索器已能提供相对靠谱的上下文基础上,确保答案忠实、相关
|
- 提升answer_relevancy(答案相关性)
问题理解优化: |
- 设定合理的性能目标:因地制宜的阈值
指标的理想值并非一成不变,需结合业务场景的风险和需求来设定 |
- 行业阈值建议
医疗 / 法律 (高风险): |
- 持续评估与优化的闭环
通过 RAGAS 的四大核心指标,我们可以: |
选择合适的知识块大小-基础参数问题
- 在将外部知识特别是文档进行向量化存储时,都会使用 chunk_size 这个决定把原始知识分割成多大块( Chunk)的简单参数,而知识块也是后面从向量库中检索上下文知识的基本单位。因此chunk_size 在很大程度上会影响后面的检索与响应质量。
- chunk_size 越小,产生的知识块越多、粒度越小。尽管知识块越小,语义越精确,但是风险是携带的上下文越少,可能导致需要的重要信息不出现在检索出的顶部知识块中(特别是当 top_K 比较小时)。
- chunk_size 越大,携带的上下文越完整,但也带来语义不精确的隐患。此外,过大的 chunk_size 可能导致性能下降、携带的上下文过多,从而导致上下文窗口溢出及 token 成本升高。
- 知识块大小是否合适有时候与 RAG 应用需要完成的任务类型有关:
- 常见事实性回答,可能只需要少量特定的知识块
- 摘要、总结、对比之类的任务,你可能需要更大的知识块甚至全部知识块
- 常见的分块方式有:固定大小分块;句子分割;递归分割;专门分块(比如按标题);语义分块等等
- 每个块的大小依然是很重要的参数,多大分块合适最好的办法使用应用评估框架与评估数据集来评估不同的 chunk_size 下的各种性能指标,进而做出最优的选择
1. 通用场景推荐
128-512 tokens:这是最常见的分块区间,平衡了上下文完整性和检索效率。例如:微软研究指出,512 tokens 是较小块的基准,而企业级应用中甚至会采用 100 tokens 的块大小以提升精准度。
Databricks 实验使用 512 tokens 块大小和 256 tokens 重叠步幅,在长上下文场景中表现优异。
1024 tokens:LlamaIndex 测试显示,该大小在响应时间和质量(忠实度、相关性)之间取得最佳平衡,尤其适合需要更多上下文的复杂任务
2. 细分场景推荐
技术文档 / 学术论文:采用200-300 tokens,确保专业术语和逻辑结构的完整性。例如,微软分析显示,技术文档分块过大会导致术语稀释,影响检索准确性。
长叙事文本(如小说):可扩展至500-1000 tokens,减少分块数量以保留情节连贯性。
社交媒体 / 短文本:使用100-200 tokens,适配碎片化内容的检索需求
应用
评估中,使用LangChain的RecursiveCharacterTextSplitter分块,默认分割符,chunk_overlap为chunk_size的20%,使用阿里百炼系列模型,向量数据库FAISS, 仅使用单纯向量检索,未使用任何AdvanceRAG技术,top_K = 10。
- chunk_size = 128 ,将分块为1546个
- chunk_size = 256 ,将分块为821个
- chunk_size = 512 ,将分块为462个
- 综合来看,3种分块大小下RAG应用的性能都不错,大部分指标差距几乎都在3%以内。
如果要优中选优,chunk_size=128 的指标组表现最优。F1 分数最高,说明上下文质量综合最优,在信息完整性(Recall)和纯净度(Precision)之间达到最佳平衡,Faithfulness 和 Answer Relevancy 均处于高位,既保证回答忠实于手册内容,又能有效关联用户问题。大分块在回答相关性和信息召回上有一定优势,但上下文精确率的显著下降和 F1 分数的降低表明其引入了过多无关信息。
另外,成本也是128指标组的一大显著优势 - 在我们上面的实战中,128指标组的召回率在三者中最低,能否继续提高?提高后对其他指标是否有影响?前面我们已经知道,提高召回率有混合检索或者查询改写之类的方法。我们接下来试试,维持其他参数不变,但是改变检索器为混合检索,作为对照组,我们还同时引入一个上下文压缩检索器
从结果来看,毫无疑问我们希望提升召回率的想法通过混合检索切切实实的达到了,在召回率提升的同时,回答相关性和忠实度也得到了提升。 |
- 提升召回率、回答相关性和忠实度,但精确率太低了,有没有办法改善
5.1. 步骤
- 首先用Unstructured 来提取文档 (PDF) 中的文本和表格,并进行分块
- 然后用LLM分别对每个文本和表格创建摘要,将其嵌入向量数据库
- 最后通过摘要使用MultiVectorRetriever过滤出相关文档,喂给LLM当作上下文
Unstructured 使用:
- tesseract :用于光学字符识别 (OCR)
- poppler :用于 PDF 渲染和处理
5.2. PDF中存在图片
借助多模态视觉大模型(比如 Qwen-VL、 GPT-4V 等)结合 OCR技术对图片进行理解是常见的方法。这还可以进一步分为以下两种情况。
a.纯文字信息图片:可利用 OCR 技术识别成纯文本,再按照普通的文本做索引与检索。
b.其他图片:借助多模态视觉大模型理解并生成图片的摘要用于索引与检索,但是在检索后需要递归检索出原始图片用于后面的生成
生成答案时,如果只需要文字,大语言模型就可以,但是希望图文混排,那么需要借助多模态大模型生成答案,并且要将对应的原始表格或者图片交给多模态大模型















