RAG 落地常见坑与评估上线:怎么知道这套东西好不好用
作者:利威尔xu | CSDN 专栏《RAG 保姆级实战:从原理到落地》
前言
在第五篇《RAG全流程》里,咱把检索链路走通了。混合召回把向量检索和关键词检索两路合并,重排把候选再精筛一遍,Prompt 编排把检索结果妥帖地塞给大模型,引用溯源让回答有据可查。
链路搭起来了,怎么知道它好不好用?
这问题听着简单,答起来难。你搭了一条 RAG 流水线,改了参数、调了模型、换了切分策略,结果有没有变好?靠感觉说"好像好了一点",这不是工程师该干的事。
讲真,这是整个专栏最后一道关。前五篇咱一路打怪升级:第一篇讲了 RAG 是什么、幻觉从哪来,第二篇讲了降幻觉武器库和微调对比,第三篇讲了流程与切分,第四篇讲了向量与向量库,第五篇讲了检索重排与引用溯源。这一篇收尾,把"怎么知道好不好"这个问题答清楚,同时把六篇内容串成一个闭环。
一、落地常见坑,先说透
RAG 落地最让人头疼的,不是搭链路,是链路搭好了才发现踩了一堆坑。咱把最常见的五个坑掰开讲,每个坑讲清楚成因和对策。
最坑的一环是切分不合理。
第三篇咱讲了切分,但落地的时候切分的问题才真正暴露出来。切太大,语义稀释,一块文档塞了三个主题,向量不纯粹,检索出来的块看着相关、细看不准确;切太小,上下文碎片化,模型拿到半截话自己发挥,答出来的内容不完整。
成因为拍脑袋定参数——每块多少字全凭感觉,没有结合文档结构来定。对策也简单:先看文档本身是什么结构,段落清晰的优先按段落切,结构杂的再考虑固定长度或者语义切分,切完跑评估看效果,有问题再调参。
再一个是召回不准。
你搭好了向量检索,兴冲冲上线,结果用户搜"订单 A12345 的状态",系统给的是一批语义相关的退货政策、售后服务文档,就是没有 A12345 这个号码。这就是纯向量检索的盲区——对精确词不敏感。
反过来,你只用关键词检索,用户问"怎么查订单状态",系统返回一批包含"订单"和"状态"字样的文档,但真正有用的"订单查询操作指南"里说的是"查询订单进度",字面不对应,也找不到。
成因就是单路检索的天然局限。对策是第五篇讲过的混合召回——向量和关键词两路并跑,加权合并。两路权重的比例要结合你的数据特点来调,没有标准答案,调一调看效果。
还有个坑是 Prompt 太长,模型迷失。
你把检索回来的文档块全部塞进 Prompt,几十个块、几万字塞进去,模型看着一堆资料反而不知道该信哪个,开始按自己的记忆发挥,答出来的内容跟检索资料对不上。
成因是贪多——觉得塞得多给得准。其实不是,模型对 Prompt 中间的内容最不敏感,塞太多反而干扰。对策是控长度,用重排精筛到 top-5、top-10,再塞进 Prompt,留余量给模型发挥,不要把上下文窗口填满。
再一个是模型不遵循上下文。
你明明在 Prompt 里给了参考资料,模型还是按自己的知识库答,说出来的内容跟资料对不上,或者干脆引用了错误的来源。用户一查原文,发现对不上,对系统失去信任。
成因是模型有自己的先验知识,当 Prompt 里的资料和模型记忆冲突的时候,模型有时候会选择相信自己记住的东西,尤其是用通用大模型、没有针对你的业务数据微调过的时候。对策有几个:Prompt 里明确要求"只根据参考资料回答,不要自己发挥";要求引用来源,让模型必须标注文档编号;把温度调低,让模型输出更保守、更依赖参考资料而不是自由发挥。
最后一个坑是评估缺失,改了什么不知道好没好。
你调了切分策略、换了 Embedding 模型、改了 Prompt 参数,怎么知道效果变好了?靠感觉说"好像更准了",这是玄学,不是工程。
成因是没建评估集,没量化指标,改完上线靠猜。对策很简单:建一套标准评估集,跑量化指标,看数字说话。这个咱下一节专门展开。
这五个坑,用一个生活场景串起来很好理解。你开了家餐厅,菜做出来了,开业前要不要试菜?试菜就是评估。试菜发现菜太咸,是盐放多了还是食材问题?这就是分层定位。开业后客人反馈怎么样,点赞多还是吐槽多?这就是监控。没有试菜、没有反馈,餐厅早晚要黄——RAG 系统也一样。
面试官可能追问:RAG 落地最大的坑是哪个?
答:没有绝对最大的坑,看业务场景。但工程实践里最常见、也最容易被忽略的是评估缺失。切分不合理、召回不准、Prompt 太长、模型不遵循上下文这四个坑,多少都能看到症状——用户说查不到、说答得不对,你能听见。评估缺失是隐形的:你改完了、切分调了、Prompt 改了、模型换了,线上没人投诉,你也不知道到底变好还是变差,等于一直在盲调。别的坑至少给你报警,评估缺失连报警都没有。
二、RAG 评估的基本思路
修车铺修完一辆车,师傅怎么知道修好了?发动引擎听声音、上路跑一段看有没有异响。这就是评估——不是猜,是试。
RAG 评估也分两层:检索层和生成层。
检索层评估,看的是"找对了没有"。常用指标有三个。
召回率——用户问的问题,相关文档有多少被检索出来了。100 条相关文档,召回 80 条,召回率 80%。召回率低,说明漏掉了有用的资料,后面的生成再好也是巧妇难为无米之炊。
准确率——检索出来的文档,有多少是真正相关的。检索了 20 条,里头只有 10 条相关,准确率 50%。准确率低,说明检索里掺了太多无关内容,模型容易被带跑。
MRR——第一个相关结果排在第几位。排在第 1 位得 1 分,第 3 位得三分之一分。MRR 高,说明最好的答案在最前面,用户不用翻好几页才找到想要的内容。
生成层评估,看的是"答对了没有"。这里要注意,生成层评估不是单纯评大模型,是评整条链路。
答案准确性——生成的回答是不是对的。这个通常靠人工评估,给评估员一批问题,对照标准答案打分。
忠实度——生成的回答是不是基于检索到的资料,而不是模型自己胡编。这个可以设计一些"干扰问题",答案不在参考资料里,看模型是老实说"资料里没提到"还是自己编一个。
引用准确率——模型标出的引用来源,是不是真的跟答案对应上了。第五篇讲了引用溯源,如果模型答"根据 [1] 退款需在 30 天内",实际上 [1] 这篇文档根本没提 30 天,那引用就是错的。
评估的关键认知是这样:RAG 评估不是评一个大模型,是评一整条链路。用户反馈"答得不准",可能是切分问题(相关的内容被切散了),可能是召回问题(相关的文档根本没被拉出来),也可能是生成问题(资料找对了但模型没理解),也可能是 Prompt 问题(参考资料没放对位置)。没有分层的评估指标,你根本定位不到根因。
为什么放这段代码?展示分层评估指标记录的基本格式,理解评估集应该长什么样。
// 分层评估记录typeEvalRecordstruct{Question,GoldAnswerstring// 用户问题、标准答案RetrievedDocs,GoldDocIDs[]string// 召回文档块、标准文档 IDGeneratedAnswerstring// 模型生成的答案Citations[]int// 模型引用的文档编号}// 评估指标计算(检索层)funccalcMetrics(r[]EvalRecord)map[string]float64{returnmap[string]float64{"recall":calcRecall(r),"precision":calcPrecision(r),"mrr":calcMRR(r),}}这段代码在干嘛?展示分层评估指标的数据结构:每条记录包含问题、召回文档、标准文档 ID、生成答案、标准答案、模型引用编号;然后算出召回率、准确率、MRR 三个检索层指标。生成层的忠实度和引用准确率可以在此基础上再扩展,这里只展示检索层的基本形态。为了代码清晰,这里省略了常规的错误处理和相关逻辑,实际生产代码中务必加if err != nil判断。
面试官可能追问:RAG 怎么评估?
答:RAG 评估分检索层和生成层。检索层看召回率、准确率、MRR;生成层看答案准确性、忠实度(是否基于资料而非胡编)、引用准确率(模型标出的来源是否真的对应答案)。关键认知是:RAG 评估不是评一个大模型,是评一整条链路——用户说"答得不准",可能是切分问题、召回问题、Prompt 问题或生成问题,没有分层指标定位不到根因。
三、怎么建评估集
评估集建不好,评估就是空中楼阁。
你可能会问:评估集要多大才够?讲真,不用很大,几十到几百条就够用,关键是覆盖典型场景和边界情况。
用"模拟考出题"来理解就清楚了。高考前做模拟卷,不是题做得越多越好,而是卷子要能覆盖所有知识点、常考点、易错点。评估集也一样,不在于量大,在于质量——你得从真实业务问题里采样,挑那些最能代表用户实际提问方式的。
建评估集分四步走。
第一步,从真实日志里采样。去捞用户真实问的问题,过滤掉无意义的闲聊,保留有业务含义的提问。几十条到一百条就够,覆盖主要场景就行。
第二步,为每个问题标注标准答案和应该召回的文档块。这步最费人工,但也是最有价值的——标注完了你就有了 ground truth。标准答案不一定完美,但至少能反映"好的回答长什么样"。
第三步,把这条评估集固定下来,每次改动都跑一遍看指标。换了 Embedding 模型、调整了切分策略、修改了 Prompt——这些改动上线前都要跑评估,指标变好了再上,变差了先分析原因。
第四步,定期补充新问题。用户的问题会变,业务场景会扩展,评估集也要跟着迭代,不是一劳永逸的。
有个坑要提醒:评估集本身不能泄露到训练数据里。如果你的评估问题是公开给大模型微调用过的,模型早就记住了,评估结果没有参考价值。评估集要跟训练数据隔离,用真实的、没见过的业务问题。
面试官可能追问:评估集怎么建?
答:四步走——从真实日志采样典型问题,人工标注标准答案和应该召回的文档块,固定评估集每次改动都跑指标,定期补充新问题。评估集不用大,几十到几百条够用,关键是覆盖典型场景和边界情况,不在于量在于质。有一个坑要防:评估集不能跟训练数据混,混了模型早就记住了,评估结果不准。
四、上线监控
评估集建好了,评估也跑了,是不是可以高枕无忧了?
别急,上线才是真正的考验。
用"餐厅试营业"来理解就清楚了。餐厅试营业期间,师傅会盯着翻台率、客诉率、剩菜率——这些数据比任何预估都真实。RAG 系统上线后也一样,监控数据是下一轮优化的真正输入。
上线后要盯的指标有这么几类。
响应延迟。用户等太久体验直接崩。向量检索、重排、大模型生成,每一步的延迟都要能单独拆出来看。延迟高了要知道是哪一步拖后腿。
检索命中率。用户提问后,有多少提问能召回至少一条相关文档。命中率太低,说明召回层有问题,大量问题根本没找到有用资料,后面的环节全是白搭。
引用准确率。模型回答里标的来源,有多少是真的跟答案对应的。这个指标在上线初期往往很低,监控它能帮你快速发现 Prompt 或者引用溯源链路的问题。
用户反馈。点赞、点踩、追问,每个都是信号。点踩多的回答要抽查,追问多的场景要补充资料库,用户骂得凶的问题要优先优化。
异常问题。系统有没有拒答、模型有没有开始胡编、检索有没有大规模返回空结果。这些异常要有告警,不能等用户投诉了才知道。
上线不是终点,是起点。监控数据是下一轮调优的输入——召回率低了调混合召回权重,引用准确率低了看 Prompt 约束够不够,用户反馈差了分析具体问题场景。每一轮优化都基于数据,而不是感觉。
为什么放这段代码?让读者看到上线后每次请求该记录哪些字段,才能定位问题。
// 监控埋点:每次请求记录的关键字段typeTraceLogstruct{RequestIDstring// 请求唯一 ID,串联全链路Latency time.Duration// 端到端延迟RetrieveCountint// 召回文档数 / HitCount 命中数CitationCountint// 模型输出的引用数量TokenUsedint// 本次消耗的 token 数UserFeedbackstring// 点赞 / 点踩 / 追问}// 埋点上报funclogTrace(ctx context.Context,log*TraceLog){metrics.Counter("rag_latency",log.Latency)// 延迟分布logger.Info("rag_trace",log)// 完整字段落日志}这段代码在干嘛?每次请求把延迟、召回数、命中数、引用数、token 消耗、用户反馈这些字段落到日志或监控系统里,带上 RequestID 串联全链路。线上出问题的时候,能按字段拆开看:是延迟飙了、还是命中率掉了、还是引用数异常,能迅速定位到是哪一环。RequestID 很重要,用户报障时你得靠它捞出那次请求的完整链路。为了代码清晰,这里省略了常规的错误处理和相关逻辑,实际生产代码中务必加if err != nil判断。
面试官可能追问:上线后要监控什么?
答:四类指标——响应延迟(向量检索、重排、大模型生成各环节拆开看)、检索命中率(有多少问题能召回相关文档)、引用准确率(模型标的来源是否真实对应答案)、用户反馈(点赞点踩追问,每个都是信号)。还有一个坑要防:监控要能覆盖异常情况——模型拒答、胡编、检索返回空结果,这些要有告警,不能等用户投诉才发现。
五、从能跑到敢扛生产
到这里,RAG 的链路、评估、监控都讲完了。但还有一个现实问题要面对:能跑不等于敢扛生产流量。
你本地跑通了,上小流量也 ok,但真要抗住生产环境的并发、延迟、成本要求,还有几步要补。
并发和延迟。生产环境可能同时来几百个请求,向量库能不能扛住并发,大模型调用的延迟能不能控制在合理范围,Prompt 的长度直接影响 token 消耗和响应时间。这些要在压测里摸清楚,不是拍胸脯说"应该没问题"。
成本。token 消耗是大头。用户问一个问题,Prompt 里塞多少检索结果、生成的回答有多长,都会影响 token 消耗,进而影响调用成本。要算清楚单次问答的 token 成本,才能定合理的商业模式或者内部成本分摊。
容错。检索不到相关文档怎么办?大模型超时怎么办?向量库挂了怎么办?这些边界情况要有兜底策略——检索为空时返回"抱歉未找到相关信息"而不是硬塞一个错误答案,模型超时要有超时处理,向量库挂了要走关键词兜底方案。
这些坑不用展开讲,你只需要知道它们存在,落地的时候别一头撞上去就行。生产环境是另一套考验,能在本地跑通不代表能抗住线上流量,先小流量验证再逐步放量,是稳妥的节奏。
💡 本章面试要点
RAG 落地最大的坑是什么?
RAG 落地最大的坑不是搭链路,是搭完才发现处处是坑。最常见的五个坑:切分不合理(拍脑袋定参数)、召回不准(单路检索盲区)、Prompt 太长模型迷失(贪多塞料)、模型不遵循上下文(先验冲突)、评估缺失(改完靠玄学不知道好没好)。说到底是工程细节问题,不是算法问题——RAG 的链路本身不复杂,复杂的是每个环节的参数、策略、评估都要结合业务来定。RAG 怎么评估?
分检索层和生成层。检索层看召回率、准确率、MRR;生成层看答案准确性、忠实度(是否基于资料而非胡编)、引用准确率(模型标的来源是否真实对应答案)。关键认知:RAG 评估不是评一个大模型,是评一整条链路——用户说"答得不准",可能是切分问题、召回问题、Prompt 问题或生成问题,没有分层指标定位不到根因。评估集怎么建?
四步走——从真实日志采样典型问题,人工标注标准答案和应该召回的文档块,固定评估集每次改动都跑指标,定期补充新问题。评估集不用大,几十到几百条够用,关键是覆盖典型场景和边界情况,不在于量在于质。有一个坑要防:评估集不能跟训练数据混,混了模型早就记住了,评估结果不准。上线后要监控什么?
四类指标——响应延迟(向量检索、重排、大模型生成各环节拆开看)、检索命中率(有多少问题能召回相关文档)、引用准确率(模型标的来源是否真实对应答案)、用户反馈(点赞点踩追问,每个都是信号)。还有一个坑要防:监控要能覆盖异常情况——模型拒答、胡编、检索返回空结果,这些要有告警,不能等用户投诉才发现。从能跑到生产要补什么?
能跑不等于敢扛生产流量。生产环境要过三关:并发延迟(压测摸清楚瓶颈在哪)、成本(算清楚单次问答的 token 消耗和调用成本)、容错(检索为空怎么兜底、模型超时怎么处理、向量库挂了走什么降级方案)。先小流量验证再逐步放量,是稳妥的节奏。
六、收尾:打怪升级完成
写到这儿,整个专栏六篇就算收尾了。
从 RAG 是什么、幻觉从哪来,一路走到落地坑与评估上线,你手里现在有的是一套完整的认知框架。RAG 不难,难在细节——切分、召回、重排、Prompt、评估,每一环都是坑,踩过一个才知道下一个在哪。落地就是一个不断踩坑、评估、调优的循环。
说白了,RAG 不是搭好就完事的系统,是一个需要持续运营的东西。评估集要维护、模型要调优、资料库要补充、监控要盯紧。但正因为它能运营,你才能不断迭代、不断变好,而不是搭完就扔那儿不知道好不好。
这个专栏到这就结束了,但你的 RAG 落地才刚开始。
如果这个专栏帮你从零搞懂了 RAG,欢迎点赞、收藏、关注利威尔xu。六篇写下来不容易,如果对你有哪怕一点帮助,点赞收藏就是最大的支持。
你们项目里 RAG 落地踩过什么坑?评估集怎么建的?评论区聊聊。