讲的是怎么用LangSmith来追踪和调试LLM应用的执行链路。你会学到它怎么记录每一步的输入输出和耗时、怎么定位哪一步出了问题、怎么用数据集做评估和回归测试、怎么做A/B测试对比不同prompt效果、怎么监控线上调用质量。适合用LangChain开发、需要排查问题和优化应用效果的开发者。建议边读边动手实验,把概念变成肌肉记忆。
需要学习LangSmith链式追踪,AI模型的链上部署和验证需要工程化能力。本篇涵盖MLOps/LLMOps、模型部署、CI/CD、版本管理,帮助你实现AI工程化交付。
可视化演示
展示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 演示
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'])}")
from langsmith import traceable从 langsmith SDK 导入 traceable 装饰器,用于将函数标记为可追踪的 Run。from langsmith import Client导入 LangSmith Client,用于与 LangSmith API 交互,如创建数据集和提交评估结果。os.environ["LANGSMITH_API_KEY"] = "your-api-key-here"设置 LangSmith API Key 环境变量,用于认证 API 访问。os.environ["LANGSMITH_TRACING"] = "true"启用 LangSmith 追踪功能,设置为 true 后所有 @traceable 装饰的函数都会被记录。os.environ["LANGSMITH_PROJECT"] = "langsmith-chain-tracing-demo"指定追踪数据所属的 Project 名称,便于在 LangSmith 平台上组织和管理。@traceable(name="retrieve_context", run_type="retriever")使用 @traceable 装饰器标记检索函数,指定 Run 名称为 retrieve_context,类型为 retriever。def retrieve_context(query: str) -> list:定义检索函数,接收查询字符串,返回相关文档列表。该函数的执行会被自动记录为一个 Run。@traceable(name="generate_answer", run_type="llm")使用 @traceable 装饰器标记 LLM 生成函数,类型为 llm,在追踪树中会显示为 LLM 调用节点。def generate_answer(query: str, context: list) -> str:定义 LLM 生成函数,接收查询和上下文,生成最终回答。输入输出都会被记录到 Trace 中。@traceable(name="rag_pipeline", run_type="chain")使用 @traceable 装饰器标记 RAG 管道主函数,类型为 chain,作为父 Run 包含子 Run。def rag_pipeline(query: str) -> dict:定义 RAG 管道函数,内部调用检索和生成函数,形成树形追踪结构。context = retrieve_context(query)调用检索函数,由于两者都有 @traceable 装饰器,这一步会自动创建子 Run 并建立父子关系。answer = generate_answer(query, context)调用生成函数,同样自动记录为子 Run,其输入参数和返回值都会被捕获。result = rag_pipeline("LangSmith 链式追踪有什么作用?")执行 RAG 管道,触发完整的追踪记录,在 LangSmith 上可以看到包含3个 Run 的树形 Trace。
常见问答
LangSmith 和 LangChain 是什么关系?是否必须一起使用?
LangSmith 追踪会影响应用性能吗?如何最小化影响?
如何从已有的日志系统迁移到 LangSmith 追踪?
LangSmith 的评估数据集应该包含多少数据才够?
如何在 LangSmith 中设置有效的告警阈值?
LangSmith 支持自定义可视化看板吗?
如何处理 LangSmith 追踪数据中的敏感信息?
常见误区
误区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 的最佳实践,包括监控看板设计、告警策略和成本优化。