讲的是怎么用LangSmith来追踪和调试LLM应用的执行链路。你会学到它怎么记录每一步的输入输出和耗时、怎么定位哪一步出了问题、怎么用数据集做评估和回归测试、怎么做A/B测试对比不同prompt效果、怎么监控线上调用质量。适合用LangChain开发、需要排查问题和优化应用效果的开发者。建议边读边动手实验,把概念变成肌肉记忆。

岗位关联

需要学习LangSmith链式追踪,AI模型的链上部署和验证需要工程化能力。本篇涵盖MLOps/LLMOps、模型部署、CI/CD、版本管理,帮助你实现AI工程化交付。

目录
  1. 可视化演示
  2. LangSmith链式追踪原理与架构
  3. 执行链路记录与问题定位
  4. 数据集评估与回归测试
  5. A/B测试与Prompt效果对比
  6. 线上调用质量监控
  7. AI 应用场景
  8. Python 演示
  9. 常见问答
  10. 常见误区
  11. 参考来源

可视化演示

展示LLM应用链式追踪树结构与执行耗时、数据集评估回归测试流程与A/B测试双版本Prompt效果对比监控。

本节配有交互动效(进入视口后自动加载,约 3KB)。

链式追踪树结构 每次LLM调用生成Trace树每个节点为Run记录输入输出与耗时 通过树形展开可定位具体哪一步出现延迟或错误 T=Σt(Run) 总耗时为所有Run节点耗时之和

LangSmith链式追踪原理与架构

LangSmith 是 LangChain 团队推出的 LLM 应用可观测性平台,其核心能力是链式追踪(Chain Tracing)。链式追踪的本质是将一次完整的 LLM 应用请求记录为一棵 Trace 树,树的每个节点称为一个 Run,代表链路中的一个执行步骤(如 LLM 调用、工具调用、检索操作等)。

LangSmith 的追踪架构基于装饰器模式实现。通过 @traceable 装饰器,开发者可以将任意 Python 函数标记为可追踪的,装饰器会自动在函数执行前后创建 Run 记录,捕获输入参数、输出结果、执行时间、错误信息等元数据。这种非侵入式的设计使得追踪接入对业务代码的改动最小化。

追踪数据以树形结构组织,父子关系通过 parent_run_id 建立。当被 @traceable 装饰的函数 A 内部调用了同样被装饰的函数 B 时,LangSmith 通过 Python 的 contextvars 机制自动将 A 的 Run 信息设置为 B 的父上下文,从而在 LangSmith 平台上呈现出清晰的层级调用关系。

LangSmith SDK 可以独立于 LangChain 框架使用。开发者只需安装 langsmith 包,设置 LANGSMITH_API_KEY 和 LANGSMITH_TRACING 环境变量,即可通过 @traceable 装饰器为任何 Python 应用添加追踪能力。SDK 内部实现了异步批量上报机制,将追踪数据缓冲后批量发送到 LangSmith API,避免对主业务性能产生影响。

在架构层面,LangSmith 的追踪系统包含三个核心组件:1)SDK 层负责数据采集和上下文管理;2)传输层负责异步批量上报和失败重试;3)平台层负责数据存储、索引、查询和可视化展示。这三层解耦设计使得系统既能在开发环境快速调试,也能在生产环境高并发场景下稳定运行。

执行链路记录与问题定位

LangSmith 的执行链路记录是问题定位的核心工具。每次 LLM 应用的调用都会生成一个完整的 Trace,包含所有 Run 的输入输出、时间戳、状态码和元数据。开发者可以通过 LangSmith Web UI 或 API 查看这些追踪数据,快速定位问题所在。

时间线视图(Timeline View)是 LangSmith 最强大的问题定位工具之一。它以甘特图的形式展示每个 Run 的执行时间区间,直观呈现各步骤的耗时分布。当应用出现延迟问题时,开发者可以一眼看出哪个环节耗时最长,是 LLM 推理慢、检索延迟高,还是工具调用超时。

