回调与监控
LangChain 提供了完善的回调和监控功能,帮助开发者调试和优化应用。本章将介绍如何使用 LangSmith 和回调系统。
LangSmith 简介
LangSmith 是 LangChain 官方提供的调试、测试和监控平台,可以帮助你:
- 可视化 Chain 的执行过程
- 调试 Agent 行为
- 评估输出质量
- 团队协作
为什么使用 LangSmith?
- 可视化执行:直观看到每个步骤的输入输出
- 调试:快速定位问题
- 评估:测试和评估应用效果
- 监控:生产环境实时监控
快速开始
环境配置
# 安装 langsmith
pip install langsmith
# 设置环境变量
import os
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = "ls-xxxxx" # 从 langsmith.ai 获取
基础追踪
from langchain.chat_models import init_chat_model
from langchain.prompts import ChatPromptTemplate
# 开启追踪
os.environ["LANGSMITH_TRACING"] = "true"
model = init_chat_model(model="gpt-4o-mini", model_provider="openai")
prompt = ChatPromptTemplate.from_template("{question}")
chain = prompt | model
# 执行会自动记录到 LangSmith
result = chain.invoke({"question": "Python 是什么?"})
# 访问 https://smith.langchain.com 查看追踪结果
追踪配置
环境变量
# 必需
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=ls-xxxxx
# 可选
export LANGSMITH_PROJECT=my-project # 项目名称
export LANGSMITH_ENDPOINT=https://api.smith.langchain.com # 端点
export LANGSMITH_TRACING_V2=true # 使用 v2 API
代码配置
from langsmith import Client
# 创建客户端
client = Client(
api_key="ls-xxxxx",
project_name="my-project"
)
# 配置特定链
from langchain.callbacks import LangChainTracer
tracer = LangChainTracer(
project_name="my-project",
client=client
)
在不同组件中使用
Chain 追踪
from langchain.chat_models import init_chat_model
from langchain.chains import LLMChain
# 追踪 LLMChain
chain = LLMChain(
llm=model,
prompt=prompt,
callbacks=[tracer]
)
result = chain.invoke({"input": "test"})
Agent 追踪
from langchain.agents import create_agent
# 追踪 Agent
agent = create_agent(
model=model,
tools=[tool1, tool2],
tracing_allowed_tools=["tool1", "tool2"] # 指定要追踪的工具
)
自定义回调
from langchain.callbacks.base import BaseCallbackHandler
class MyCallbackHandler(BaseCallbackHandler):
def on_chain_start(self, serialized, inputs):
print(f"Chain 开始: {inputs}")
def on_chain_end(self, outputs):
print(f"Chain 结束: {outputs}")
def on_llm_start(self, serialized, prompts):
print(f"LLM 开始: {prompts}")
def on_tool_start(self, serialized, input_str):
print(f"工具开始: {input_str}")
def on_tool_end(self, output):
print(f"工具结束: {output}")
# 使用
chain = LLMChain(llm=model, prompt=prompt, callbacks=[MyCallbackHandler()])
调试技巧
查看执行详情
在 LangSmith Dashboard 中可以看到:
- 输入输出:每个步骤的输入和输出
- Token 消耗:LLM 使用的 token 数量
- 执行时间:每个步骤的耗时
- 错误信息:如有错误会显示
常见问题排查
1. Agent 不调用工具
# 在 LangSmith 中检查:
# 1. 查看 LLM 的输出是否包含工具调用
# 2. 检查工具描述是否清晰
# 3. 查看系统提示是否正确
2. 输出格式错误
# 查看:
# 1. LLM 输出内容
# 2. Output Parser 解析过程
# 3. 任何解析错误
3. 性能问题
# 查看执行时间:
# 1. 哪个步骤最耗时
# 2. LLM 调用次数
# 3. 网络延迟
评估系统
创建评估数据集
from langsmith import Client
client = Client()
# 添加示例
client.create_example(
inputs={"question": "Python 装饰器是什么?"},
outputs={"answer": "装饰器是..."},
dataset_name="python-tutor"
)
运行评估
from langsmith.evaluation import evaluate
def evaluate_chain(example):
result = chain.invoke({"question": example["question"]})
return {"prediction": result["answer"]}
# 评估
evaluate(
"my-chain",
evaluate_chain,
data="python-tutor"
)
生产监控
设置生产追踪
import os
# 生产环境配置
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_API_KEY"] = os.environ.get("LANGSMITH_API_KEY")
# 添加项目标签
from langsmith import traceable
@traceable(project_name="production")
def my_chain(input_data):
return chain.invoke(input_data)
监控指标
在 LangSmith Dashboard 可以监控:
- 请求量:每分钟/小时请求数
- 延迟:平均响应时间
- 错误率:失败请求比例
- Token 消耗:Token 使用量
- 成本:估计花费
回调进阶
自定义回调处理器
from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import AgentAction, AgentFinish
class DebugHandler(BaseCallbackHandler):
def on_agent_action(self, action: AgentAction, **kwargs):
print(f"Agent 行动: {action.tool}")
print(f"输入: {action.tool_input}")
def on_agent_finish(self, finish: AgentFinish, **kwargs):
print(f"Agent 完成: {finish.return_values}")
多个回调
from langchain.callbacks import get_based_callbacks
callbacks = [
LangChainTracer(),
DebugHandler(),
# 添加更多回调
]
chain = LLMChain(
llm=model,
prompt=prompt,
callbacks=callbacks
)
日志记录
结构化日志
from langchain.schema import HumanMessage
from langchain.callbacks.stdout import StdOutCallbackHandler
# 打印到 stdout
chain = LLMChain(
llm=model,
prompt=prompt,
verbose=True # 或使用 callbacks
)
文件日志
from langchain.callbacks.file import FileCallbackHandler
import logging
logging.basicConfig(filename='app.log', level=logging.INFO)
file_handler = FileCallbackHandler("app.log")
chain = LLMChain(
llm=model,
prompt=prompt,
callbacks=[file_handler]
)
最佳实践
1. 开发环境
# 启用详细追踪
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_VERBOSE"] = "true"
2. 生产环境
# 只追踪错误
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_TRACING_SAMPLES"] = "false" # 只追踪错误
3. 团队协作
# 使用项目区分不同环境
os.environ["LANGSMITH_PROJECT"] = "production-v1"
常见问题
1. 追踪不显示
- 检查 API Key 是否正确
- 确认 LANGSMITH_TRACING=true
- 查看是否有网络问题
2. 性能影响
- 异步追踪减少延迟
- 生产环境可以采样追踪
- 关闭不需要的详细追踪
3. 数据隐私
- LangSmith 会记录输入输出
- 如需敏感数据处理,考虑本地追踪
- 使用数据脱敏
下一步
现在你已经掌握了回调和监控的使用,接下来学习:
- 速查表 - 常用 API 和配置速查