首页 > 教程攻略 > ai教程 >RAG学习笔记(一)

RAG学习笔记(一)

来源:互联网 时间:2026-06-29 07:32:09

RAG的崛起与核心价值

大型语言模型(LLMs)确实厉害,文本生成、理解、推理样样在行,正在重塑人与信息的交互方式。但要说没有短板也不现实——它们在面对特定领域知识、实时信息或者需要高度事实准确性的场景时,经常暴露一个老毛病:“幻觉”(Hallucination),也就是生成听起来头头是道、实际上却错误或虚构的内容。更扎心的是,LLMs的知识通常停留在训练数据的截止日期,对新事件或动态信息完全没感觉,时效性问题是个硬伤。

这时候,检索增强生成(Retrieval-Augmented Generation, RAG)技术就登场了。

RAG的核心思路很简单:把外部知识检索能力和LLMs的生成能力结合起来。模型在回答之前,先从一个或多个外部知识库里捞出相关信息,再基于这些信息去生成答案。这种结合不仅明显提升了LLMs回答的准确性和可靠性,有效抑制了幻觉,还让模型有能力处理实时信息和特定领域知识,应用边界一下子宽了不少。

说白了,RAG就是两个环节的巧妙配合:先用AI技术从海量数据里精准定位你需要的知识,再反过来利用这些知识帮大模型生成更靠谱的内容。这种双向赋能的机制,让RAG成了构建高精度、高时效性智能问答系统、知识助手乃至复杂决策支持系统的关键技术。

\

RAG核心机制剖析:四大基石

一个典型的RAG系统,工作流程可以概括为:用户提问题,系统做检索,然后基于检索结果生成答案。为了让这个闭环顺畅运行,RAG系统通常由四大核心组件构成:知识嵌入、向量数据库、检索器和生成器。

整体流程概览

\

设想一个场景:用户问“请解释一下量子纠缠现象”。

如果没有RAG,大模型可能会基于训练数据中的通用知识来回答,但如果训练数据里关于量子纠缠的最新研究或特定细节不够,回答就可能不够深入甚至跑偏。比如它可能会说:“量子纠缠是一种物理现象,两个或多个粒子以某种方式连接,无论距离多远,一个粒子的状态会立即影响另一个。”这个答案基本正确,但缺少最新实验进展或更深层的理论解释。

要是有RAG系统呢?系统会先根据用户问题,从预先构建的物理学知识库里检索出相关文档片段——比如最新的物理学期刊论文、权威教材章节、知名物理学家的公开讲座记录等等。然后这些检索到的片段连同用户问题一起喂给大模型,大模型基于这些信息生成一个详细又准确的回答,比如:“量子纠缠是量子力学核心概念,描述了两个或多个粒子之间存在的特殊关联。即使这些粒子在空间上分离,测量其中一个的状态会瞬间影响另一个,这种非局域性是量子力学与经典物理学的显著区别之一……”

这个例子清楚地展示了RAG如何通过引入外部知识,把大模型的“不知道”变成“知道还能准确回答”,而且能提供更具时效性和专业深度的信息。

知识嵌入(Embedding)

知识嵌入是RAG系统的第一步,也是至关重要的一步。它的作用是把非结构化的文本知识(文档、网页、书籍等)转化成高维度的数值向量表示。这些向量能捕捉文本的语义信息,让语义相似的文本片段在向量空间中靠得更近。

从技术细节来看,知识嵌入通常通过预训练的深度学习模型实现,比如基于Transformer架构的模型(BERT、RoBERTa,或者专为嵌入任务设计的Sentence-BERT、OpenAI Embedding模型等)。这些模型通过大量文本数据的学习,掌握了词语、句子乃至段落的语义关系。输入一段文本,模型就输出一个固定长度的向量,这个向量就是文本的“语义指纹”。选对嵌入模型对RAG系统性能至关重要,它直接决定文本语义捕捉的准确性和向量表示的质量。

向量数据库(Vector DB)

向量数据库是RAG系统存储和管理海量向量表示的核心组件,专门为高效存储、索引和检索高维向量数据而生。传统的关系型数据库玩不转高维向量的相似性搜索,向量数据库则通过特殊的索引结构(比如HNSW、IVF、LSH等)来加速相似度查询。这些索引能在庞大的向量集合里快速找到与给定查询向量最相似的Top-K个向量。相似度计算常用余弦相似度、欧氏距离等指标,量化向量之间的语义距离。常见的向量数据库有Milvus、Pinecone、Wea viate、Chroma等,它们提供了高性能的向量存储和检索能力。

