大模型Rag - 检索增强技术
一、Query-to-Doc:通过伪文档扩展语义
基本思想: 给定一个用户问题,让大语言模型(LLM)直接生成对该问题的一个回答,将该回答作为**“伪文档”**,再与原始问题拼接后送入检索系统。
目的: 利用 LLM 所生成的伪答案来填补原问题的语义空白,提升语义匹配程度,从而提高检索准确性。
实现方式:
- 提示词设计(Prompting)简单明了,例如:“请写一段话来回答以下问题:{用户问题}”
- 将生成的伪文档与问题拼接后一起用于查询(适用于稀疏检索,例如 BM25)
原始问题:
- “爱因斯坦的相对论主要讲了什么?”
生成的伪文档:
- “相对论是由爱因斯坦提出的物理理论,包括狭义相对论和广义相对论,核心观点是时间和空间不是绝对的,而是相对的。狭义相对论讨论的是高速运动中的物体行为,而广义相对论则描述了引力如何影响时空结构。”
将问题与伪文档拼接后用于搜索,提升了检索命中文档的语义相关性。
优点:
- 简单、有效
- 增强语义信息,提升召回率
二、HyDE:向量空间中的假设文档增强
HyDE(Hypothetical Document Embeddings) 的核心与 Query-to-Doc 相似,但它不是使用文本直接检索,而是将伪文档进行向量化,再与原始问题 embedding 一起平均后参与向量检索。
关键流程:
- 使用 LLM 生成一个或多个假设文档
- 对这些文档与原始问题进行向量化(embedding)
- 将多个向量做均值处理,得到一个增强后的查询向量
- 使用该向量进行相似度检索(适用于稠密检索)
示例
- 原始问题: 牛顿第一定律是什么?
- 生成假设文档:使用 LLM 对该问题生成一个简要的假设答案,作为“伪文档”
“牛顿第一定律指出,如果一个物体不受外力作用,它将保持静止状态或匀速直线运动状态。”
- 向量化处理:
- 对原始 Query 向量化,得到:embedding_query
- 对 Hypothetical Document 向量化,得到:embedding_hypo
- 向量融合: 对两个 embedding 向量进行平均处理:
enhanced_embedding = (embedding_query + embedding_hypo) / 2
- 稠密检索:使用 enhanced_embedding 在向量数据库中进行相似度检索,从而找到与“牛顿第一定律”最相关的真实文档。
优点:
- 更适合 dense retrieval 场景
- 提高嵌入向量与目标文档的接近度
- 保留更多语义细节,提升召回效果
三、子问题查询(Sub-question Querying):拆解复杂问题
当用户的问题过于复杂、包含多个子意图时,直接检索容易遗漏部分语义,影响答案质量。子问题查询策略是将一个复杂问题拆分为多个子问题,分别进行检索,再综合多个子结果来回答原始问题。
流程概述:
- 使用 LLM 将复杂问题拆解为多个更明确的子问题
- 每个子问题独立检索上下文
- 使用检索结果分别生成答案,再进行融合(或基于合并后的上下文统一回答)
关键点:
- 拆解能力依赖于 LLM 的 prompt 设计
- 子问题的生成需尽可能涵盖原始语义
四、查询改写(Query Rewriting):多角度重写以增强表达
针对语义模糊、表达不清或关键信息缺失的问题,可以使用多样化的查询改写策略。利用 LLM 生成多个语义等价但表达方式不同的查询,有助于扩大语义覆盖范围。
策略要点:
- 从多个角度(时间、空间、对象、语义风格)改写用户原始查询
- 每个改写后的问题单独检索上下文
- 汇总所有上下文信息用于最终回答
- 典型提示词设计:
示例:
- 原始问题: 秦始皇统一六国用了多久?
- 问题改写:请从5种不同角度重写下列问题,以提升其检索准确性
- 时间视角:“秦始皇从哪一年开始统一六国,到哪一年完成统一?”
- 对象聚焦视角:“秦国用了多少年打败其他六国完成统一?”
- 事件进程视角:“秦始皇统一六国的整个战争过程持续了多少年?”
- 历史背景视角:“战国时期秦始皇统一六国的时间跨度是多少?”
- 语义风格变换:“从发动战争到六国归一,秦始皇经历了多长时间?”
五、Take a Step Back:从细节中抽象问题
当用户的问题包含大量无关或干扰性细节时,可能掩盖核心意图,从而降低检索效果。Take a Step Back 技术通过将问题抽象化、通用化来消除干扰,从而提升对关键信息的关注。
流程:
-
利用 LLM 将问题抽象化,例如:“将下列问题转述为一个更通用、抽象的问题”
-
使用该抽象问题进行检索
-
最终以更全局视角提供回答
示例:
-
原始问题:“2007年到2008年间,XX球员效力于哪个球队?”
-
抽象后:“XX球员一共效力过哪些球队?”