多维度检索功能让开发者可以从海量 Trace 中精确找到目标数据。支持的过滤维度包括:时间范围、Project、Run 类型(llm/chain/tool/retriever)、执行状态(success/error)、延迟范围、metadata 字段值、tags 标签等。通过组合多个过滤条件,可以快速定位特定场景下的异常 Trace。

错误追踪和根因分析是链路记录的重要应用场景。当某个 Run 执行失败时,LangSmith 会记录完整的错误堆栈信息,并在追踪树中标记错误状态。开发者可以沿着调用链从上到下逐层检查,快速找到第一个出错的 Run,查看其输入参数和错误详情,从而定位根因。

在实际的问题定位实践中,推荐采用'自顶向下'的分析策略:首先查看 Trace 总览了解整体耗时和状态,然后关注耗时最长或状态异常的 Run,深入查看其输入输出和元数据,最后结合代码逻辑判断问题原因。这种系统化的方法可以高效解决大部分 LLM 应用问题。

数据集评估与回归测试

LangSmith 的评估系统为 LLM 应用提供了系统化的质量保障能力。评估的核心要素包括:评估数据集(Dataset)、目标函数(Target Function)和评估器(Evaluator)。评估数据集存储一组标准化的输入-期望输出对,目标函数是待评估的 LLM 应用逻辑,评估器负责比较实际输出与期望输出的差异并给出评分。

评估数据集的设计直接影响评估结果的有效性。好的评估数据集应该覆盖多样化的输入场景,包括正常情况、边界条件和异常情况。每个 example 包含 inputs(模型输入)和 reference_outputs(参考输出/期望输出)。数据集可以通过 SDK 编程创建、Web UI 手动添加或从 CSV/JSON 文件批量导入。

LangSmith 支持多种评估器类型:1)精确匹配评估器(Exact Match)检查输出是否与期望完全一致;2)子串匹配评估器检查输出是否包含关键信息;3)LLM-as-Judge 评估器使用另一个 LLM 对输出质量进行多维度评分;4)自定义 Python 函数评估器实现任意评估逻辑。实际项目中通常组合使用多种评估器,从不同角度评估输出质量。

回归测试是评估系统的核心应用场景。当 Prompt 修改、模型升级或代码变更时,通过运行回归评估可以及时发现质量退化。评估结果会与基准线(baseline)对比,任何指标的显著下降都会触发告警。这种机制确保了每次变更都是'正向改进'而非'引入问题'。

评估结果在 LangSmith 中以可视化看板呈现,包括总体评分分布、各维度得分趋势、失败用例详情等。开发者可以深入查看每个 example 的评估详情,对比模型实际输出与参考输出,分析评估器的打分理由,从而有针对性地改进 Prompt 或应用逻辑。

A/B测试与Prompt效果对比

A/B 测试是验证 Prompt 改进效果的科学方法。在 LangSmith 中,A/B 测试的核心思路是将不同的 Prompt 版本(或模型配置)同时部署,按比例将真实流量分配到各版本,然后通过评估指标对比各版本的表现差异,使用统计检验方法判断差异是否显著。

多版本并行测试的实现方式包括:1)在 LangSmith 中创建多个 Project 分别对应不同版本;2)使用 LangSmith 的 dataset evaluation 功能对同一数据集运行不同版本并对比结果;3)在生产环境中通过路由层将请求分配到不同的 Prompt 版本。选择哪种方式取决于测试阶段和流量规模。

流量分配策略需要考虑统计功效和实际风险。常见的策略包括:均匀分配(50/50)用于早期探索阶段,不均匀分配(如 90/10)用于风险较高的变更。流量分配应该随机化,避免引入选择偏差。同时需要确保样本量足够大,以达到预期的统计功效(通常要求 80% 以上)。

