返回教程列表
AI编程进阶LlamaIndex

深度解析:大模型RAG从入门到高阶,这一篇讲透了

这篇文章解决的是大模型落地时最现实的问题:如何让通用大模型在私有数据、实时数据上给出可靠答案。无论你是正在搭建企业知识库问答系统,还是第一次接触RAG概念,这篇文章都能帮你建立从基础原理到高级调优的完整认知框架。文章以LlamaIndex的实现为主线,系统讲解了分块策略、混合检索、查询转换、智能体架构等进阶技术,并给出了可行的评估与微调路径。

AI工具集
13 分钟阅读
AI Agent向量与RAGAI安全

核心判断

这篇文章解决的是大模型落地时最现实的问题:如何让通用大模型在私有数据、实时数据上给出可靠答案。无论你是正在搭建企业知识库问答系统,还是第一次接触RAG概念,这篇文章都能帮你建立从基础原理到高级调优的完整认知框架。文章以LlamaIndex的实现为主线,系统讲解了分块策略、混合检索、查询转换、智能体架构等进阶技术,并给出了可行的评估与微调路径。


一、为什么RAG成了大模型应用的必选项

大模型在过去两年经历了爆发式发展,但当真正接入业务场景时,基础模型的能力边界立刻显现出来。这种落差主要来自三个层面。

知识的局限。 主流大模型(DeepSeek、GPT系列、通义千问)的训练数据均来自公开网络,这意味着它们对实时信息、企业私有文档、特定领域知识一无所知。一个最简单的例子:询问模型公司内部的流程规范,它只能给出泛泛而谈的通用回答,因为训练语料里根本没有这些内容。

幻觉问题。 所有深度学习模型的输出本质上是一系列概率计算的结果,大模型也不例外。当模型对某个问题没有掌握足够知识时,它会"一本正经地胡说八道",这种表现的专业术语叫"幻觉"。在企业场景中,幻觉带来的后果比消费级应用严重得多——一份错误的技术文档、一段虚构的客户信息,都可能造成实质损失。

数据安全的红线。 几乎没有企业愿意把私域数据上传到第三方平台进行训练或推理。对于大公司而言,数据安全是不可让步的底线。这导致一个尴尬的局面:完全依赖通用大模型的能力,就无法利用数据优势;想要利用数据,又面临泄露风险。

RAG(Retrieval Augmented Generation,检索增强生成)就是针对这三个问题提出的系统性方案。它的思路很直接:与其让大模型凭空生成答案,不如先从一个可信的数据库中检索相关信息,再把这些信息作为上下文交给大模型组织语言。

用一句话概括:RAG = 检索技术 + LLM提示。具体流程是:用户提问后,系统先从各类数据源中检索相关内容,将检索结果和原始问题一起注入提示词模板,最后由大模型生成答案。

这个领域的发展脉络可以追溯到2019年,当时Faiss实现了基于嵌入的向量搜索技术。此后Chroma、Weaviate、Pinecone等向量数据库初创公司相继出现,它们多数基于Faiss和NMSLib等开源索引引擎,在向量检索基础上增加了元数据存储和其他辅助工具。如今,RAG的应用形态已经非常丰富——从基于Web搜索和LLM的问答服务,到完全基于私有数据的应用程序。

目前最知名的开源RAG框架有三个:LangChain、LlamaIndex和Dify。原文主要参考LlamaIndex的实现来讲解高级RAG技术,这也是本文重点展开的部分。

二、RAG的基础流程:从数据处理到答案生成

RAG架构的核心可以理解为"检索+生成"的组合。向量数据库负责高效存储和召回目标知识,大模型负责利用召回的知识生成合理回答。完整流程分为离线数据准备和在线应用两个阶段。

数据准备阶段

这是离线的数据处理过程,目的是将私域数据向量化后建立索引。

数据提取解决的是多源异构数据统一的问题。需要加载多种格式的数据(PDF、Word、HTML、数据库记录等),进行过滤、压缩、格式化,同时提取元数据,比如文件名、标题、时间等关键信息。

