创建时间: 2026-04-01最后更新: 2026-08-04作者: yangbo(dd1575869)
1. 前面手动搭了一整套 Tracing,LangChain 里还要再来一遍吗
在第一章的可观测性中,我们从头搭了一套完整的可观测体系:
- TraceContext:每次请求创建一个实例,用
trace.span()包装每个管线节点,自动记录输入、输出、耗时、状态 - 采样策略:错误和降级全量保留,正常请求按比例采样
- 分层存储:D1 存完整现场,KV 存聚合摘要,waitUntil 不阻塞响应
那套方案很好,但接入成本不算低。每个管线节点都要手动包一层 trace.span(),每次新增节点都要记得埋点。
manual-span.ts
1// 前面的做法:手动包装每个节点2const memories = await trace.span(3'memory_retrieval',4{ query: userMessage, sessionId },5() => retrieveMemories(env, userMessage, sessionId)6)
现在进入 LangChain 体系,事情变了。
LangChain 的每个核心组件——ChatModel、Tool、Chain、Retriever——在运行时都会自动在关键节点发出事件通知。你不需要手动写 trace.span(),框架已经帮你埋好了。
这套事件通知机制就是 Callbacks。
一句话概括它和前面 TraceContext 的关系:
TraceContext 是你自己搭的事件采集框架,Callbacks 是 LangChain 内建的事件采集框架。 概念一样,只是谁来做的区别。
订阅后可阅读剩余内容
AI 电子伴侣企业级项目实战
已发布239节计划发布120节目标已完成199%