统计显著性检验是 A/B 测试结论可靠性的保证。LangSmith 支持多种检验方法:t 检验适用于正态分布的连续指标(如评估分数),卡方检验适用于分类指标(如通过率),bootstrap 方法不依赖分布假设,适用于各种指标类型。关键是要在测试前确定显著性水平(通常 alpha=0.05)和最小可检测效应(MDE)。

A/B 测试的最佳实践包括:1)明确假设和主要评估指标;2)计算所需样本量;3)设定测试持续时间;4)监控测试过程中的异常;5)分析结果时注意辛普森悖论等统计陷阱;6)记录测试结论供后续参考。LangSmith 的评估看板和导出功能为这些步骤提供了完整的数据支持。

线上调用质量监控

线上质量监控是 LangSmith 在生产环境中的核心价值。通过实时监控 LLM 应用的关键指标,团队可以在问题影响用户之前发现并解决。监控体系通常分为三个层次:基础设施层(延迟、错误率、吞吐量)、模型层(token 使用量、模型响应质量)和业务层(用户满意度、任务完成率)。

实时监控看板(Dashboard)是监控体系的可视化核心。LangSmith 提供可定制的看板,支持展示以下关键指标:1)请求延迟的 P50/P95/P99 分位数;2)错误率和错误类型分布;3)评估分数的趋势变化;4)token 消耗和成本统计;5)各 Run 类型的耗时分布。看板应该按 Project、环境和功能模块进行分组,便于快速定位问题范围。

告警阈值的设定需要平衡灵敏度和误报率。常见的告警规则包括:延迟 P95 超过阈值(如 5 秒)、错误率超过基线的 X%、评估分数低于基线 Y 分、token 消耗异常增长等。告警应该分级处理:P0 级别(服务不可用)立即响应,P1 级别(质量下降)限时处理,P2 级别(性能退化)排期优化。

质量看板的建设应该遵循'从全局到局部'的原则。顶层看板展示整体健康度(可用性、总体质量分数、成本),下钻到各功能模块的看板(各业务场景的评估分数、延迟分布),最终到单个 Trace 的详情。这种层次化的设计让不同角色的团队成员都能快速找到需要的信息。

持续改进是监控体系的最终目标。通过定期分析监控数据,团队可以识别系统性的质量问题(如某类输入的评估分数持续偏低)、性能瓶颈(如特定工具的调用延迟持续增长)和成本优化机会(如某些场景可以切换到更便宜的模型)。LangSmith 的数据导出和 API 能力支持与外部分析工具集成,实现更深入的数据分析。

AI 应用场景

RAG管道质量监控与优化

阶段:监控与优化

解决的问题:RAG(检索增强生成)管道涉及检索和生成两个阶段,问题可能出现在任一环节。通过LangSmith链式追踪,可以分别监控检索质量(文档相关性、召回率)和生成质量(回答准确性、忠实度),快速定位是检索不到相关文档还是生成偏离了上下文。

具体案例:某企业知识库问答系统中,用户反馈回答质量下降。通过LangSmith追踪发现:1)检索阶段的run_type为retriever的Run显示检索延迟从200ms增长到2s,原因是向量数据库索引膨胀;2)生成阶段的LLM Run显示token消耗异常增加,原因是检索返回了过多低相关性文档。优化后检索延迟恢复到150ms,token成本降低40%。

Prompt迭代的效果验证

阶段:评估与测试

解决的问题:Prompt工程师频繁修改Prompt以优化输出质量,但缺乏系统化的方法来验证每次修改是改进还是退化。通过LangSmith的评估数据集和A/B测试功能,可以量化每次Prompt变更的效果,确保迭代方向正确。

具体案例:一个客服对话系统的Prompt优化流程:1)在LangSmith中建立包含200个典型对话的评估数据集;2)使用LLM-as-Judge评估器从准确性、礼貌性、完整性三个维度评分;3)每次Prompt修改后自动运行回归评估;4)通过A/B测试对比新旧版本在生产流量上的表现。经过5轮迭代,客户满意度从72%提升到89%。