检索器(Retriever)

检索器是RAG系统的“大脑”,负责根据用户查询从向量数据库中召回最相关的文档片段。目标是找到那些能为大模型生成高质量回答提供足够上下文支持的信息。

技术细节上,当用户提问时,检索器先用和知识嵌入阶段相同的嵌入模型,把用户查询也转成查询向量。然后这个查询向量在向量数据库里做相似度搜索,找出最相似的Top-K个文档向量。这些文档向量对应的原始文本片段(或其引用)就是检索结果。检索器的性能直接影响RAG的最终效果——如果检索到的信息不相关或不准确,大模型再强也难生成高质量回答。

生成器(Generator)

生成器是RAG系统的“嘴巴”,它接收用户问题和检索器提供的相关文档片段作为输入,利用大模型的能力生成流畅、连贯且基于事实的回答。生成器通常是一个大型语言模型(LLM),比如GPT系列、Llama系列、GLM系列等。

在接收到用户问题和检索到的上下文后,生成器通过精心设计的“提示词”(Prompt)把这些信息整合起来。提示词工程在这里扮演关键角色,它指导LLM如何利用这些信息来生成回答,比如明确指示LLM“请基于以下资料回答上述问题:[片段1] [片段2] [片段3]”。另外,根据具体应用场景,可能还需要对LLM进行微调(Fine-tuning),让它更好适应特定领域的语言风格和知识表达,进一步提升生成回答的质量和相关性。

RAG系统快速搭建

对于算法工程师来说,快速上手RAG系统并做实验是刚需。幸运的是,业界提供了多种工具和方法,从高级框架到底层手工构建,再到低代码平台,满足不同层次的需求。

框架的力量:LlamaIndex与LangChain

LlamaIndex和LangChain是当前RAG领域最受欢迎的两个开源框架,它们为RAG系统开发提供了高度抽象和模块化的组件,大大简化了开发流程。LlamaIndex更侧重数据摄取、索引构建和查询优化。它提供了一套完整的工具链,能把各种数据源(PDF、网页、数据库等)转化成可检索的索引,支持多种索引类型和查询模式。LlamaIndex的优势在于强大的数据管理能力,让开发者能轻松把非结构化数据变成LLM可用的知识。

LangChain则是一个更通用的LLM应用开发框架,它引入了“链”(Chains)的概念,允许开发者把不同LLM组件(模型、提示词、解析器、工具等)串联起来,构建复杂的LLM应用。在RAG场景中,LangChain提供了丰富的检索器、文档加载器和向量存储集成,构建RAG流程变得直观高效。这两个框架都有丰富的示例和集成,开发者可以快速用它们搭起一个基本RAG系统,尝试不同的嵌入模型和LLM。

高级编排:LCEL与LangGraph

RAG系统的复杂度上来之后,简单的链式调用可能不够用了。LangChain为此引入了LCEL(LangChain Expression Language)和LangGraph,提供更强大、更灵活的编排能力。LCEL是一种声明式的方式来构建LLM应用。它的核心特点包括组件式设计(将LLM应用拆分为可复用组件)、管道式数据流(数据在组件间以管道形式流动,清晰直观)、高度可组合性(小组件能拼成大组件,构建任意复杂逻辑)、兼容异步执行(支持异步操作,提升并发性能)、易于调试和扩展(模块化设计让问题定位和功能扩展更方便)。

LangGraph是LangChain家族中用于构建多步骤、有状态LLM应用的利器。它把LLM应用看作一个图(Graph),节点代表不同的操作或LLM调用,边代表状态的转移。LangGraph的特点包括:基于状态驱动的执行模型(整个应用的状态在不同节点间传递和更新)、DAG(有向无环图)任务流(支持复杂任务依赖和分支逻辑)、任务模块化(每个节点独立,易测试和替换)、灵活的控制流(可根据条件动态改变执行路径)、以及并行执行(支持任务并行处理,提升效率)。

LangGraph和传统LangChain在执行方式、状态管理、任务复用、分支逻辑、并行执行和复杂度上有显著差异。传统LangChain是线性执行、手动变量传递,适合简单任务;LangGraph基于DAG,统一状态自动传递,通过add_conditional_edges()实现分支逻辑,通过add_parallel()自动并行,更适合复杂任务。LangGraph的引入为RAG系统带来了更广阔的扩展可能性,比如增加条件分支(不同类型问题调用不同检索器)、加入并行任务(同时执行关键词匹配和向量搜索,结果融合)、以及增加RAG质量评估(在生成前对检索结果进行重排序或置信度评分,确保输入给LLM的上下文质量)。

