1. 链路追踪不是终点评估才是 RAG 应用真正需要的先说一个挺实际的现象不少团队把 LangSmith 接进来第一反应都是当成“监控面板”用看 trace、看耗时、看 token 消耗图表一拉感觉应用跑得很稳任务就结束了。但跑过一阵子 RAG 应用之后你会慢慢发现链路追踪能告诉你“哪里慢了”、“报什么错了”却很难直接回答“这个答案到底准不准”“检索到的上下文是不是真的有用”“用户问法一换回答质量会不会跳水”。而这些恰恰才是一个 RAG 应用能不能真正落地的关键。所以这篇文章想聊的不是 LangSmith 的基础用法而是我自己从“用 LangSmith 做链路追踪”到“用 LangSmith 做 RAG 自动化评估”这一段实践的完整记录。整个过程里我踩过不少坑比如评估数据集结构没设计好、大模型评判指标设置太抽象、评估结果和线上反馈对不上等等遇到这些问题之后我一度怀疑是 LangSmith 本身不够聪明后来才发现大多数时候其实是我自己的方法没到位。这篇文章适合谁看主要是那些已经在做 RAG 应用但觉得“检索效果好不好”全凭肉眼抽查、心里没底的开发者。如果你只是偶尔看一下链路追踪面板还没有认真想过怎么把评估做成自动化的那这篇文章应该能帮你把思路盘活。我会重点讲清楚链路追踪和评估之间到底是什么关系、为什么评估必须建立在追踪数据之上以及从追踪切换到自动化评估时具体每一步该怎么做。2. 拆解链路追踪在 RAG 应用里到底能看什么2.1 RAG 应用的复杂度决定了追踪的必要性先不急着讲 LangSmith 的功能我们先把 RAG 应用这个业务场景聊透。一个典型的生产级 RAG 系统表面上是一个“输入问题、输出答案”的对话接口实际上内部至少串起了这样几段流程用户问题进来先做意图识别和查询改写接着检索子系统开始工作包括 embedding、向量数据库召回、关键词召回、rerank 重排有时候还有过滤和聚合逻辑最后这些检索结果被拼进 prompt送给大模型生成答案。有意思的是每一段流程的错误都不会直接让整个应用“崩溃”而是表现为答案质量下降。比如检索结果里混进一篇不相关的文档应用依然能跑通依然会返回一段看起来像模像样的回答但答案可能引用了错误的信息。这种“温水煮青蛙”式的劣化光靠人工看几条记录是发现不了的。链路追踪在这里面的价值不是说它能把坏答案标红而是它能把每一次调用过程中每一段子流程的执行细节记录下来——检索用了多少毫秒、向量库返回了什么内容、发进大模型的 prompt 最后是什么样的、token 消耗了多少——有了这些数据你才有机会去分析“为什么回答质量不对劲”。LangSmith 的 trace 模型本质上是把整条调用链打开给你看。很多人以为 trace 只是看延迟和报错其实真正有用的是中间数据流的检查。举个例子在 LangSmith 的 trace 视图里你可以直接展开某一次用户请求看到 embedding 调用返回了多少个向量、向量检索命中了哪些文档块、rerank 后的排序是什么样的甚至能看到拼装完成后的完整 prompt 长什么样。这些数据放在以前你得自己加日志手动打印现在用 LangSmith 的 Session 视图就能按时间、按用户、按 api_key 去回溯。这里有一个很关键的观察很多团队把链路追踪当成“排障工具”用也就是出了问题才去看一眼这是把它的价值用窄了。链路追踪更值钱的用法是作为“数据采集器”持续收集线上真实请求的完整数据流。为什么要强调“线上”因为线下测试集再努力建造也不如真实用户的提问方式更有代表性。真实用户会问得口语化、会有错别字、会问出训练数据里完全没有的刁钻问题这些千奇百怪的样本才是评估集最宝贵的数据来源。LangSmith 的 trace 数据默认就能保留这些原始输入和输出后期要做数据集可以非常方便地从 trace 里导出。2.2 链路追踪的三个实战观察切入点具体到操作层面链路追踪装好之后我一般建议先花几天时间观察三个指标而不是急着做评估。第一每次请求的中间耗时分布。RAG 应用的延迟往往不是一大块而是由很多小块加起来的像向量检索可能占 300msrerank 可能占 100msLLM 生成可能占 800ms通过 LangSmith 的 Span 时间统计你能一眼看出哪一段是最主要的瓶颈。第二检索结果召回率也就是每次请求中真正被用户采纳的检索结果占比有多大。这个在 trace 里看不到直接的数字但你可以通过查看最终 prompt 和最终答案的引用情况做初步判断。第三prompt 结构的稳定性。生产环境中 prompt 改了一次线上响应立刻变了trace 会把 prompt 版本和内容都记下来这样发现答案质量变化时很快就能定位是不是 prompt 被改动导致的。我见过不少新人在这一阶段容易犯一个毛病就是盯着 trace 界面反复刷新试图从某一次请求里总结出规律。这其实是徒劳的单个请求的 trace 只能说明个案要得出有效结论必须把足够多的 trace 数据拉下来做统计。好在 LangSmith 的 Dataset 功能提供了从 trace 批量导出的能力这就为我们接下来要聊的自动化评估打下了基础。可以说链路追踪做得好不好直接决定后面评估数据集的土壤肥不肥。3. RAG 自动化评估为什么非要自动以及核心思路设计3.1 手工评估为什么撑不住先聊聊我为什么坚持要走到自动化评估这一步。说实话在早期阶段我评估 RAG 质量的方式非常原始从线上日志里挑几条看起来有代表性的问题自己拼一个二十来条的小测试集每次改动完检索逻辑或者 prompt就手动跑一遍让测试集的每条答案都人工读一遍打分记到表格里。这套流程在应用刚起步、prompt 结构还没稳定的时候还勉强能用但问题也很明显。首先是覆盖量不足。二十条测试集看起来能跑实际上很难覆盖到各种提问方式的变化可能一个检索策略的调整对测试集里的三条样本效果好却对真实问法普遍变差这种回归根本无法被这两条案例捕捉到。其次是评分标准不稳定。同一个答案我来打分可能给 8 分换个人来看可能只有 5 分就算我自己隔两天再来看标准也会因为当时的状态而漂移。更致命的是人工评估完全没法跟上迭代速度。每次改完 prompt、调整 rerank 阈值你都得重新跑一遍全部数据人工去看、去打分这个流程在测试集小的时候还能忍一旦数据量过百基本就变成一个不可能完成的任务。自动化评估的意义不是用它完全替代人的判断而是把“机器能评的维度”交给机器把“人的审美判断”留在关键环节。检索阶段的召回质量、上下文引用准确性这类客观性强的指标完全可以用程序逻辑来评价生成答案的忠实度、相关性这类需要理解语言语义的指标可以交给大模型来充当评判员。这两类评估结合起来释放出来的时间会非常可观也能让你在迭代过程中敢于频繁调整。3.2 自动评估体系的两个引擎LangSmith 的自动化评估体系我习惯拆成两个引擎来理解一个是基于规则的评估器一个是基于 LLM 的评估器。两者不是替代关系而是互补关系。基于规则的评估器适合处理那些结果可以“硬比较”的场景。比如回答里必须包含某几个关键实体可以写规则判断比如答案格式要求列表、代码块、JSON可以用规则校验结构比如检索出来的文档片段必须属于某个指定的知识库范围也可以用规则做过滤。规则评估的优势是稳定、可解释、成本低跑一千条数据既不耗 token 也不会出现评判漂移但它的缺点也很明显——处理不了语义层面的模糊判断。基于 LLM 的评估器也就是用大模型来做裁判适合处理答案相关性、忠实度这类需要理解语言内容的场景。LangSmith 自带了几种常用的 LLM 评估器比如 answer correctness、answer relevance、context relevance 等这些评估器会拿用户的 query、参考的 ground truth如果有的话、context 和生成的 answer 一起喂给大模型评判模型由评判模型给出一个分数和理由。这种方案的优点是很接近人的感受灵活度高缺点是费时费钱而且评判模型本身的稳定性也需要调教。我实际使用下来的经验是评判模型选择要慎重同一个评估器换一个底层模型评分结果可能差出一个等级。这两个引擎在设计上还有一个容易忽略的点就是评估器本身的触发时机。LangSmith 既支持在线评估也就是每次请求完成后立刻触发评估器做评判也支持离线评估就是在数据集上批量跑。我建议在线评估只保留少数轻量级规则比如 prompt 注入检测、输出格式校验因为这些评估器响应极快且不贵而需要大模型评判的指标建议放到离线评估阶段因为批量跑会省钱省时也方便对比不同迭代版本之间的差异。3.3 评估数据集的设计是整个体系的命门评估体系里最不被重视但又最关键的部分其实是评估数据集本身。LangSmith 虽然提供了比较完善的评估运行框架但如果喂进去的数据集质量不过关整个评估体系输出的结论都会失真。评估数据集的三个核心组成部分——输入 query、参考答案 ground truth、上下文 context——各自承担不同角色。query 决定了评估样本的真实性最好从线上 trace 里抽取而非凭空写ground truth 是评判模型判断答案正确性的基准不能乱写要保证是准确且完整的标准答案context 则是评估时需要说明的检索场景因为你评估的往往是“在给定上下文情况下模型生成答案的质量”而不是评估检索本身的质量。从实践角度看最容易被忽略的是 ground truth 的质量控制。如果你用 LLM 自动生成 ground truth多半会出现“看似合理但关键细节错误”的情况。说实话我刚开始也走捷径让大模型帮忙生成参考答案结果评估器把很多错误答案判成了高分因为评判模型和生成模型都在同一个“幻觉轨道”上自圆其说。后来我把 ground truth 生成方式改成先用大模型生成草稿再由人工校对一遍在线抽检比例至少 30%保证质量合格再进入评估集。另外测试集的动态更新也值得一提。不要建一个数据集就几个月不更新RAG 应用的知识库内容会变、用户提问的热点会漂好的做法是每周从线上 trace 里挑新增的问题类型补充到现有评估集里同时把已经能稳定回答的旧问题做降权或移出。这样做的好处是评估集不会变成一个脱离实际业务的死集而是持续跟随线上真实场景演化。4. 实操从链路追踪数据到自动化评估的完整落地4.1 先接好链路追踪再谈评估在开始搭建评估体系之前我先说一个前置工作确保你的应用已经把链路追踪完整接进来并且数据是可导出、可查询的。这个看起来像是废话但实际操作中我碰到过很多次追踪时好时坏eval 跑起来才发现 trace 里缺关键字段比如没有记录最终的 prompt或者 rerank 环节没有被分成独立的 span导致评估的时候拿不到完整的上下文信息。LangSmith 的接入方式有几种如果你是直接用 LangChain / LangGraph 封装的应用配置是最简单的只要设置两个环境变量就行。下面是一次完整的最小化接入示意import os from langsmith import Client os.environ[LANGCHAIN_TRACING_V2] true os.environ[LANGCHAIN_PROJECT] rag-project-prod os.environ[LANGCHAIN_API_KEY] ls__your_api_key client Client()如果是 FastAPI 这类自定义架构LangSmith 也提供了 REST API 直接上报 trace 的能力。但我不建议一开始就用 API 手写上报逻辑因为会很累且容易漏字段。稳妥做法是先用原生的 LangChain 包装层跑通链路观察 trace 出现在控制台再逐步把不合适的环节替换成自定义回调函数。这里有一个新手容易掉进去的坑只给入口函数打了 trace 装饰器但内部的每个子步骤没有拆成独立 Span导致 trace 视图里只有一根光秃秃的调用记录中间检索、rerank、prompt 组装这些信息全部丢失。正确的做法是在关键步骤之间用tracer.start_span()显式隔离子环节。我自己会在三个地方强制切分跨度查询改写环节、混合检索环节、prompt 组装环节这样 trace 视图里的分段会非常清晰后续评估也能直接按 span 名称来定位数据。一个结构清晰的 trace 应该长成下面这样这只是为了帮助大家理解层级关系并不是真实数据Root: User Query 什么是xxx ├── Query Rewriter (Latency: 35ms) ├── Hybrid Retriever (Latency: 280ms) │ ├── Vector Search (Latency: 150ms, hits: 12) │ └── Keyword Search (Latency: 100ms, hits: 8) ├── Reranker (Latency: 120ms, top_k: 5) ├── Prompt Assembly (token count: 890) └── LLM Generation (Latency: 620ms, tokens: 210)注意这里最终结构的粒度不是越多越好跨度太碎会增加追踪开销太粗又无法定位问题。我一般是“让每个业务阶段至少有一个 span”同时避免在循环内创建大量无意义的小 span。4.2 基于 trace 数据构建评估数据集链路追踪攒了一段时间之后就可以开始构建评估数据集了。LangSmith 的数据集构建方式很灵活你可以手动创建空数据集后逐条添加记录也可以从 trace 里直接提取指定请求记录转为评估样例。我最常用的做法是先把线上 trace 拉出来做聚类分析。比如这个月线上用户问最多的是“操作流程类”问题还是“异常处理类”问题再根据问题类型从每类里挑选有代表性的请求作为评估样本。接下来要做的是把这些 trace 请求转成包含 query、context、ground truth 三个字段的评估样例。通过 LangSmith 的 Dataset API 可以直接添加from langsmith import Client client Client() dataset_name rag-eval-weekly-v2 dataset client.create_dataset(dataset_name, description线上trace抽取的RAG评估集) examples [ { query: 报销单审核通过后多久到账, context: [财务规定……略, 报销流程……略], ground_truth: 审核通过后一般三个工作日内到账具体以开户行处理时间为准。 }, { query: 如何申请远程办公设备, context: [行政通知……略, 设备申请入口……略], ground_truth: 需要先向部门负责人提交申请审批通过后在内部系统填写设备申请单。 } ] for ex in examples: client.create_example(dataset_iddataset.id, inputs{query: ex[query]}, outputsex)这里的关键点是context字段并不一定要求是真实的线上检索结果它可以是经过人工整理后认为“正确应该召回”的上下文。这样设定评价目标就更清晰了我们评估的是“给定正确上下文模型能否产出合格答案”这个环节而不把检索质量一次性混进来。等你把这个环节的评估体系跑稳以后再增加一步检索质量的评估也就是把真实 trace 里的检索结果作为 context对比理想 context 和真实 context 的差距逐步逼近线上真实效果。关于评估集规模我个人的参考线是初期 30~50 条足够跑通流程但提交到生产级别的评估基准至少要有 200 条以上且需要覆盖多轮对话场景。只测单轮问答的 RAG 评估跟实际生产环境还是有差距的因为多轮对话里的指代消解、上下文记忆是另一个大坑不单独覆盖就容易漏。4.3 配置自动化评估流程与指标评估集就绪后最关键的一步就是配置评估器。LangSmith 的评估流程按我的理解本质是「数据集 评估器列表 被评估的运行记录」三者结合跑完之后生成一个独立的评估结果列表可以浏览每一行答案的分数和评判理由。我一般会在评估器列表里同时放三类指标。第一类是内容正确性指标我通常选用answer_correctness它会综合对比参考答案和评估模型给出的答案判断语义错误和关键信息缺失情况第二类是答案相关性指标也就是answer_relevance专门评估生成答案是否紧贴用户问题——有时候答案句子本身没有错但跑题了靠这个指标能筛出来。第三类是忠实度指标LangSmith 里有类似faithfulness或context_recall这样偏检索侧的工具我会用context_precision来看检索出来交给 LLM 的上下文是否真正有助于回答。在评估模型的选型上我强烈建议不要把评估用的模型和业务生成用的模型混为一谈。这里的逻辑是让同一个模型既当运动员又当裁判很容易出现“自己给自己找理由”的倾向比如模型内部已经把某个错误信息当作常识生成答案时还用了一样错的内容用它自己做裁判就很可能会认为是正确的因为它的观点本身就这么认为。现实一点的方案是选一个能力足够强、且和业务模型不同符号来源的大模型作为评判模型哪怕贵一点也值。我目前线上在跑的一套评估配置可以参考如下评估维度评估器类型输入依赖用途格式合法性规则评估器输出校验JSON/代码块等结构内容正确性LLM评估器query, ground_truth, answer判断答案是否与标准答案一致答案相关性LLM评估器query, answer判断答案是否命中用户问题意图上下文忠实度LLM评估器query, context, answer判断答案每句话是否有上下文依据提一句上面提到的这些是 LangSmith 生态里常用的评估器没有特定绑定某一家模型。实践时完全可以根据自己场景抄不同评估器的思路写一两个自定义评估逻辑逻辑不复杂本质是一个 Python 函数接收输入输出字段返回一个带 score 和 key 的字典即可。我写过最成功的一个自定义评估器是专门检测答案中是否引用了外部不存在实体的利用规则匹配去比对 context 中出现的实体能精准抓出“无中生有”型幻觉案例且零 token 消耗。4.4 评估结果如何反哺链路追踪与迭代到这里如果你觉得自动化评估跑通了就完事那还是没把这条链路的价值吃透。真正有价值的是让评估结果和链路追踪数据形成一个闭环每一轮评估完都能反过来指导 RAG 应用的下一步优化方向。我会做的一件基础工作是把评估失败样本和线上 trace 对应起来查。LangSmith 里的每个评估结果都关联了一段运行记录点开评估分数低的那条记录你能直接跳回当时的完整链路追踪页面。比如某条答案被判为“上下文忠实度低”展开 trace 就能看到当时的检索结果确实很偏可能是 embedding 模型参数没调好、也可能是知识库切块策略导致内容碎片化。如果一类失败大量集中在某个链条环节那就说明该环节需要优先优化。再比如我把评估结果按周统计以timeline视图展示后能很清楚地看到同一批评估集上的平均分变化。如果某次改动 prompt 后平均分从 0.82 掉到 0.65那这次改动就得反复审查。这个能力一定不要浪费因为它等于给你的 RAG 迭代装上了一台赛道测速仪虽然不会告诉你什么是完美答案但至少能告诉你每一次改动是变好还是倒退。核心变化表一般是这样的能协助你整理问题优先级失败类型可定位链路环节优先动作答案不相关LLM prompt、检索排序优化 prompt 指令重新调 rerank 权重忠实度低上下文拼装、检索召回检查切块粒度提升 top_k 或改进召回策略实体幻觉知识库内容、模型能力校对知识库加入检索范围约束格式错误模型输出层增加规则校验调整输出格式设定这个闭环跑顺了以后后续再迭代 RAG 应用就不会像以前一样“靠感觉”了。我们的实践结果是过去每次调整检索参数都是一次全赌现在有了自动化评估兜底我敢在生产环境层面调整之前先在测试集上验证几百条结果风险会小很多。这套流程虽然搭建阶段投入不小但一次性解决了困扰我们很久的“变更不可衡量”问题长期看性价比很高。5. 常见问题与排查经验快查自动化评估体系搭建过程中周期最长、也是最麻烦的其实是各种“暗坑”。我把实际踩过的坑整理成下面这个列表能帮大家省点时间。trace 字段缺失导致评估脚本报错常见表现评估跑起来后发现某条数据缺少context或ground_truth。原因多半是 trace 上报时没有在输出字段中保留这些信息。解法是在应用的回调或输出逻辑中显式把检索结果和拼装后的上下文 write 进 trace 的 output 字段别依赖 LangSmith 自动提取。评估分数普遍偏高但线上质量依然差这个坑最迷惑人。排查思路是看评估集的构建方式如果是自己手写的一些“标准问法”的均匀分布往往会失真。线上用户的问法其实更贴近口语甚至带错字如果评估集没有足够数量的真实对话来源分数虚高也正常。建议扩充线上 trace 抽样比例动态补充一些长尾问法。评估器用错模型导致结果不稳定评判模型的温度、版本、甚至上下文长度都会影响分数。要尽量固定评测模型的版本和参数并在同一时间窗口内跑完所有需要对比的数据集避免跨周评分漂移。至少在同一轮对比中要确保所有样本用的是同一个评判模型的同一个版本。大模型裁判偏向于给长答案打高分这是一个非常普遍的现象特别是当你选的评估 prompt 比较笼统时评判模型容易把“内容多”当作“内容好”。解法是在自定义评估 prompt 里显式加入“请忽略答案长度”“答案简洁且正确才能给高分”之类的指令。我加了这条以后评分分布明显合理了一些。评估结果波动大难以判断改动好坏先不要怀疑评估器先看测试集样本量。只有二三十条时随机波动本身就很大一次改动导致三条样本分数变化就能让平均分显得剧烈波动。建议把这组数跑出置信区间或者增大测试集一般 100 条以上会稍微稳定一些。在线评估开销过大如果你把 LLM 评估器每一条都对线上调用实时跑token 消耗很快就会让你肉疼。我的策略是线上只留规则类评估器凡是涉及大模型评判的一律转入离线评估用测试集批量做。除了这些常规问题我再分享两个有点偏门但很实用的经验。第一个如果你团队里同时有多个人在迭代 RAG 应用建议在 LangSmith 项目上按成员区分 project比如按功能分支命名这样评估结果和 trace 都能分离不会互相污染。第二个LangSmith 的 dataset 是可以做版本管理的我习惯每次迭代前从数据集 fork 出一个临时版本等验证完成以后再合并回主干这算是一个非常实用的流程保护。6. 最后再分享一点这几个月跑下来的真实感受链路追踪和自动化评估之间很多人以为是一个“先后衔接”的关系——先把追踪做好再做评估。但跑完这一圈之后我的体会是它们本质上是同一个系统的两面追踪负责记录每次请求的完整事实评估负责基于这些事实给出价值判断。没有追踪评估是空中楼阁有了追踪而没有评估数据就只是躺在控制台里的一堆漂亮图表。我对 LangSmith 在 RAG 领域的定位也经历了一个从“监控工具”到“开发平台”的理解转变。真正给你带来巨大杠杆的不是看链路追踪面板上那些五颜六色的 span而是你把 trace 数据沉淀成评估集、把评估结果反哺回检索和生成迭代的整个闭环。这个闭环虽然搭建需要投入不少精力但一旦跑通你就是从“靠手感调 RAG”跨进了“靠数据调 RAG”的阶段这两者之间的差距用过的人会懂。如果你刚开始接触 LangSmith我的建议是别急着一步登天把评估体系全建好先老老实实跑两周追踪攒下一批线上脱敏的 trace 数据然后再从这堆 trace 里挑选代表性样本构建小评估集跑通一次最小化的评估闭环。等这个闭环稳定了再逐步把评估指标加全、把测试集扩充、把自动触发机制接进 CI/CD小步快跑比一次性大改造稳妥得多。这篇文章里的很多坑都是我在一次大改造中踩出来的如果早点意识到“小步快跑”的价值应该能少走不少弯路。