多Agent系统的调试与优化

阶段:开发与调试

解决的问题:多Agent系统中多个Agent协作完成复杂任务,调用链路复杂且难以调试。LangSmith的链式追踪可以清晰展示Agent间的消息传递、决策路径和工具调用,帮助开发者理解系统行为并定位问题。

具体案例:一个自动化数据分析系统包含规划Agent、执行Agent和验证Agent。通过LangSmith追踪发现:验证Agent频繁驳回执行Agent的结果,原因是规划Agent生成的任务描述不够明确。通过在追踪树中分析Agent间的输入输出,优化了Agent间的接口定义,任务成功率从65%提升到92%。

Python 演示

python42 行
import osfrom langsmith import traceablefrom langsmith import Client # 设置 LangSmith 环境变量os.environ["LANGSMITH_API_KEY"] = "your-api-key-here"os.environ["LANGSMITH_TRACING"] = "true"os.environ["LANGSMITH_PROJECT"] = "langsmith-chain-tracing-demo" # 使用 @traceable 装饰器标记可追踪函数@traceable(name="retrieve_context", run_type="retriever")def retrieve_context(query: str) -> list:    """模拟检索相关文档"""    documents = [        {"content": "LangSmith 提供 LLM 应用的可观测性", "score": 0.95},        {"content": "链式追踪帮助定位性能瓶颈", "score": 0.88},    ]    return [doc for doc in documents if doc["score"] > 0.8] @traceable(name="generate_answer", run_type="llm")def generate_answer(query: str, context: list) -> str:    """模拟 LLM 生成回答"""    context_str = " ".join([doc["content"] for doc in context])    prompt = f"基于以下上下文回答问题。\n上下文: {context_str}\n问题: {query}\n回答:"    # 这里模拟 LLM 调用,实际项目中替换为真实 API 调用    answer = f"根据上下文,{query} 的回答涉及: {context_str}"    return answer @traceable(name="rag_pipeline", run_type="chain")def rag_pipeline(query: str) -> dict:    """RAG 管道:检索 + 生成"""    context = retrieve_context(query)    answer = generate_answer(query, context)    return {"query": query, "context": context, "answer": answer} # 执行并追踪if __name__ == "__main__":    client = Client()    result = rag_pipeline("LangSmith 链式追踪有什么作用?")    print(f"查询: {result['query']}")    print(f"回答: {result['answer']}")    print(f"检索文档数: {len(result['context'])}")
目的:演示使用 LangSmith SDK 的 @traceable 装饰器构建一个可追踪的 RAG 管道,包含检索和生成两个步骤,展示链式追踪的树形结构记录。
  1. from langsmith import traceable从 langsmith SDK 导入 traceable 装饰器,用于将函数标记为可追踪的 Run。
  2. from langsmith import Client导入 LangSmith Client,用于与 LangSmith API 交互,如创建数据集和提交评估结果。
  3. os.environ["LANGSMITH_API_KEY"] = "your-api-key-here"设置 LangSmith API Key 环境变量,用于认证 API 访问。
  4. os.environ["LANGSMITH_TRACING"] = "true"启用 LangSmith 追踪功能,设置为 true 后所有 @traceable 装饰的函数都会被记录。
  5. os.environ["LANGSMITH_PROJECT"] = "langsmith-chain-tracing-demo"指定追踪数据所属的 Project 名称,便于在 LangSmith 平台上组织和管理。
  6. @traceable(name="retrieve_context", run_type="retriever")使用 @traceable 装饰器标记检索函数,指定 Run 名称为 retrieve_context,类型为 retriever。
  7. def retrieve_context(query: str) -> list:定义检索函数,接收查询字符串,返回相关文档列表。该函数的执行会被自动记录为一个 Run。
  8. @traceable(name="generate_answer", run_type="llm")使用 @traceable 装饰器标记 LLM 生成函数,类型为 llm,在追踪树中会显示为 LLM 调用节点。
  9. def generate_answer(query: str, context: list) -> str:定义 LLM 生成函数,接收查询和上下文,生成最终回答。输入输出都会被记录到 Trace 中。
  10. @traceable(name="rag_pipeline", run_type="chain")使用 @traceable 装饰器标记 RAG 管道主函数,类型为 chain,作为父 Run 包含子 Run。
  11. def rag_pipeline(query: str) -> dict:定义 RAG 管道函数,内部调用检索和生成函数,形成树形追踪结构。
  12. context = retrieve_context(query)调用检索函数,由于两者都有 @traceable 装饰器,这一步会自动创建子 Run 并建立父子关系。
  13. answer = generate_answer(query, context)调用生成函数,同样自动记录为子 Run,其输入参数和返回值都会被捕获。
  14. result = rag_pipeline("LangSmith 链式追踪有什么作用?")执行 RAG 管道,触发完整的追踪记录,在 LangSmith 上可以看到包含3个 Run 的树形 Trace。

