AI 02 |RAG检索增强生成概念理解及技术实现
一、前言
LLM技术爆发之后,RAG常出现在大模型相关的话题中,我看过很多视频、文章,一些有关AI的技术词汇碎片化的总往我的脑子里钻。决定记录下来,总结下来,把一些好的实践、知识,用这种方式让自己理解的更深入一些。
今天来分享一下我对RAG的理解,从底层去了解这个技术到底是什么。简单的说,人类在回答问题时,经常需要查阅外部资料。RAG模仿了这种"查阅-理解-回答"的认知过程,让AI系统也能利用外部的知识源。
二、理解RAG概念
很多的视频、文章,讲解出来的RAG总是太泛化了,Retrieval-Arguement Generation 检索增强生成,很难去真正get这个架构为什么叫检索增强生成?这里面每个词富含的意义是什么,以及每个节点可以用什么相关技术去实现。首先,RAG中涉及到3个单词Retrieval、Arguement、Generation,既然起名叫这个,那理解每个单词在RAG中的含义,便是第一步。
Retrieval检索
Retrieval 在英语中的含义是检索(不可数名词);找回;取回,它可以指把信息找出来;也可以指把实物拿回来,在计算机领域,基本可以用检索,指把信息找出来。
eg.信息检索 A good retrieval system can find relevant documents quickly.
在RAG中,"检索"不仅仅是简单的搜索,是基于语义检索,而非传统的关键词匹配,比如怎么样可以睡的更好,通过RAG中的检索,会搜寻到改善睡眠、促进良好休息这种语义相关,但措辞不一样的内容。
语义检索通过向量空间中的相似度计算,向量空间中的相似度计算:检索过程实际上是在高维向量空间中寻找最近邻。问题和文档都被编码成向量(预先向量化),通过余弦相似度等度量找出最相关的内容。这使得检索能够捕捉深层的语义关联。多粒度检索策略:可以是段落级、句子级甚至文档级的检索,根据需求灵活调整检索的粒度和范围。
Arguement增强
把检索到的相关信息和原始查询合并,形成更丰富的上下文提示(Prompt),并输入到语言模型中,"增强"是RAG的核心价值所在,有知识的增强,这个理解为可以给语言模型补充训练数据中可能缺失或过时的知识,而通过使用的专业知识库来弥补;有上下文的增强,通过提供具体、相关的背景信息,让模型的推理、生成有基础而非信息堆砌,是选择和组织后的相关上下文,同时通过这样信息来源和参考依据,增强输出的可信度,可验证性。
Generation生成
RAG中的生成是以检索到的信息为条件,模型需要基于提供的上下文(有检索出来的信息和原始查询)生成连贯、准确的回答,模型需要综合多个检索片段的信息,生成一个统一、连贯的回答,这要求模型具有信息筛选、整合和重组的能力,检索到的内容起到引导作用,帮助模型生成更聚焦、更相关的内容,减少偏离主题或产生幻觉的可能,根据检索到的信息质量和相关度,模型需要智能地决定多大程度上依赖检索信息,何时需要结合自身知识进行补充。
总结
这三个词描述了一个完整的信息处理流程:
Retrieval 到 Augmented:检索不是目的,而是为了实现增强。检索的质量直接决定了增强的效果;Augmented 到 Generation:增强为生成提供了基础和约束。有了增强的上下文,生成才能更准确、更可靠。三个单词精准地概括了这项技术的本质:通过检索相关信息来增强模型能力,从而实现更好的生成效果。每个词都不可或缺,共同构成了RAG这一强大的技术范式。
RAG也可以理解为一种方法论,不要让模型记住所有知识,而是教会它如何查找和使用知识。这种方法论影响了我们思考AI系统的方式:从"全知全能的单一模型"转向"会使用工具的智能系统"、从"静态知识"转向"动态知识获取"、从"黑盒预测"转向"可追溯的推理"。
三、RAG技术讲解
2020(现Meta)发表论文正式提出RAG架构,从本质上说,RAG是一种系统架构设计模式,定义了组织AI系统的方式,将检索组件和生成组件结合起来,形成一个信息处理的流程框架。RAG规定了系统的基本结构。知识库(Knowledge Base)存储可检索的信息;检索器(Retriever)负责从知识库获取相关信息;生成器(Generator)负责基于检索结果生成回答。或者说,Retrieval 是“找资料”—— 靠向量化 + 向量库 + 搜索 + 重排、Augmented 是“整理资料”——靠组织 + 提示 + 融合 + 过滤、Generation 是“写报告”——靠LLM的推理 + 生成 + 优化,在实际实现中,这三个概念转化为具体的技术组件和体现。
Retrieval 体现
从大规模知识库中快速、准确地找到与用户查询最相关的文档片段
嵌入模型(Embedding Model)
- 是什么:一种深度学习模型(如 BERT、Sentence-BERT、BGE、OpenAI's text-embedding-ada-002),它能将文本(句子、段落、问题)转换为固定长度的高维向量(即“嵌入向量”)。
- 作用:实现语义编码。语义相近的文本,其向量在空间中距离更近。例如,“如何煮咖啡?”和“制作咖啡的步骤”虽然用词不同,但嵌入向量会非常接近。
- 在RAG中的角色:用于将知识库文档和用户查询都转换为向量,为后续的向量相似度计算做准备。
向量数据库(Vector Database)
- 是什么:专门用于存储、索引和高效检索高维向量的数据库(如 FAISS、Milvus、Pinecone、Weaviate)。
- 作用:
- 存储所有文档片段的嵌入向量。
- 建立高效的近似最近邻(ANN)索引,使得在海量向量中也能毫秒级找到最相似的向量。
- 在RAG中的角色:作为“知识库的向量索引中心”,支撑快速语义检索。
相似度搜索算法
- 是什么:用于计算两个向量之间“距离”或“相似度”的数学方法。
- 常用算法:
- 余弦相似度(Cosine Similarity):最常用,衡量向量方向的一致性,值在[-1, 1]之间,越接近1越相似。
- 点积(Dot Product):在向量归一化后,等价于余弦相似度。
- 欧几里得距离(Euclidean Distance):衡量向量间的直线距离,越小越相似。
- 在RAG中的角色:计算“查询向量”与“文档向量”的相似度,对文档进行初步排序,返回Top-K个最可能相关的片段
技术类型 与相似度搜索算法的关系 关键逻辑 稀疏检索 基本不依赖相似度搜索算法 核心是 “关键词匹配”,用 TF-IDF 计算词的权重、BM25 计算文档相关性,本质是 “词频统计” 而非 “向量距离计算”。 密集检索 完全依赖相似度搜索算法,是其核心组成部分 先将查询和文档转成向量(嵌入),再用余弦相似度等算法计算 “距离”,距离越近则语义越相关。 混合检索 部分依赖:稀疏检索阶段不用,密集检索(精排)阶段必须用 先用稀疏检索(如 BM25)快速筛选出少量候选文档,再用相似度算法(如余弦)对候选文档做语义精排。
重排序(Reranking)技术
- 是什么:在初步检索出Top-K个结果后,使用更精细、计算成本更高的模型对这些结果进行二次排序。
- 常用方法:
- 使用交叉编码器(Cross-Encoder) 模型(如
bge-reranker),它能同时看到“查询”和“文档”,进行更精准的语义匹配打分。 - 例如:初步用向量检索得到100个结果,重排序模型将其重新打分,选出最相关的前5个。
- 使用交叉编码器(Cross-Encoder) 模型(如
- 作用:显著提升检索结果的相关性精度,弥补向量检索中“语义漂移”或“关键词误导”的问题。
Augmented 体现
将检索到的信息有效地组织和优化,作为上下文输入给大语言模型(LLM),以提升生成质量。
上下文构建策略
- 是什么:如何将检索到的多个文档片段组织成一段连贯、信息丰富且不冗余的上下文。
- 常见策略:
- 直接拼接:按相似度排序,依次拼接文本。
- 摘要合并:对多个片段先生成摘要,再拼接。
- 元数据过滤:根据文档来源、时间、类型等元数据筛选或加权。
- 滑动窗口/去重:避免重复信息或上下文过长。
- 重要性:直接影响LLM能否“看懂”上下文。组织不当会导致信息冗余或关键信息丢失。
提示工程(Prompt Engineering)
- 是什么:设计与LLM交互的提示词(Prompt),明确告诉模型如何使用上下文来回答问题。
- 典型结构:
基于以下信息: {检索到的上下文} 请回答问题,如果信息不足,请说“我不知道”。 问题:{用户问题} 回答: - 作用:引导LLM遵循指令、引用上下文、避免幻觉。好的提示词能显著提升回答的准确性和格式规范性
信息融合机制
- 是什么:当检索到多个来源的信息时,如何整合、对齐或解决冲突。
- 挑战:不同文档可能提供矛盾信息(如“A公司成立于2020年” vs “成立于2021年”)。
- 方法:
- 置信度加权:根据来源可靠性或相似度得分加权。
- 投票机制:多数一致的信息优先采纳。
- LLM自主判断:依赖LLM的推理能力进行综合判断。
- 目标:确保最终上下文是一致、可信、无矛盾的
相关性过滤
- 是什么:在将检索结果送入LLM前,过滤掉与问题无关或低质量的片段。
- 方法:
- 设置相似度阈值(如低于0.6的直接丢弃)。
- 使用轻量级分类模型判断“是否相关”。
- 结合重排序得分进行截断。
- 好处:减少噪声,防止LLM被无关信息干扰,降低生成幻觉的风险。
Generation 体现
让大语言模型基于增强后的上下文,生成准确、流畅、符合要求的回答。
大语言模型的推理能力
- 是什么:LLM(如 GPT-4、Claude、Qwen、Llama)具备的逻辑推理、常识理解、多跳推理等能力。
- 在RAG中的作用:不仅仅是“复读”上下文,而是能推导出隐含信息。
例如:上下文说“A是B的子公司”,问题“B是否控制A?”,LLM能推理出“是”。
上下文理解和整合
- 是什么:LLM需要准确理解检索到的上下文内容,并与问题进行语义对齐。
- 挑战:上下文可能冗长、专业或存在术语,LLM需精准抓取关键信息。
- 体现:模型能识别“谁、什么、何时、何地、为什么”,并建立语义关联。
自然语言生成
- 是什么:LLM将理解后的信息,用自然、流畅、符合语法的语言表达出来。
- 要求:生成的回答应:
- 语言通顺,符合人类表达习惯。
- 避免机械拼接或术语堆砌。
- 语气得体(正式、简洁、友好等)。
答案的格式化和优化
- 是什么:对生成的原始文本进行后处理,使其更符合用户需求。
- 常见操作:
- 结构化输出:生成JSON、Markdown表格、列表等。
- 长度控制:限制回答在100字以内。
- 语气调整:改为更正式或更口语化。
- 引用标注:标注信息来源(如[1]、[2])。
- 方法:可通过提示词约束,或使用后处理脚本实现。
实现
用Python实现一个RAG功能系统,结合一个简单的检索器和一个生成模型(Qwen、Llama等),就能实现RAG技术,通常需要以下步骤:
01 准备知识库 Knowledge Base:一些文档片段,把一堆文档(比如 1 万篇 FAQ、维基段落、产品说明)先存成 List[str],每个元素是一篇文档的纯文本。
02 构建检索器 Retriever:使用 scikit-learn(第三方库) 的 TfidfVectorizer(方法/工具) 将知识库文档向量化。
TfidfVectorizer方法:提供的一个“文本到数字”转换器,它一次性帮你完成“分词 —— 计数 —— 算 TF-IDF 权重 —— 向量化”,最终把每段文本变成稀疏向量;TfidfVectorizer 就是 scikit-learn 里“把一堆中文或英文句子直接变成 TF-IDF 向量”,常用于文本分类、信息检索、相似度计算等任务。不仅需要对知识库向量化,还需要对用户的查询向量化,再通过计算余弦相似度(如何计算)找出最相关的文章。
检索器:例如TF-IDF
TF(Term Frequency)词频
某个词 t 在文档 d 中出现的次数,通常做归一化(把数据映射到0-1之间);
IDF(Inverse Document Frequency)逆文档频率
一个词在文档里,越少出现,就越珍贵,按这个思路给每个词打一个权重,出现的越少,权重越高
为什么需要 IDF
• 过滤“口水词”:像“的、了、是”这些词到处出现,信息量≈0。
• 突出“关键词”:罕见词往往携带主题信息,能提高检索/分类准确率。
直观理解:一个词在某文档里出现得多(TF 高),但在整个语料里又比较稀有(IDF 高),就对这篇文档越重要。
分词:中文、日文、泰文等没有天然空格,机器无法像英文那样直接按空格拿词,分词就是把没有空格的连续文字,切成一个个“最小且有意义”的词,让计算机能像处理英文单词一样去统计、分析和理解文本。不分词:“南京市长江大桥” ,一整串 8 个字,机器不知道这是“南京市 / 长江大桥”还是“南京 / 市长 / 江大桥”。
分词之后:[“南京市”, “长江大桥”] ,每个词都有明确语义,才能统计词频、计算 TF-IDF、做检索或情感分析。
03 构建生成器 Generator:调用LLM,接收查询和检索的上下文,生成一个回答
通过引入外部知识库,RAG 能够生成更准确、更相关的回答,尤其适用于那些需要特定领域知识或最新信息的问题。
当前发展中的RAG,不仅检索文本,还包括图像、表格、代码等 长上下文处理,这种支持多模态的RAG,随着模型上下文窗口增大,RAG策略也在调整 检索策略优化,更智能的检索时机、检索数量决策 效率提升,减少检索和生成的计算开销。RAG的出现和发展,本质上是AI领域在追求"更可靠、更实用的AI系统"这一目标过程中的必然产物。它巧妙地结合了信息检索的精确性和语言模型的生成能力,为构建实用的AI应用提供了一条可行的技术路径。
为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐



所有评论(0)