
先说个经常被问到的问题你的大模型还在裸奔吗我说的裸奔是指它回答问题全凭训练时那点记忆超出知识范围就靠编给不出依据、给不了出处企业内部资料、产品文档、实时数据统统用不上。RAGRetrieval-Augmented Generation检索增强生成就是来治这个病的——把外部知识库接进大模型的回答链路让它先查资料再说话句句有出处条条可追溯。这篇内容我按自己从入门到落地的真实路径来写覆盖RAG的架构拆解、工具选型、知识库构建、检索优化、生成调试、部署上线和问题排查适合三类人刚接触RAG想系统入门的开发者、已经在做Demo但效果不理想的同学、以及准备把RAG系统推到生产环境但心里没底的团队。我尽量少讲空泛概念多给可复现的实操细节和踩过的坑。1. 先搞清楚RAG到底在解决什么问题1.1 大模型的两个死穴幻觉和知识过期大模型的本质是一个概率语言模型它生成的内容是最像样的下一句话不是事实正确的下一句话。这意味着两件事第一它不知道的知识会硬编这就是幻觉第二它学到的知识停留在训练截止日期企业内部的实时数据、私有文档它根本没机会接触。我给某团队做技术咨询时遇到一个典型场景他们用通用大模型做客服问答客户问我们公司最新的退货政策是什么模型一本正经地输出了一套和现行政策完全相反的流程。这不是模型笨是模型压根没学过这份内部文档。当时我就说这种情况别指望靠换更大参数的模型解决参数再大也塞不进私有数据正确答案就在你们自己的知识库里缺的是一条把它取出来喂给模型的链路。RAG的价值恰恰在这它不是在改模型本身而是在模型外面加一个检索器。用户提问进来系统先从知识库里检索最相关的片段再把问题知识片段一起丢给大模型生成答案。模型不用记住所有知识只需要读懂你给它的材料。这让知识更新变成改数据库而不是重新训练模型成本低了一个数量级。1.2 RAG、微调和长上下文三条路怎么选很多人一上来就问RAG和微调有什么区别是不是有了支持长上下文的模型就不用RAG了。我的看法是这三者不是替代关系而是不同层面的工具。微调Fine-tuning改的是模型的权重它适合让模型学会某种风格、某种输出格式、某种推理习惯比如让它把答案写成固定模板的报告。但微调不适合灌入大量事实性知识因为知识的本质是检索问题不是记住问题而且每次知识更新都要重新训练成本和法律风险都不小。长上下文Long Context是一个看起来很美的方案动辄支持几十万token理论上能把整本手册塞进去。但实测下来有两个问题一是中间丢失现象严重模型对超长上下文的注意力分布并不均匀塞得越多关键信息反而越容易被淹没二是推理成本和延迟随输入长度线性上涨你把十万字文档每次都传给模型那个账单和响应速度商业项目很难接受。RAG是这三者里最务实的一条路知识更新零训练成本、生成过程可解释、可以精确控制模型能看到什么。我的建议很直接——默认选RAG如果需要模型改变表达习惯再叠加微调长上下文模型保留一个窗口用在检索结果本身就很长的特殊场景里。我自己的项目里RAG解决90%的问题微调和长上下文只是补充手段。1.3 一个完整的RAG系统由哪几部分构成很多初学者对RAG的理解停留在向量检索接大模型结果做着做着发现效果就是不稳定。根本原因在于RAG不是单个组件而是一条流水线每一环都在影响最终答案质量。我习惯把RAG分成离线构建和在线推理两条链路。离线链路负责把知识库变成可检索的结构核心步骤是文档解析、清洗、切分chunking、向量化embedding、写入向量数据库必要时还要建倒排索引做关键词检索。在线链路负责服务用户请求核心步骤是查询理解、检索召回、重排序、上下文组装、提示词生成、大模型生成、后处理与引用标注。这个架构里最容易出问题的地方不是大模型而是检索质量和上下文组装。检索召回的东西不对模型再聪明也白搭召回对了但上下文里混杂了大量无关片段模型照样会被带偏。我后面每一章都会围绕这两个核心展开因为这是RAG效果好坏的分水岭。2. 开发环境与工具链选型2.1 基础运行环境准备我建议开发机至少满足这样的配置16GB内存起步32GB更舒服CPU要求不高但最好有4核以上如果你的语料规模不大几万篇文档以内纯CPU做向量化也能跑但速度会很痛苦有一块支持CUDA的GPU会让Embedding和模型推理快很多。没有本地GPU也没关系现在很多Embedding接口和模型服务都提供了在线方式开发阶段完全可以先依赖在线服务跑通流程再考虑本地化。操作系统方面Windows、macOS、Linux都能用但我个人强烈推荐用Linux做开发和部署原因很现实大部分向量数据库、推理框架对Linux的兼容性和性能优化最好而且生产环境几乎都是Linux开发环境和生产环境一致性越高后面上线踩的坑越少。我自己的做法是本地用开发容器所有依赖全部打进镜像换机器五分钟恢复环境这个习惯帮我省了大量重装环境的时间。Python是RAG生态最主流的语言建议3.10以上版本。装依赖的时候我习惯单独建一个虚拟环境避免和系统Python冲突这不只是好习惯而是必须——我见过太多人在全局环境里装包装到版本冲突最后整个系统Python坏掉白白浪费半天。2.2 主流框架怎么挑RAG开发目前有几条技术路线用编排框架比如LangChain、LlamaIndex这类还是自己手写完整链路。我的体验是框架帮你抽象了常见组件起步快但封装层级多出了问题排查链路长提示词模板和调用细节被藏起来调优时很憋屈。我的建议分阶段快速验证想法、做原型用编排框架效率最高到了生产调优阶段我强烈建议把关键链路手写出来。所谓手写不是从零实现向量检索而是直接用向量数据库的客户端API、用模型服务商的SDK把检索-组装-生成这几个环节自己串起来。这样每一环的逻辑你都看得见、改得动也方便定位问题。举个我自己的例子我第一次做RAG时用了一套封装得很死的框架效果不好我根本不知道是检索的问题还是提示词的问题。后来我拆成手写链路每一步都打印中间结果才发现问题是切分粒度太粗导致召回片段混杂了太多无关内容。从那时起我就形成了个原则框架可以帮你快速起步但你必须能随时打开每个组件的盖子。2.3 模型与向量数据库的搭配思路RAG系统里有两个模型角色一个是Embedding模型负责把文本变成向量一个是生成模型负责读检索结果并产出答案。两者通常是分开选的。Embedding模型的选择直接影响检索召回的上限。中文场景下我更推荐用针对中文优化的Embedding模型而不是直接套用通用模型中文分词和语义表达差异很大通用模型的中文检索效果往往差一截。选型时拿自己的业务语料做评测不要只看榜单分数榜单的测试集跟你的行业术语是两回事。我在一个法律文本项目里测试过几个模型榜单差距不到1分实际业务检索准确率差了十几个百分点。向量数据库的主流选择范围很集中开源的Milvus、Qdrant这类适合大规模生产轻量级的Chroma等适合原型开发和小规模应用。我更倾向在生产环境使用独立向量数据库它支持混合检索、过滤器、持久化、分布式扩展这些都是上线后的刚性需求。别把向量数据库当成高级列表它管理的向量规模、并发访问和持久化策略直接决定你的系统能扛多大压力。生成模型的选择上我的经验是能力够用就行、推理成本要算。业务场景如果以抽取信息、归纳总结为主中等参数量的模型足够如果要复杂推理或多跳问答才需要更大参数量的模型。另外尽量选支持函数调用或结构化输出的模型后面做Agent化RAG和引用格式控制都会用到。3. 知识库构建数据清洗与文档切分3.1 从原始文档到可检索文本知识库构建是整个RAG系统里最脏最累、但也最决定上限的环节。很多人把PDF一扔进系统就指望效果爆棚现实是PDF的排版混乱、表格错位、页眉页脚混入正文、扫描件全是图片这些不处理干净后面检索和生成全都被带偏。我的标准处理流程分五步。第一统一格式把所有文档转成纯文本或Markdown保留标题层级这一步能筛掉大量格式噪音。第二清洗文本去页眉页脚、去重复空行、修正乱码字符、把全角半角统一。第三表格处理表格是文档解析的重灾区简单的表格转成Markdown表格复杂的表格建议提取成表头关键行数据的文本描述因为向量模型对密集表格的理解力有限。第四去重同一份资料可能有多个版本按内容哈希去重避免检索结果被重复内容污染。第五元数据标注给每个片段打上来源文件、章节、更新时间、文档类型等标签。元数据非常重要后面做过滤检索、引用溯源全靠它。我在一个设备手册项目里处理过一批扫描版PDF直接解析出来全是乱码后来用OCR再清洗准确率才上来。这件事没有捷径但有个取舍原则清洗的精细度要和知识库的重要程度成正比。核心业务文档值得花大力气处理一次性参考材料简单清洗就行你要把精力投在回报最高的地方。3.2 切分策略chunk_size怎么定文档切分是RAG里争议最大也最影响效果的一步。切得太碎每个片段信息不完整检索时找不到完整上下文切得太大噪声多、向量表达被稀释还浪费token和存储。常见的切分方式有三种。固定长度切分最简单按字符数或token数切代码好写但会拦腰截断语义递归切分是目前的主流做法按段落、句子、子句的优先级层层切割有分隔符意识能较好地保留语义完整性语义切分更高级通过判断句子间的语义相似度来动态断句效果最好但计算开销大。切分参数的核心是chunk_size和overlap重叠长度。我的经验值是常规文档每个片段200到500个token比较合适overlap设50到100个token。这个区间需要根据文档类型微调——操作手册类可以适当切小因为它们每个操作步骤相对独立论文、法律条文这种强上下文依赖的文档要切大一点避免把关键前提切丢。overlap的作用是防止检索到片段边界时丢失上下文但别设太大否则检索结果冗余度高浪费上下文窗口。这里我给一个我的实测数据某技术文档库chunk_size从500切到800时检索命中率提升了约8%但从800再切到1200时反而下降了5%原因是过大的片段引入了大量无关内容。所以切分参数不要凭感觉一定要在真实业务样本上做对比实验记录召回率和答案质量的变化。3.3 向量化Embedding模型的选择与部署文本切分完之后每一段都要通过Embedding模型转成向量。这里有两个容易忽略的问题。一个是向量维度和模型的关系。不同的Embedding模型输出不同维度的向量比如常见的从768到3072都有。维度越高理论上表达能力越强但存储和检索开销也越大。别盲目追求高维度小规模知识库用低维向量完全够用我自己的一个万级知识库项目从高维模型换成中等维度模型后检索质量几乎没变存储成本降了三分之一检索速度还快了不少。另一个是批量向量化的工程问题。离线构建阶段通常要处理成千上万个片段逐条调用接口太慢要分批批量处理还要考虑接口限流和失败重试。我一般把向量化设计成可断点续跑的流程每个片段处理完就记录状态中断了能从断点继续不用全量重跑。这个设计在几万片的构建任务里救了我好几次。向量化后的存储格式也值得提前规划。每条向量记录至少包含文本内容、向量数组、元数据来源、章节、时间戳。别只存向量不存原文本否则检索出片段后你还得回查原文多一次IO不说还容易因为ID映射错误导致上下文组装对不上。4. 检索链路召回、重排与检索优化4.1 向量检索的局限与混合检索很多人以为装了向量数据库就万事大吉其实向量检索有个天生的短板它擅长找语义相似的内容但不擅长精确匹配。比如用户搜Q3财报发布日期文档里写的是第三季度财务报告将于10月底披露语义检索能匹配上但如果用户搜的是型号、编号、产品名这种精确词向量检索的表现往往不如关键词检索。所以我在生产项目里几乎都用混合检索关键词检索BM25这类和向量检索并行执行两路结果做融合。关键词检索负责精确匹配专有名词和代码向量检索负责语义相关内容的召回互相补位。我的一套客服知识库上线混合检索后检索命中率从纯向量检索的78%提到了91%提升非常明显。混合检索的融合策略也有讲究。最简单的是分数加权把关键词检索和向量检索的分数各自归一化后按权重相加权重需要调试我一般从50/50起步再根据业务场景调节——如果知识库里技术名词多关键词权重要高一些如果用户问题口语化明显向量权重高一些。进阶做法是RRFReciprocal Rank Fusion倒数排名融合按排名位置算融合分不依赖分数尺度比直接加权更稳定我最终项目里用的就是这种方法。4.2 重排序为什么要单独做检索阶段的目标是别漏掉相关内容所以召回数量要放宽我一般召回20到50条候选。但这么多候选不能全塞给大模型上下文窗口有限混入无关片段反而会干扰生成。这时候就需要一个独立的排序模型对候选片段做精细的交叉编码打分只保留最相关的3到5条送进生成链路。为什么需要单独的重排序因为向量检索的相似度分数是向量空间里的距离它衡量的是语义方向的接近程度但不等于对当前问题的相关优先级。而重排序模型把问题和候选片段一起过一遍注意力计算能捕捉更细粒度的相关性。我的实证感受是加了重排序之后生成答案的引用准确率能提升10到20个百分点这是RAG优化里性价比极高的一步。重排序模型的部署要留心延迟预算。交叉编码模型推理比向量检索慢不少所以重排序只对候选集做不对全库做。我把候选集控制在50条以内重排序整个环节延迟控制在几十毫秒量级可接受的范围内。另外重排序模型同样要选中文友好的最好在业务语料上做个简单评测再定。4.3 查询改写与多路召回用户的原始问题往往不适合直接检索。比如用户问最近的政策跟以前比变化大吗这种问题直接进检索效果很差因为检索器不知道最近指什么、以前指哪个版本。查询改写的思路是先用大模型对用户问题做一次轻量理解补全限定条件、拆解隐含意图转化成更适合检索的形式再去查。我给一个常见做法让大模型把用户问题改写成一个或多个独立的检索query比如把苹果公司的营收怎么样改写成苹果公司 最新季度 营收数据苹果公司 年度营收 增长率这样检索友好型的表述。多路查询改写之后再分别走混合检索汇总所有召回结果一起重排就是所谓多路召回。它能明显提升覆盖度代价是多消耗一次模型调用延迟会增加几百毫秒我通常在问题复杂度较高时才启用简单问题直接走原始query。还有一个容易被忽略的技巧问题类型感知。给用户问题做一个简单分类——是事实型问答还是对比型问答还是操作步骤类问答不同类型可以切换不同的检索参数和提示词策略。我在一个工单知识库项目里加了这层判断后答案格式的规范性大幅提升因为操作类问题被引导成步骤化输出对比类问题被引导成对照表格而不是一锅粥的段落。5. 生成链路提示词设计与上下文组装5.1 提示词模板的设计要点到了生成这一步核心原则一句话让模型明确知道该用什么、不该用什么。提示词模板里至少得写清楚几件事——系统角色、任务目标、输入材料的边界、回答的约束条件、输出格式要求。我最常用的模板骨架是系统提示词里声明你是某知识库的智能助手以下由 标签包裹的内容是从知识库检索到的参考资料请你只依据这些资料回答问题不要使用资料之外的知识如果资料中没有相关内容请直接说明不知道不要编造。这种显式声明非常重要它能显著降低模型脱离资料自由发挥的概率。约束条件也要具体。比如回答时注明引用来源格式为[来源编号]如果用户问题和资料内容不完全匹配请先说明这一点再尽量提供最相关的信息。我给每个约束都取一个名字方便在和模型调试时快速定位是哪个约束失效。实际测试中同样的检索结果约束明确和约束模糊的提示词答案的忠实度差别可以达到两到三成。5.2 上下文组装与引用溯源检索结果拿到之后怎么把这些片段组装进提示词也是讲究。我的做法是给每个片段加一个编号和来源标签然后在提示词里拼成有序列表最后在生成指令里要求模型引用时带上对应编号。这样生成结果天然带引用用户可以追溯到原始文档信任感完全不一样。上下文组装还有一个容量问题。检索回来的候选片段如果全部塞进去不仅超token限制还会引入噪音。我一般先按重排序分数截取前3到5条还要做一次相似度去重——有些片段内容高度重叠只保留信息最全的那条避免重复内容浪费窗口空间。组装顺序也有影响。相关度最高的片段放在最靠前的位置我实测发现模型对上下文前部的注意力更集中把最关键的证据放前面能提高引用准确率。这个细节听起来简单但很多人习惯按检索顺序原样排列结果关键信息埋在中间模型反而引用了后面的次要片段。5.3 流式输出与交互体验RAG系统的交互体验和普通大模型应用不太一样。用户等待的时候你在后台其实已经做了检索、重排、组装这几步然后才开始生成。所以工程上通常把流程拆成两个阶段先快速返回检索完成正在生成答案的状态提示或者把检索到的参考片段以参考材料的形式先展示出来再流式输出生成结果。流式输出的实现上有两个注意点。一个是生成过程中要保证引用编号的一致性和可解析性很多模型在流式输出时容易把引用标记拆成两段前端解析会出错所以我倾向于让模型在段落级批量输出引用标记或者生成完后端再补一轮引用解析。另一个是首字延迟TTFT要控制好用户能接受的总等待时间有限检索和重排如果超过两秒体验就会明显变差。我一般把检索重排的总耗时控制在1秒以内给生成留出充足时间。6. 系统集成与部署落地6.1 从Demo到服务的工程化改造把RAG从Notebook里的Demo变成线上服务工作量比想象中大得多。最核心的改造是把单次请求变成稳定服务。我建议先把离线构建和在线推理拆成两个独立模块。离线构建管文档入库有新增文档时触发增量处理在线推理管用户请求需要保证低延迟和高可用。接口设计上我习惯提供三个核心API第一个是知识库管理接口负责上传文档、触发解析入库、查询库内文档状态第二个是检索接口接受用户问题返回检索到的候选片段这个接口对调试非常有用可以单测检索质量第三个是问答接口走完整链路返回最终答案和引用。拆细接口的好处是你可以单独验证每一环是否正常而不是每次都跑全链路黑盒调试。服务稳定性的常规操作不能省接口限流、超时控制、幂等重试、优雅退出。我把超时控制重点提一下大模型推理的耗时波动较大必须给上游调用设置合理超时否则一个慢请求就能拖垮整个服务的线程池。我的做法是整体超时设在用户可容忍范围内每个环节再设子超时任何一个环节超时就直接返回降级结果绝不让请求无限挂起。6.2 缓存、限流与并发控制RAG系统的成本大头在模型推理缓存是省钱的第一手段。日常问答场景里用户在短时间内反复问相似问题的比例其实不低问怎么办和怎么处理往往是同一个诉求。我的做法是加两层缓存第一层是精确匹配缓存相同问题直接返回历史结果第二层是语义缓存用向量检索找相似历史问题相似度超过阈值就复用答案同时要标注该回答基于缓存生成。缓存设计要注意一致性。知识库更新后旧缓存必须失效。我自己的策略是给每条缓存记录打上知识库版本号版本升级时全量清理相关缓存。宁可缓存命中率低一点也不能让用户看到过期答案这是知识类产品的信任底线。并发控制上有个现实问题Embedding模型和重排序模型如果同时被多个请求打满延迟会急剧恶化。我在服务层面对模型推理做了并发池限制控制同时进入推理的请求数超出的请求排队等待。配合队列长度上限和快速失败策略保证系统在突发流量下是慢而不是挂。6.3 可观测性与日志链路RAG链路长出了问题和查案一样必须留全证据。我为每个请求生成唯一的追踪ID贯穿检索、重排、生成全程。日志里至少记录五样东西用户问题原文、改写后的查询、检索召回的所有片段ID和分数、最终送入模型的所有片段、模型输出完整文本。有了这套日志事后分析任何一条坏答案都能还原出是哪个环节出了问题。这里分享一个实战案例某次用户反馈答案完全错误我通过追踪日志发现问题不在于生成模型而在于查询改写阶段把用户的问题改写偏了检索召回了一大堆错误文档模型只是在忠实地基于错误材料编答案。没有这条全链路日志我可能得调半天提示词才发现病根在改写逻辑。所以日志不是可有可无是RAG调试的基础设施。除了日志我还会做三项指标监控检索质量指标召回的Top命中率、生成质量指标答案忠实度抽样评分、性能指标各环节耗时分位数。这些指标用看板可视化我每周固定复盘一次看趋势变化。很多系统问题不是突然爆炸而是逐步恶化指标看板能让你在用户抱怨之前发现问题。7. 效果评估与持续优化7.1 离线评估检索质量与生成质量RAG系统上线前必须有一套离线评估方法否则你做的任何优化都像是在黑箱里打转。我把评估拆成两层检索层和生成层分别考。检索层评估用经典的信息检索指标核心是RecallK和Hit Rate。我建了一个标准测试集从真实用户问题里挑选100到200条为每条问题标注期望命中的文档片段然后跑检索看Top5里有没有命中目标片段统计命中率。这个数字能直接反映检索链路有没有做好。生成层评估不能只看好不好读关键指标是忠实度faithfulness——答案里的每个关键事实是不是都能在检索片段里找到依据。我用的办法是逐条人工评估把答案里的陈述拆成事实点逐个对照片段验证。虽然人工成本高但在关键业务场景上这个钱必须花。自动化评估也可以用大模型打分但大模型当裁判也会偏袒我建议先用人工建一个基准集再让自动评估在这个基准集上校准。7.2 线上反馈闭环离线评估做得再好线上用户还是会给你出惊喜。所以生产系统一定要收集反馈信号我把这些信号分成三类显式反馈用户点赞或踩、隐式反馈用户是否复制答案、是否追问、是否在答案后继续检索以及业务结果反馈比如客服场景里用户问题是否真的被解决。这些信号汇聚之后定期拉出劣质回答样本走回归分析流程找出共性问题。我实践中最有效的闭环动作是bad case周会每周从反馈里抽取十个典型坏例子逐个跑日志回溯定位环节修完之后加入回归测试集防止问题复发。这个机制看着简单但它让整个系统的质量在一个个具体问题的修复中稳定爬升而不是凭感觉优化这优化那。7.3 进阶玩法Agent化RAG、GraphRAG基础RAG跑通之后你会发现有些场景是朴素检索搞不定的。典型的多跳问题用户问某产品的保修政策里提到的客服电话是多少需要先找到保修政策文档再从中找电话信息一步检索搞不定。这时候可以考虑把RAG升级成Agent化让大模型有多轮检索的能力第一次检索结果不充分时自动生成新的检索词继续查把多轮检索结果汇总后再回答。我做的第二代RAG就引入了工具调用模型可以自主决定调用检索、查数据库这些动作配合路由逻辑把用户问题分发到不同的知识库或工具上。效果上最明显的变化是复杂问题的正确率提升了一大截代价是延迟和成本上去了。所以要给你的RAG设一道开关简单问题走快捷链路只有复杂问题才走Agent化链路。另外GraphRAG也在关注范围内。它的思路是先用大模型从文档里抽取实体和关系构建知识图谱再基于图谱做检索。对于强关系型的知识比如组织架构、产品关联、因果链条GraphRAG的效果确实比纯向量检索好但构建成本高、更新复杂。我的判断是如果你的知识库是以强关系为主的领域值得投入尝试如果就是一堆独立的FAQ文档老老实实把向量检索做好收益更高。8. 常见问题排查实录与踩坑清单8.1 检索不到相关内容怎么办这是RAG项目里出现频率最高的问题。用户一问一个不吱声系统回答说知识库中没有相关内容但实际上文档里明明写着。我把排查顺序固定下来效率高很多。第一步查文档有没有进库。很多人栽在最基础的地方文档已经上传但解析失败或者向量化时批量接口报错被吞了库里的向量数是0。通过知识库管理接口查一下总数先排除这个低级但致命的可能。第二步查切分是否把关键信息切散了长文本里关键信息被拦腰截断两边单独看都不完整检索匹配度低。第三步查Embedding模型和查询的词面差异如果用户问题里的词和文档用词完全不同路向量模型又没能建立语义关联就会召回失败这也是我强调混合检索的原因。第四步查重排序参数有时候召回没问题但重排序模型把正确片段排到后面去了被截断丢弃。我见过最典型的一个案例业务部门的人习惯用产品简称提问文档里写的是全称纯向量检索一直召回不到。后来在查询改写阶段加了术语映射简称自动展开成全称命中率当场提升。这个案例提醒我检索问题有时不在技术在业务理解。8.2 答案质量差的排查思路内容能召回了但答案还是不对或者答案与检索材料明显不一致。这个问题按链路倒查法来排查从后往前看。先看生成阶段提示词是否约束了只依据资料回答模型是不是在自由发挥再看上下文组装送入模型的片段里是不是混入了大量无关内容把关键证据挤占掉了然后看重排序正确答案是不是权重不够排在了后面被截掉了最后看检索召回召回集合里本身就没有正确答案那后面全白搭。排查答案质量问题时还有一个高频原因是检索片段过旧。知识库更新机制没做好新文档入库了但检索时优先命中了旧版本答案自然过时。这种问题要回到文档管理流程上建立版本覆盖机制让新版本自动替代旧版本并且把更新时间作为检索排序的一个辅助信号。8.3 性能变差的优化顺序RAG系统跑到后面越来越慢或者并发一高就超时优化顺序我有明确的优先级。第一优先是缓存命中率这是降低延迟最直接的手段先看语义缓存是不是没生效。第二优先是检索侧优化向量数据库的索引类型对不对能否用量化压缩减少IO候选集大小是否过大导致重排序负担太重。第三优先是重排序模型交叉编码器是延迟大户能换成更轻量的模型或者只在候选质量存疑时才启用。第四优先才是换更大的生成模型——生成模型延迟高通常是模型参数量或服务端排队造成的先确认是不是并发配置不合理别一上来就烧钱换模型。还有一个常见但容易被忽略的瓶颈是Embedding操作。在线推理链路里如果需要实时把用户问题向量化Embedding模型这一跳的延迟也要算进去。我优化的时候习惯给全链路做压测用分位数指标P50、P95、P99来定位瓶颈环节而不是凭感觉拍脑袋。哪个环节的P99明显异常就优先处理哪个。最后再分享一个小经验。我在调RAG系统的过程中最大的体会是这个技术80%的效果取决于数据质量和检索链路而不是你用的模型有多强。很多人一上来就纠结于选哪个大模型其实先把文档清洗干净、把切分调好、把混合检索和重排序接上效果就已经能超过大多数粗糙实现。建议你做第一版系统时先别追求完美用一个中等配置跑通全链路拿到一版真实答案然后开始迭代优化。过程中一定要把中间结果打出来看、把日志留全、把坏例子攒下来这三个习惯会让你的RAG系统进步速度快得超出预期。