当前位置: 首页 > web >正文

大模型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球员一共效力过哪些球队?”

http://www.xdnf.cn/news/1482.html

相关文章:

  • Docker容器化部署注意事项与常见问题
  • pycharm调试typescript
  • AIGC架构与原理
  • SwiftUI 2.Image介绍和使用
  • 【初级】前端开发工程师的面试100题(速记版)
  • 基于多用户商城系统的行业资源整合模式与商业价值探究
  • SpEl表达式使用示例
  • 简洁版C++类说明
  • 第四章:任务工作流编排
  • C语言 ——— 分支循环语句
  • Redis 主从复制
  • Codeforces Round 998 (Div. 3) ABCD
  • 深度解析 Java 中的 `computeIfAbsent`:原理、最佳实践与高级用法
  • Leetcode98、230:二叉搜索树——递归学习
  • 第12章:MCP服务端项目开发实战:数据持久化
  • React Ref引用机制解析
  • 文档构建:Sphinx全面使用指南 — 进阶篇
  • Axure中继器表格:实现复杂交互设计的利器
  • Linux磁盘管理
  • QT项目----电子相册(4)
  • 单片机通讯外设 (UART)、I2C、SPI、CAN 和 LIN 时序分析 使用场景以及优缺点对比分析报告
  • stm32之GPIO函数详解和上机实验
  • Spring Boot中的监视器:Actuator的原理、功能与应用
  • 基于PySide6与CATIA的直齿圆柱齿轮参数化建模系统开发实践
  • 湖南大学-操作系统实验四
  • 将天气查询API封装为MCP服务
  • godot源码编译
  • 【AI News | 20250423】每日AI进展
  • 数据库-基本概述 和 SQL 语言
  • SQL进阶知识:五、存储过程和函数