文本分割是影响检索效果的关键环节之一。文本分割需要平衡两个因素:一是Embedding模型的Token长度限制,不同模型可处理的序列长度差异很大;二是语义完整性对检索质量的影响。常见策略包括句分割(以句号、换行符等为切分点,保留完整句子语义)和固定长度分割(如512或1024个Token,但会损失语义信息,通常通过在头尾增加冗余量来缓解)。

向量化是将文本转化为向量矩阵的过程,直接影响检索精度。目前主流的Embedding模型包括OpenAI的ChatGPT-Embedding、百度的ERNIE-Embedding V1,以及开源的M3E系列(Hugging Face: moka-ai/m3e-base)和智源研究院的BGE系列(Hugging Face: BAAI/bge-base-en-v1.5)。对于涉及罕见专有词的垂直场景,可以考虑基于开源模型微调或训练专用Embedding模型。

数据入库是将向量化后的数据写入数据库并构建索引。适用于RAG场景的数据库包括FAISS、Chromadb、ElasticSearch、Milvus等,具体选择需综合考虑业务场景、硬件配置和性能需求。

应用阶段

在线阶段的核心是数据检索和Prompt注入。

常用的检索方法包括相似性检索(计算查询向量与存储向量的余弦相似度、欧氏距离或曼哈顿距离,返回得分最高的记录)和全文检索(通过关键词构建倒排索引)。实践中通常将多种检索方式融合,以提升召回率。

Prompt的设计直接影响输出质量,一个标准的知识问答Prompt包括三个部分:任务描述(告诉模型扮演什么角色)、背景知识(检索得到的相关文本)、任务指令(用户的具体问题)。例如:

【任务描述】
假如你是一个专业的客服机器人,请参考【背景知识】,回答用户问题:
【背景知识】
{content}
【问题】
石头扫地机器人P10的续航时间是多久?

Prompt设计没有固定语法,高度依赖个人经验,需要根据大模型的实际输出反复调优。

三、高级RAG的六大技术方向

基础RAG流程解决了"能用"的问题,但在复杂场景下,检索精度、上下文利用效率和推理质量仍有明显短板。高级RAG技术的目标,是在可接受的成本范围内逼近这三个指标的上限。

1. 分块与向量化

Transformer模型的输入序列长度是固定的。即便上下文窗口非常大,单个句子或几个句子的向量也比几页文本的向量更能代表其语义含义。分块大小取决于Embedding模型的Token容量:基于BERT的句子转换器最多支持512个Token,OpenAI的ada-002能处理8191个Token,但也有代价——Token数越多,单个文本块的嵌入就越缺乏特异性,检索时的精确度会下降。LlamaIndex中提供了NodeParser类,支持自定义文本拆分器、元数据和节点关系。

向量化则建议优先查看MTEB排行榜(一个检索模型基准测试平台),选择针对搜索优化的Embedding模型,如bge-large或E5系列。

2. 搜索索引的多种形态

最简单的实现是平面索引——即暴力计算查询向量与所有块向量的距离。但当数据规模达到万级或更高时,需要引入近似最近邻算法(如聚类、树结构、HNSW),相关的实现包括Faiss、NMSLib和Annoy。

分层索引是应对大型数据库的有效方案。创建两层索引:第一层由文档摘要组成,第二层是文档块。搜索时先通过摘要层过滤出相关文档,再在相关文档内部进行精细搜索。这能显著减少不必要的计算。

假设性问题和HyDE是两种利用LLM提升检索质量的方法。前者让LLM为每个文档块生成一个假设性问题并嵌入向量,检索时搜索的是问题向量而非文档块向量——查询和假设问题之间的语义相似度通常高于查询和文档块之间的相似度。HyDE(反向逻辑)则要求LLM根据查询生成一个假设性回答,然后将这个回答的向量和原始查询向量一起用于搜索。