常见问答

LangSmith 和 LangChain 是什么关系?是否必须一起使用?
LangSmith 是 LangChain 团队开发的独立可观测性平台,虽然与 LangChain 框架深度集成(自动追踪 LangChain 的调用链),但完全可以独立使用。只需安装 langsmith SDK 包,通过 @traceable 装饰器即可为任何 Python 应用添加追踪能力,无需引入 LangChain 框架。
LangSmith 追踪会影响应用性能吗?如何最小化影响?
LangSmith SDK 采用异步批量上报机制,追踪数据的收集和发送在后台线程中进行,不会阻塞主业务逻辑。为最小化影响,建议:1)使用默认的批量上报配置;2)在生产环境设置合理的采样率;3)避免在追踪数据中包含过大的 payload;4)确保网络连接到 LangSmith API 的延迟可控。
如何从已有的日志系统迁移到 LangSmith 追踪?
迁移建议分步进行:1)先在关键入口函数添加 @traceable 装饰器,建立顶层 Trace;2)逐步在内部函数添加追踪,丰富链路细节;3)将现有日志中的关键信息(如用户ID、请求ID)写入 Run 的 metadata,保持可关联性;4)在过渡期保持两套系统并行,验证 LangSmith 数据完整性后再逐步下线旧系统。
LangSmith 的评估数据集应该包含多少数据才够?
数据集规模取决于应用场景的复杂度。建议起步阶段:简单场景50-100个example,中等复杂度200-500个,复杂场景500+个。关键原则是质量优于数量:确保覆盖各种输入类型、边界条件和异常场景。随着应用迭代,持续补充新发现的case,保持数据集的时效性和代表性。
如何在 LangSmith 中设置有效的告警阈值?
设置告警阈值的步骤:1)先收集1-2周的基线数据,了解各项指标的正常范围;2)基于基线计算均值和标准差;3)将告警阈值设为均值+2~3倍标准差(根据容忍度调整);4)区分不同级别的告警(P0/P1/P2),设置不同的响应时效;5)定期回顾和调整阈值,避免告警疲劳。
LangSmith 支持自定义可视化看板吗?
LangSmith 提供可定制的看板功能,支持选择和组合各种指标进行展示。此外,通过 LangSmith API 可以导出追踪数据和评估结果,与 Grafana、Datadog 等外部监控工具集成,构建更复杂的自定义可视化看板。LangSmith 的 Python SDK 提供了便捷的数据查询接口,方便与数据分析工具(如 Pandas、Jupyter)配合使用。
如何处理 LangSmith 追踪数据中的敏感信息?
处理敏感信息的最佳实践:1)在 @traceable 装饰器中使用 process_inputs/process_outputs 参数对输入输出进行脱敏处理;2)避免在 metadata 中记录 PII(个人身份信息);3)使用 LangSmith 的数据保留策略自动清理过期数据;4)配置基于角色的访问控制,限制敏感 Project 的访问权限;5)在企业合规框架下制定追踪数据的使用规范。

