在第一章的可观测性中,我们从头搭了一套完整的可观测体系:
trace.span() 包装每个管线节点,自动记录输入、输出、耗时、状态那套方案很好,但接入成本不算低。每个管线节点都要手动包一层 trace.span(),每次新增节点都要记得埋点。
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 内建的事件采集框架。 概念一样,只是谁来做的区别。