语句窗口检索器和自动合并检索器解决的是"检索精度"和"上下文完整性"之间的矛盾。语句窗口检索器对文档中的每个句子单独嵌入,获得极高的检索精度;找到最相关的句子后,再将这句子前后k个句子一起作为上下文发送给LLM。自动合并检索器的思路类似:文档被拆分为较小的子块和较大的父块,如果Top-K检索到的多个子块链接到同一个父节点,就自动将这个父节点替换为上下文。这两类方法本质上是在精细检索后"回退"到更大的上下文窗口,给LLM提供足够的推理依据。

3. 混合搜索与重排序

纯向量检索忽视了一个事实:关键词的精确匹配在很多场景下仍有不可替代的价值。混合搜索的思路是将传统的关键词检索(TF-IDF、BM25)与现代语义检索结合,用Reciprocal Rank Fusion(RRF)算法整合不同来源的相似度分数。LangChain通过Ensemble Retriever类实现这一流程,LlamaIndex也有类似实现。混合搜索通常能提供更优秀的检索结果,因为它同时考虑了语义相似性和关键词匹配。

检索完成后的重排序同样关键。可以使用相似度分数、关键词或元数据过滤结果,也可以使用交叉编码器(如sentence-transformer)或Cohere重排序接口对候选结果进行精细排名。这一步是整个检索链路的最后校准机会。

4. 查询转换

当用户的原始查询过于复杂或模糊时,直接拿去搜索引擎效果往往不好。查询转换是让LLM充当推理引擎,对用户输入进行改写和分解。

以经典问题为例:"在Github上,Langchain和LlamaIndex这两个框架哪个更受欢迎?"答案不会直接出现在语料库中,直接检索往往无功而返。正确的做法是将它分解为两个子查询:"Langchain在Github上有多少星?"和"LlamaIndex在Github上有多少星?"——这两个子查询并行执行,检索结果随后合并发送给LLM。LangChain的多查询检索器和LlamaIndex的子问题查询引擎实现了这一功能。

另一类思路是Step-back prompting,通过LLM生成一个更通用的查询,以此检索更高层次的上下文,再将原始查询和通用查询的检索结果合并送入LLM。查询重写则是让LLM直接改写初始查询以改进检索质量。

5. 聊天引擎与查询路由

构建可以多轮对话的RAG系统,需要处理上下文压缩问题——用户后续问题往往存在代词指代或依赖上文语境的含义。ContextChatEngine的逻辑是先检索与当前查询相关的上下文,再将聊天记录一起发送给LLM。更复杂的CondensePlusContextMode则会将聊天记录和最后一条消息压缩成一个新查询,再进入索引检索。LlamaIndex还支持基于OpenAI智能体的聊天引擎,提供更灵活的交互模式。

查询路由是LLM驱动的决策步骤,决定在给定用户查询的情况下下一步该做什么——是执行数据索引搜索、调用摘要索引还是触发其他操作。在多文档存储场景中,摘要索引和文档块向量索引是两种不同层级的索引系统,查询路由器负责选择合适的路径。LlamaIndex和LangChain均提供了查询路由器支持。

6. 智能体(Agent)

Agent架构几乎在第一个LLM API发布时就已经出现——核心思路是给LLM配备一套工具集,让它能够自主决策和调用外部功能。这些工具可以是代码函数、外部API、甚至是其他智能体。LangChain的命名就源于这种"链接调用"的思想。

在RAG场景中,多文档智能体方案是典型的Agent应用:每个文档上初始化一个OpenAIAgent,该智能体拥有两个工具——向量存储索引和摘要索引,根据路由查询决定使用哪一个;同时有一个顶层智能体负责将查询分配到各个文档智能体,并综合最终答案。这种架构的优势在于,可以比较不同文档中的解决方案或实体,覆盖从单文档摘要到跨文档QA的常见用例。

缺点是响应时间较长——智能体内部需要在多个LLM之间进行多次往返调用。而LLM调用通常是RAG管道中耗时最长的操作,因此对于大型多文档场景,需要权衡是否值得牺牲速度换取这种灵活性。

7. 响应合成

这是RAG管道的终点,根据全部检索上下文和用户查询生成最终答案。最直接的方法是将所有高于相关性阈值的内容与查询拼接后发送给LLM。更复杂的选项包括:将上下文逐块发送让LLM逐段优化答案;先概括检索到的上下文再生成回答;或根据不同的上下文块生成多个版本再合并。

