news 2026/8/6 4:06:41

LangSmith的Trace和Span是什么

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangSmith的Trace和Span是什么

Span(跨度)

在LLM可观测 / OpenTelemetry / LangSmith / LangFuse 领域:
Trace:一次完整请求的整条链路(一条大树干)
Span:Trace里面的每一小段操作(树上的每一个节点/树枝)

  • 1条Trace= 1次完整会话/一次Agent执行。
  • 一条Trace由多个Span组成,Span之间有父子嵌套关系,形成树。

举个Agent例子:

Trace: 用户提问:帮我查北京天气 ├─ Span【Agent主chain】(总耗时 2.2s) ├─ Span【调用工具 search天气】(耗时0.8s) └─ Span【LLM生成回答】(耗时1.3s)

每一个方块就是一个Span

Span里面记录什么信息

每个Span一定有:

  1. span_id:自己唯一ID
  2. parent_span_id:父Span的id;顶层Span父id=None
  3. 开始时间、结束时间 → 计算耗时
  4. operation name:操作名字(llm.invoketool.searchgraph_node:call_tool
  5. 输入 inputs,输出 outputs
  6. 状态:成功 / error / cancelled(被取消)
  7. 元数据:token消耗、模型名称、异常堆栈

LangSmith里面叫RunRun = Span,概念等价。
LangSmith术语:Trace是根Run,下面所有子Run就是子Span。

产品整条链路单元片段
LangSmithTrace(根Run)Run(等价Span)
LangFuseTraceObservation(Obs),等价Span
OpenTelemetryTraceSpan

LangSmith内部:Run对象就是Span;_CURRENT_RUNcontextvar存的就是当前正在执行的Span对象。

父子Span是怎么形成的(结合前面contextvars)

  1. 创建父Span(根Run),把它存入ContextVar
  2. 执行子函数,@traceable/ callback 读取context拿到父Span。
  3. 创建子Span,把子Span的parent_span_id = 父span_id
  4. 子Span执行完成,上报。

不需要手动传参,靠上下文隐式拿到父ID,自动嵌套。

三种Span结束状态

  1. ✅正常结束:拿到end回调,记录结束时间,完整上报。
  2. ❌异常报错:触发on_xxx_error回调,标记span状态为error,记录异常栈。
  3. ⚠️被取消(前端停止生成):task.cancel(),协程抛出CancelledError。
    • 不会走到end回调,也不会走到error回调
    • Span只有start,没有end;UI看到一条“截断、未完成”的trace。

区分容易混淆名词

  1. Trace:完整的一次业务请求链路(根)
  2. Span:链路中每一个独立操作片段(子节点)
  3. ContextVar:用来隐式传递当前span对象,方便自动设置parent_span_id
  4. Callback:事件钩子,在业务节点执行的前后,触发创建/结束Span

极简伪代码模拟Span模型

@dataclassclassSpan:span_id:strparent_span_id:str|Nonename:strstart_time:floatend_time:float|Nonestatus:str# ok / error / cancelledinputs:dictoutputs:dict|None# 上下文变量保存当前正在运行的spancurrent_span:ContextVar[Span|None]=ContextVar("current_span")defstart_span(name):parent=current_span.get()span=Span(span_id=str(uuid.uuid4()),parent_span_id=parent.span_idifparentelseNone,name=name,start_time=time.time(),end_time=None,status="ok",inputs={},outputs=None)token=current_span.set(span)returnspan,tokendefend_span(span,token):span.end_time=time.time()report_span(span)# 上报到LangSmith/LangFusecurrent_span.reset(token)

回到Agent业务

用户发消息跑LangGraph:

  1. 新建Trace(根Span)存入contextvar
  2. 执行graph节点,回调触发,新建子Span,parent指向根
  3. 节点内部调用LLM,再新建LLM子Span
  4. 用户点停止,task.cancel,代码直接中断。end_span()不会执行。
    → 所有已经start但是没有end的Span,在平台上展示为残缺链路。

对比LangFuse

LangFuse Observation就是Span,但不依赖contextvars,你必须手动传入父trace/observation_id,或者依赖OTel的上下文。所以不会出现隐式上下文带来的断链,但埋点代码写得更多。

一句话总结:
Trace是一整条请求,Span就是这条请求里面每一步操作的记录单元。LangSmith的Run就是Span。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 4:05:47

从PS/2到USB:深入解析键盘接口协议、扫描码与嵌入式开发实践

1. 从PS/2到现代:键盘接口的演进与底层逻辑最近在折腾一台老旧的工控机,翻箱倒柜找出一根紫色的PS/2键盘线,插上后熟悉的“咔哒”声响起,系统顺利识别。这让我想起,虽然现在USB键盘一统天下,但PS/2这个“老…

作者头像 李华
网站建设 2026/8/6 4:05:47

企业级AI Agent安全架构:从数据加密到权限管控的实战指南

1. 项目概述:为什么企业级AI Agent必须构建自己的安全防线最近和几个负责企业数字化转型的CTO、安全负责人聊,发现一个挺有意思的现象:大家一边热火朝天地搞AI Agent试点,一边又对这东西进生产环境心里没底。一个金融客户的原话是…

作者头像 李华
网站建设 2026/8/6 4:02:39

西樵网站建设怎么选?深耕本地流量+专业UI设计,助你在南海突围,打造高转化率的企业官网

说实话,做企业这一行,尤其是咱们在西樵、在南海这块地盘上做生意的老板们,心里头都清楚一个理儿:酒香也怕巷子深。以前咱们做买卖,靠的是熟人介绍,靠的是门口招牌,靠的是在茶桌上推杯换盏的情谊。那时候,只要东西好,服务态度诚恳,客户自然蜂拥而至。但现在时代变了,…

作者头像 李华
网站建设 2026/8/6 4:02:58

基于Hugo与Pagefind构建个人知识索引系统:从Markdown到静态搜索

1. 项目概述:从“课程索引”到知识管理系统的蜕变如果你和我一样,在某个领域深耕多年,无论是技术、管理还是学术研究,手头积累的课程、讲座、研讨会视频和资料一定会多到让你头疼。它们可能散落在硬盘的各个角落,躺在不…

作者头像 李华
网站建设 2026/8/6 4:02:26

高速接口ESD保护设计:AVX超低电容TVS二极管选型与应用实战

1. 项目概述:高速ESD保护与AVX TVS二极管新系列在电子设计领域,静电放电(ESD)就像电路板上看不见的“刺客”,一次不经意的触碰或摩擦产生的瞬间高压,就足以让一颗精密的芯片永久失效。尤其是在数据传输速率…

作者头像 李华
网站建设 2026/8/6 3:58:29

揭秘河北省住房和建设厅网站背后的民生温度与智慧城建故事,如何让你的生活更便捷?

在这个快节奏的时代,我们每天忙碌于工作和生活的琐事之间,很少会停下脚步去关注那些看似与普通人距离遥远、实则与我们息息相关的政府部门。比如,提到“河北省住房和建设厅网站”,很多人的第一反应可能是“那是官员看的地方”、“那是开发商备案的地方”、“离老百姓的家太…

作者头像 李华