常见误区

误区LangSmith 必须配合 LangChain 框架才能使用

正解LangSmith 可以完全独立使用。只需安装 langsmith SDK 包,通过 @traceable 装饰器即可为任何 Python 函数添加追踪能力。LangChain 框架只是预置了 LangSmith 的集成,但并非必要条件。

为何常见:LangSmith 最初是作为 LangChain 生态的一部分推出的,早期文档和教程多以 LangChain 为例,导致很多人误以为两者是绑定关系。

误区追踪数据越多越好,应该记录所有函数的所有细节

正解过度追踪会导致性能下降、存储成本增加和信息噪音。应该只追踪关键的业务函数和 LLM 调用点,避免追踪纯计算函数或数据转换函数。在生产环境还应设置合理的采样率,平衡可观测性和资源消耗。

为何常见:初学者往往认为'有总比没有好',倾向于给所有函数加上 @traceable 装饰器,忽略了追踪本身的开销和数据分析的效率问题。

误区A/B 测试中只要版本A的平均分高于版本B,就能断定A更好

正解仅比较平均值是不够的,必须进行统计显著性检验。差异可能是随机波动导致的,需要通过 t 检验、bootstrap 置信区间等方法验证差异是否统计显著(p < 0.05)。同时要考虑样本量是否足够、是否存在辛普森悖论等统计陷阱。

为何常见:直觉上'平均分高就是好'很容易被接受,但统计学告诉我们小样本下的均值差异可能纯粹是偶然。缺乏统计训练的开发者容易忽略这一点。

误区LLM-as-Judge 评估器比人工评估更可靠,可以完全替代人工

正解LLM-as-Judge 是高效的自动化评估手段,但并非完美。它存在位置偏差、自我偏好、对微妙错误不敏感等问题。最佳实践是将 LLM-as-Judge 作为初筛工具,对关键场景和边界case仍需人工评估验证,并定期校准 LLM 评估器与人工评估的一致性。

为何常见:LLM-as-Judge 的自动化和可扩展性让人倾向于认为它完全客观,但实际上评估用的 LLM 本身也有偏差和盲区,需要人工监督和校准。

误区LangSmith 追踪只用于开发调试,生产环境不需要

正解LangSmith 在生产环境同样重要甚至更重要。生产环境的追踪数据是质量监控、成本分析、用户行为分析和持续优化的基础。通过生产环境的追踪数据可以发现测试环境无法覆盖的长尾问题,验证优化效果,并为评估数据集补充真实case。

为何常见:很多团队将追踪等同于调试工具,认为上线后就不需要了。实际上生产环境的可观测性是保障 LLM 应用长期稳定运行的关键。

参考来源

  • official_documentationLangSmith DocumentationLangSmith 官方文档,包含追踪、评估、数据集、Playground 等所有功能的详细说明和 API 参考。
  • official_documentationLangSmith Tracing GuideLangSmith 追踪功能官方指南,详细介绍 @traceable 装饰器、追踪上下文传播、追踪数据模型和最佳实践。
  • official_documentationLangSmith Evaluation GuideLangSmith 评估功能官方指南,涵盖评估数据集创建、评估器类型、回归测试流程和 A/B 测试方法。
  • official_tutorialLangChain + LangSmith IntegrationLangChain 框架与 LangSmith 集成的官方教程,展示如何在 LangChain 应用中启用追踪和评估。
  • blog_postLangSmith Best Practices for Production LLM AppsLangChain 官方博客文章,分享在生产环境中使用 LangSmith 的最佳实践,包括监控看板设计、告警策略和成本优化。