四、质量评估与微调:如何让RAG真正可用

RAG系统的评估可以从三个维度展开:检索到的上下文是否与问题相关(检索质量)、生成的答案是否被上下文支持(忠实度)、答案是否回答了用户的问题(相关性)。其中最关键且最可控的指标是检索质量——高级RAG技术的大部分环节都是围绕提升这一指标设计的;回答的忠实度和相关性则主要依赖LLM能力和Prompt设计。

评估框架

Ragas框架使用真实性和答案相关性来评价生成质量,用上下文精准度和召回率评估检索性能。LlamaIndex和Truelens提出了"RAG三元组"评估模式(检索内容相关性、答案基于性、答案相关性)。OpenAI发布了实用评估指南,建议在命中率之外增加平均倒数排名(MRR)等更精细的指标。

LangChain提供的LangSmith框架不仅能自定义评估器,还能监控整个RAG管道的运行过程,增强系统透明度。使用LlamaIndex则可以直接尝试rag_evaluator llama pack。

微调的收益边界

对Embedding编码器进行微调的效果有限——针对搜索优化的Transformer编码器已经非常高效,额外的微调很难带来突破性提升。对排序器(交叉编码器)微调则是一个可选方案。

LLM微调的实际效果有量化数据支撑:LlamaIndex对GPT-3.5-turbo进行微调后,Ragas框架的忠实度指标提升了5%,这说明微调后的模型能更好地利用提供的上下文。Meta AI的RA-DIT研究展示了一种同时调整LLM和Retriever的更复杂方法,在知识密集型任务上,经过微调的Llama2 65B与原始RAG方案相比指标提升约5%。

但这些收获并非没有代价——用小型合成数据集微调基础模型,可能削弱模型的通用能力。

五、适用边界:RAG Fusion需要衡量

原文特别讨论了RAG融合(利用LLM生成多个查询以覆盖问题的不同方面)的优缺点。

优点包括:获得更丰富多样的上下文、提供额外的控制层级、通过LLM自动纠正用户输入中的拼写错误并补充关联信息。成本方面也有独特优势——生成多个查询的LLM调用通常只需100个Token左右,而主检索的Token消耗可达数千个,二者成本差了一个到两个数量级。即使融合方案每10次查询只能减少一次后续追问,在成本上仍然划算。

局限性同样明显。延迟是最大的代价——额外的一次LLM调用意味着几百毫秒的等待,尤其影响交互体验。自动纠错的失效可能发生在涉及内部术语或行话的场景——LLM的训练数据中没有这些词汇,它可能会生成完全无关的查询,直接带偏检索结果。例如论文主题为Transformer架构时,LLM可能对"注意力"一词产生上下文误解,生成与主题无关的查询。

改进方向包括:提供更明确的系统提示(明确应用场景)、使用语义搜索找到相似查询、在提示前加入少量示例、或微调一个小型LLM专门生成查询。最后一种方案虽然成本较高,但对于特定模板下的查询生成任务,即使只有几百万参数的小模型也足够胜任。

核心建议是:构建起基础RAG应用后,立即建立评估流程。每一次对提示或搜索的调整可能提升某类查询的效果,却牺牲另一类查询的效果——最理性的做法是将它当作机器学习问题,让数据来告诉你答案。

六、下一步思考

RAG正在与更多技术结合。基于网络搜索的RAG已经出现;智能体架构的探索还在深化;关于LLM长期记忆的研究也在推进。速度问题仍是RAG系统投入生产的最大挑战——ChatGPT和其他主流助手使用流式输出,本质上是为了缩短用户感知到的响应时间。这也是小参数LLM备受关注的原因,Mixtral和Phi-2的出现正在推动这个方向。


参考资料:

  • 果壳PAI:一文搞懂大模型RAG应用(附实践案例)
  • iyacontrol:图解高级RAG技术
  • ketchum:构建基于RAG的聊天机器人(四):RAG融合