【大模型应用笔记】检索增强生成(RAG)是什么?
基础介绍
RAG(Retrieval Augmented Generation):为模型配备了一个"外部记忆库"(an external memory bank),类似于配置一个随时可访问的参考资料系统(a system capable of real-time reference retrieval)。例如,在企业客服系统中,则可以根据最新的产品手册来解答用户的问题(can address user inquiries based on the latest product manuals)。其主要优势在于显著提高回答准确性和降低解答错误率(significantly improves answer accuracy and reduces the risk of incorrect responses),同时支持动态更新知识库以适应最新信息变化(capable of dynamically updating knowledge bases to reflect evolving information needs)。
- 搜索:从数据库中获取相关文档
- 优化:将提取出的相关数据整合进prompt字段
- 输出:模型基于优化后的上下文信息输出回答

知识预处理-文档智能解析
文档智能解析的基础步骤:
- 文档预处理阶段
- 文档格式转换:将不同格式(PDF、Word、图片等)统一转换为可处理的格式
- 图像增强:对扫描文档进行去噪、二值化、倾斜校正等处理
- 页面分割:将文档页面分割为不同的区域(文本、表格、图片等)
- 文字识别(OCR)
- 基础OCR:识别标准印刷体文字
- 手写体识别:处理手写文档
- 特殊字符识别:处理数学公式、特殊符号等
- 多语言支持:处理不同语言的文字
- 版面分析
- 文档结构分析:理解文档的层次结构
- 布局分析:识别标题、正文、页眉页脚等
- 表格识别:识别表格结构和内容
- 图文关系分析:理解图片和文字的关联性
- 信息提取
- 关键信息提取:识别文档中的重要字段(如日期、金额、名称等)
- 实体识别:识别文档中的命名实体(人名、地名、组织机构等)
- 关系抽取:分析实体之间的关系
- 表格数据结构化:将表格内容转换为结构化数据
- 语义理解
- 文本分类:对文档进行分类
- 关键词提取:提取文档主题词
- 文本摘要:生成文档摘要
- 问答系统:基于文档内容回答问题
- 后处理
- 数据验证:验证提取信息的准确性
- 格式标准化:统一数据格式
- 结果输出:生成结构化的输出结果
- 质量控制:进行错误检查和纠正
知识预处理-文本分块
文本分块的方法有:
| 分类 | 方法 | 说明 |
|---|---|---|
| 基础分块方法 | 固定长度分块 | 按照固定字符数或token数进行切分 |
| 句子分块 | 基于标点符号或自然语言处理进行句子级别分割 | |
| 段落分块 | 根据段落标记(如换行符)进行分块 | |
| 语义分块 | 基于语义完整性进行智能分块 | |
| 高级分块方法 | 滑动窗口分块 | 固定窗口大小 重叠窗口(设置重叠率) 动态调整窗口大小 |
| 递归分块 | 自顶向下逐层分割 基于文档结构的层次分块 主题边界检测 |
Query理解
用户的query往往呈现为不确定性的、松散格式化以及细节丰富的特征。Query理解作为一种技术方案,在这一过程中需要实现五个核心目标:首先深入解析用户的意图需求;其次精准提炼关键搜索要素;再次解决多义词或模糊表述问题;其后补充背景知识以丰富搜索语境;最后最大化提高检索效率。
| 方法分类 | 方法 | 说明 | 举例 |
|---|---|---|---|
| query改写: 解决查询表达不完整或不准确的问题 | 上下文信息补全 |
- 借助对话记录填充当前查询的背景信息。
- 基于背景信息提升查询的完整度。
- 解决指代消解问题以明确代词指向。
| 示例Query:"感冒多久了?" 补全过程:
最近身体不适出现了感冒症状持续多久
- 通过多维度变体将单一查询扩展为多个相关搜索指标
- 综合多源结果进行有序整合排序
- 优化搜索全面性与精确度并提升数据覆盖范围
| 示例Query:"维生素C的作用是什么?" 改写过程:
- 了解维生素C在人体健康中的具体作用是什么。
- 详细说明VC在人体内的主要功能有哪些。
- 深入探讨维生素C对免疫力提升的具体影响有多大。
融合多个查询结果,综合排序得出最终答案。 |
|Multi query|
- 生成多样化的多种表述方式查询
- 通过多维度分析的角度描述同一需求
- 提升检索效果的召回率
| 示例Query:"高血压怎么治疗?" 多样化表达:
- 高血压患者可用哪些治疗方法?
- 针对高血压采取什么措施?
- 针对高血压患者应制定怎样的日常健康管理方案?
- 患者应该服用哪些药物治疗?
- 将复杂的查询拆解为多个子query
- 利用递归的方法对每一个子query进行分析以获取中间结果
- 将这些中间结果作为上下文信息用于处理下一层query
- 最后整合所有中间结果以形成完整的最终回答
- 特别适用于那些需要多层次推理和处理依赖关系的复杂问题
| 示例Query:"最近很疲倦,还头疼,应该去看什么科室?" 递归过程:
- "疲倦会引起什么病?"
- 贫血
- 抑郁症
- 甲状腺功能异常
- 睡眠障碍
- "哪些病会导致头疼?"
- 偏头痛
- 颈椎病
- 高血压
- 神经衰弱
- "综合疲倦和头疼的症状,应该去看什么科室?"
- 建议先去神经内科
- 如有需要可转诊内分泌科或心理科
- 对简单明确的查询直接给出答案
- 不需要复杂分解和推理
- 提高响应速度
| 示例Query:"阿司匹林的常用剂量是多少?" 直接给出答案:"阿司匹林常用剂量为100mg/次" |
|---|
- 创建模拟性的中间桥梁用于假设性文档生成
- 提升查询在意义契合度上的匹配
- 优化检索效果以提高相关性
| 示例Query:"如何缓解焦虑?" 假设性文档生成: "焦虑是一种常见的心理状态,主要表现为持续的担忧和紧张。缓解焦虑的方法包括:规律运动、冥想放松、充足睡眠、寻求专业帮助等。 通过这个假设性文档来增强查询效果。" |
|---|
- 通过将具体查询抽象到更高层面来实现更加深入的数据分析
- 主动获取更为全面的背景知识以丰富知识图谱的内容
- 通过退一步思考来获得更为全面的理解和认知
| 示例Query:"耳鸣是什么原因造成的?" 抽象提升:
从整体上认识:"耳鸣属于听觉系统疾病的一种临床特征"
||
在实际应用中,这些方法往往需要组合使用:
- 在回答查询时需先补充相关的上下文信息以保证完整性。
- 依据查询复杂性选择是否对内容进行分解与直接回应。
- 采用优化策略来提高搜索结果的质量。
- 最后通过融合多种数据源综合分析结果。
举例说明这类问题通常采用以下步骤解决:首先进行数据查询操作以确定现任秘书长是谁;然后根据上一步的结果继续查询其任职期间的历史记录;接着再次进行相关数据的检索以了解其主要贡献;最后将获取的信息综合分析后得出最终答案。
递归回答的优势:
- 具备处理复杂多步骤查询的能力
- 通过多种方法确保每一步推理的准确性
- 提供详细的推理路径说明
- 便于对问题进行分解并验证结果
索引&检索
| 分类 | 方法 | 示例 | 优势 |
|---|
| 密集向量索引方法 | HNSW (基于分层导航的小世界模型) | 应用领域:医疗问答系统
我最近经常感觉疲惫,请帮助我制定改善计划。
1. 首先,请将您的症状描述转化为768维向量进行建模。
2. 接下来,在HNSW索引中快速定位与医疗文档高度相关的搜索结果。
3. 最后,系统将输出与输入内容最为契合的前K条专业建议。
|检索速度快,适合大规模语义相似度搜索|
| FAISS (Facebook AI Similarity Search) | 示例场景:商品推荐系统
- 用户行为:查看了一套蓝色连衣裙
- 处理流程:
- 生成商品特征向量
- 使用FAISS高效地找到相似商品
- 推荐具有相似风格或颜色搭配的服装
|支持大规模向量检索,可GPU加速|
| 稀疏向量索引方法 | BM25| 示例场景:技术文档搜索
- 查询:解决Python开发环境配置难题
- 处理流程:
- 评估关键词的重要性
- 选择高频词和较短文档
- 最终筛选出最优的技术方案
- 处理流程:
|精确匹配关键词,计算效率高|
| 倒排索引| 示例场景:新闻搜索系统
- 搜索:"2024年人工智能演进"
- 处理流程:
- 迅速识别包含关键词的文档
- 评估关键词在文档中的频率及位置以确定相关性
- 输出与查询高度相关的新闻报道
- 处理流程:
|快速定位关键词,节省存储空间|
| 混合检索策略 | 双路检索| 示例场景:法律文档检索
- 查询:"围绕知识产权侵权领域的最新判例信息"
- 处理流程:
- 基于向量分析的技术进行语义关联度计算,在数据库中获取与查询内容高度相关的文档集合
- 利用法律术语数据库进行精确匹配,并结合多源信息提升搜索准确性
- 综合两种检索结果并根据相关性权重进行优化处理以提高最终结果的质量
- 处理流程:
|结合语义理解和精确匹配的优点|
| 多级检索| 示例场景:电商搜索
查询:"适合送给母亲的母亲生日礼物"
处理流程:
初步筛选阶段:快速定位商品类别
详细评估阶段:综合考虑价格与商品评价
最终优化阶段:基于用户特征进行个性化排序
|层层筛选,提高准确性|
| 特殊场景处理 | 长文本检索| 示例场景:学术论文搜索
查询:医疗影像领域的深度学习应用研究
处理流程:
1. 对论文内容进行模块划分
2. 对各个模块构建索引系统
3. 在检索过程中全面考量各模块之间的关联
|处理长文本更准确|
| 实时检索| 示例场景:社交媒体内容搜索
- 查询:"实时追踪的热点动态"
- 处理流程:
- 持续更新索引数据库
- 采用增量式更新机制
- 迅速响应最新的内容变化
- 处理流程:
|保证信息时效性|
用简单的比喻和例子来说明索引和检索的区别:
想象一下图书馆的场景:
- 索引(Index)相当于图书馆的"图书目录系统",是提前建立的数据结构,用于快速定位信息,是一个"准备"的过程
- 例子:
- 图书馆按照主题、作者、书名建立卡片目录
- 为书籍分类编号,并记录在书架上的具体位置
- 建立电子检索系统,记录每本书的关键信息
- 检索(Retrieval)相当于"查找具体的书籍"的过程,是利用索引来找到所需信息的过程,是一个"使用"的过程。
- 例子:
- 通过书名在目录系统中查找
- 根据分类号去对应书架找书
- 输入关键词搜索电子系统
为什么RAG技术在大模型广泛应用后才流行起来?
RAG(检索增强生成)作为一种概念和技术其实历史悠久,在一定程度上可追溯至其核心思想的提出与演进。RAG技术虽然在其发展过程中一度未得到广泛认可,在大模型的广泛应用后才逐渐兴起主要原因包括技术突破与应用场景拓展等多重因素的影响。
- 大模型的局限性因素推动了RAG的发展需求
- 尽管大模型拥有丰富的知识资源 但仍面临着时效性方面的限制(主要原因是训练数据的时间界限)
- 大模型容易导致幻觉生成 即可能导致生成看似合理而实际上不够准确的内容
- 大模型的知识更新机制尚无法实现实时更新 而企业往往需要基于最新信息提供及时反馈
- 大模型的能力是实现RAG的基础保障
- 大模型强大的自然语言理解能力使其能够精准解析检索到的文档内容
- 大模型具备卓越的上下文学习能力 因此能够有效整合检索到的关键信息
- 大模型强大的推理能力使其能够将零散的信息片段整合成完整的回答框架
- 技术层面的相关依赖关系
- 随着Embedding技术的发展 它们为RAG中的相似度计算奠定了基础
- Prompt Engineering的进步促进了信息引导能力的提升
- 向量数据库的技术进步则为高效存储和检索提供了基础设施支持
- 大模型的能力是实现RAG的基础保障
总体而言,在人工智能领域中,RAG与大型语言模型之间存在着相互补充的关系。具体而言,大型语言模型为RAG提供了基础性的语言理解和生成能力,而RAG则显著增强了大型语言模型在知识更新速度和准确性方面的局限性,这种相互结合的方式使得两者共同构建出更加高效、可靠的AI应用场景。