低代码/可视化工具:加速开发

对于快速原型开发或非编程背景的用户,一些低代码或可视化AI开发工具(如Coze、Dify、RagFlow等)提供了拖拽式界面和预设的RAG组件,构建RAG应用像搭积木一样简单。这些工具通常集成了多种LLM、嵌入模型和向量数据库,并提供方便的部署和管理功能。

\

RAG系统优化策略

搭一个基本的RAG系统不难,但要让它在实际应用中表现出色,就得精细优化。RAG的优化可以从数据准备、检索效果和生成质量三个主要方面入手。

数据准备与索引优化

高质量的知识库是RAG系统性能的基础。文档分块策略(Chunking)是关键一环:原始文档通常很长,直接当上下文输入LLM会超出其上下文窗口限制,还可能引入无关信息。所以得把文档切成更小的“块”。常见分块策略有:固定长度分块(按字符数或Token数切分,但可能导致语义不完整)、语义分块(根据文档结构如段落、章节或语义完整性切分,确保每个块包含相对独立的概念)、以及滑动窗口分块(固定长度基础上引入重叠部分,保留上下文连续性)。

除了文本内容,文档的元数据(作者、日期、来源、主题标签等)对检索和过滤也很重要。利用元数据可以实现更精准的检索,比如只检索特定时间范围内的文档,或特定作者的文章。另外,知识库是动态变化的,需要定期更新索引以反映最新信息,这包括增量更新、删除过期数据和重建索引等操作。

检索效果优化

检索的准确性直接决定LLM生成回答的质量。查询扩展(Query Expansion)是有效手段之一:用户查询可能太简短或模糊,导致检索效果不好。可以通过同义词扩展(把关键词替换为同义词)、相关概念扩展(自动添加与查询相关的概念或短语)、或者利用LLM辅助扩展(根据用户查询生成多个潜在查询变体)来改善。

重排序(Reranking)可以对初步检索结果进行二次排序。向量检索通常会返回Top-K个相似度最高的文档,但这些文档并非都同样相关。重排序器(Reranker)可以根据更复杂的语义匹配或相关性模型,提升最终召回结果的质量——这通常涉及一个独立模型,对查询和每个检索到的文档对进行打分。

混合检索(Hybrid Search)结合了关键词搜索(如BM25)和向量相似度搜索的优势。关键词搜索在精确匹配方面表现优异,向量搜索擅长语义匹配。混合检索可以弥补单一检索方式的不足,提升召回率和准确性。

生成质量优化

即使检索到了高质量的上下文,LLM的生成能力也需要被充分利用。提示词工程进阶是关键:除了基本指令,可以尝试更复杂的策略。比如角色设定(让LLM扮演特定角色,如“你是一个专业的法律顾问”,影响回答风格和内容)、思维链(Chain-of-Thought)提示(引导LLM逐步思考,分解问题,生成更严谨的回答)、以及少样本学习(Few-shot Learning,在提示词中提供少量高质量问答示例,引导LLM学习期望的回答模式)。上下文窗口管理也至关重要:LLM的上下文窗口大小有限。在RAG中,需要确保检索到的信息能有效利用LLM的上下文窗口,避免截断重要信息或引入过多无关内容。可以考虑对检索结果进行摘要或精炼,以适应上下文窗口。

最后,答案事实性与流畅性评估是衡量RAG系统生成回答质量的重要环节。这包括事实性评估(检查回答是否与检索到的信息一致,是否存在幻觉)、流畅性评估(评估语法、连贯性和可读性)、以及相关性评估(评估回答是否准确解决了用户问题)。

总结

检索增强生成(RAG)技术在大模型时代扮演的角色越来越重要。它通过把外部知识引入LLM的生成过程,有效解决了大模型在知识时效性、事实准确性和特定领域应用方面的痛点。从核心组件的协同工作,到利用LlamaIndex、LangChain等框架快速搭建,再到通过LCEL、LangGraph进行高级编排,以及深入底层的手工构建,RAG的开发生态日益完善。而通过对数据准备、检索效果和生成质量的持续优化,RAG系统能够为用户提供更加精准、可靠和个性化的智能服务。

相关阅读