LangSmith与LangFuse入门:调试与监控智能体
10.1 调试与监控的重要性
10.1.1 为什么需要调试与监控工具?
在智能体开发过程中,调试与监控工具至关重要,因为:
- 复杂的执行流程:智能体的执行涉及多步推理和工具调用
- 不可预测的行为:大语言模型的输出可能因输入细微变化而不同
- 性能优化需求:需要监控API调用、响应时间和成本
- 错误定位困难:智能体出错时,很难定位具体的错误原因
- 持续改进需要:需要收集数据来优化智能体的性能
10.1.2 LangSmith与LangFuse简介
- LangSmith:由LangChain团队开发的调试、测试和监控平台,专为LangChain应用设计
- LangFuse:开源的LLM应用观测平台,支持多种框架,提供详细的追踪和分析功能
10.2 LangSmith配置与使用
10.2.1 安装与配置
创建LangSmith账号:
- 访问LangSmith官网
- 使用GitHub或邮箱注册账号
- 登录并获取API密钥
安装LangSmith SDK:
pip install langsmith配置环境变量:
# 设置LangSmith API密钥 export LANGSMITH_TRACING_V2=true export LANGSMITH_ENDPOINT=https://api.smith.langchain.com export LANGSMITH_API_KEY=your-api-key export LANGSMITH_PROJECT=your-project-name在代码中启用:
import os from langchain.callbacks import LangSmithCallbackHandler from langchain.chat_models import ChatOpenAI # 配置回调 callback = LangSmithCallbackHandler( project_name="your-project-name", api_key=os.getenv("LANGSMITH_API_KEY") ) # 初始化模型时添加回调 llm = ChatOpenAI( model="gpt-3.5-turbo", callbacks=[callback] )
10.2.2 核心功能
追踪与可视化:
- 查看智能体的完整执行轨迹
- 可视化工具调用和推理过程
- 检查每个步骤的输入和输出
评估与测试:
- 创建测试数据集
- 运行批量测试
- 评估智能体的性能指标
监控与警报:
- 监控API调用频率和成本
- 设置使用限额和警报
- 跟踪模型性能随时间的变化
协作与共享:
- 共享追踪结果给团队成员
- 评论和标注特定的执行路径
- 导出和存档追踪数据
10.2.3 使用示例
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain.callbacks import LangSmithCallbackHandler
import os
# 配置LangSmith
callback = LangSmithCallbackHandler(
project_name="agent-development",
api_key=os.getenv("LANGSMITH_API_KEY")
)
# 初始化模型
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
callbacks=[callback]
)
# 创建提示模板
prompt = ChatPromptTemplate.from_template(
"你是一个专业的{role},请回答以下问题:\n{question}"
)
# 创建链
chain = LLMChain(
llm=llm,
prompt=prompt,
callbacks=[callback]
)
# 运行链
response = chain.run(
role="AI智能体专家",
question="什么是ReAct智能体?"
)
print(response)10.3 LangFuse配置与使用
10.3.1 安装与配置
创建LangFuse账号:
- 访问LangFuse官网
- 注册账号并登录
- 获取API密钥
安装LangFuse SDK:
pip install langfuse配置环境变量:
# 设置LangFuse API密钥 export LANGFUSE_PUBLIC_KEY=your-public-key export LANGFUSE_SECRET_KEY=your-secret-key export LANGFUSE_HOST=https://cloud.langfuse.com在代码中启用:
import os from langfuse.langchain import CallbackHandler from langchain.chat_models import ChatOpenAI # 配置回调 langfuse_handler = CallbackHandler( public_key=os.getenv("LANGFUSE_PUBLIC_KEY"), secret_key=os.getenv("LANGFUSE_SECRET_KEY"), host=os.getenv("LANGFUSE_HOST") ) # 初始化模型时添加回调 llm = ChatOpenAI( model="gpt-3.5-turbo", callbacks=[langfuse_handler] )
10.3.2 核心功能
详细追踪:
- 记录每个LLM调用的详细信息
- 跟踪提示词、响应、令牌使用和成本
- 查看完整的执行链路
分析与统计:
- 生成使用统计和成本报告
- 分析提示词性能和模型选择
- 识别性能瓶颈
提示词管理:
- 版本控制提示词
- A/B测试不同的提示词
- 管理提示词模板
开源与自托管:
- 支持自托管部署
- 完全控制数据
- 可定制性强
10.3.3 使用示例
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langfuse.langchain import CallbackHandler
import os
# 配置LangFuse
langfuse_handler = CallbackHandler(
public_key=os.getenv("LANGFUSE_PUBLIC_KEY"),
secret_key=os.getenv("LANGFUSE_SECRET_KEY"),
host=os.getenv("LANGFUSE_HOST")
)
# 初始化模型
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
callbacks=[langfuse_handler]
)
# 创建提示模板
prompt = ChatPromptTemplate.from_template(
"你是一个专业的{role},请回答以下问题:\n{question}"
)
# 创建链
chain = LLMChain(
llm=llm,
prompt=prompt,
callbacks=[langfuse_handler]
)
# 运行链
response = chain.run(
role="AI智能体专家",
question="如何构建一个多智能体系统?"
)
print(response)10.4 调试智能体的最佳实践
10.4.1 常见问题与调试策略
提示词问题:
- 症状:智能体生成的响应不符合预期
- 调试策略:
- 检查提示词的清晰度和具体性
- 使用LangSmith/LangFuse查看完整的提示词
- 尝试不同的提示词格式和结构
工具调用问题:
- 症状:智能体无法正确使用工具或工具调用失败
- 调试策略:
- 检查工具描述是否清晰
- 验证工具参数是否正确
- 查看工具调用的详细日志
记忆问题:
- 症状:智能体忘记之前的对话内容
- 调试策略:
- 检查记忆系统的配置
- 查看记忆检索的结果
- 调整记忆的存储和检索策略
推理问题:
- 症状:智能体的推理过程有逻辑错误
- 调试策略:
- 启用详细的思维链输出
- 检查推理的每一步
- 调整模型的温度参数
10.4.2 高级调试技巧
分段测试:
- 单独测试智能体的每个组件
- 从简单到复杂逐步构建
- 隔离问题所在的组件
模拟与桩函数:
- 使用模拟工具替代真实工具
- 控制工具返回的结果
- 测试边界情况和错误处理
日志增强:
- 添加自定义日志点
- 记录关键变量和状态
- 使用不同级别的日志详细程度
A/B测试:
- 比较不同提示词的效果
- 测试不同模型的性能
- 评估不同参数设置的影响
10.5 监控智能体的最佳实践
10.5.1 关键指标监控
性能指标:
- 响应时间:智能体的整体响应时间
- 推理时间:模型推理的时间
- 工具调用时间:外部工具的响应时间
成本指标:
- API调用次数:每个模型的调用次数
- 令牌使用量:输入和输出令牌的数量
- 预估成本:基于令牌使用量的成本估算
质量指标:
- 成功率:成功完成任务的比例
- 准确率:生成内容的准确程度
- 用户满意度:用户反馈的满意度评分
可靠性指标:
- 错误率:发生错误的频率
- 重试率:需要重试的比例
- 系统可用性:系统的可用时间比例
10.5.2 监控系统设置
仪表盘配置:
- 创建自定义监控仪表盘
- 显示关键指标和趋势
- 设置合适的时间范围
警报设置:
- 为关键指标设置阈值
- 配置警报通知方式
- 建立警报优先级
日志管理:
- 集中管理所有日志
- 设置日志保留策略
- 实现日志搜索和分析
报告生成:
- 定期生成性能报告
- 分析趋势和异常
- 提供改进建议
10.6 集成到开发工作流
10.6.1 开发阶段
本地开发:
- 启用详细的调试日志
- 使用LangSmith/LangFuse追踪每个测试
- 快速迭代和测试
代码审查:
- 分享关键的追踪结果
- 讨论特定的执行路径
- 评估代码变更的影响
测试阶段:
- 运行自动化测试套件
- 生成测试覆盖率报告
- 识别和修复边缘情况
10.6.2 部署阶段
预部署测试:
- 在模拟生产环境中测试
- 验证监控系统的配置
- 进行负载测试
生产监控:
- 实时监控系统性能
- 跟踪用户交互和反馈
- 快速响应异常情况
持续改进:
- 分析生产数据
- 识别改进机会
- 实施和测试改进
10.7 实用案例:调试与监控智能体
10.7.1 案例目标
创建一个智能体,使用LangSmith和LangFuse进行调试和监控,解决常见的智能体开发问题。
10.7.2 实现步骤
创建智能体:
from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.agents import Tool, initialize_agent, AgentType from langchain.memory import ConversationBufferMemory from langchain.callbacks import LangSmithCallbackHandler from langfuse.langchain import CallbackHandler import os # 配置回调 langsmith_callback = LangSmithCallbackHandler( project_name="agent-debugging", api_key=os.getenv("LANGSMITH_API_KEY") ) langfuse_callback = CallbackHandler( public_key=os.getenv("LANGFUSE_PUBLIC_KEY"), secret_key=os.getenv("LANGFUSE_SECRET_KEY"), host=os.getenv("LANGFUSE_HOST") ) # 定义工具 def search_tool(query): """搜索工具,用于获取最新信息""" return f"搜索结果:关于'{query}'的详细信息" def calculator_tool(expression): """计算工具,用于执行数学运算""" try: result = eval(expression) return f"计算结果:{expression} = {result}" except Exception as e: return f"计算错误:{str(e)}" # 创建工具列表 tools = [ Tool( name="Search", func=search_tool, description="用于获取最新信息,输入是搜索关键词" ), Tool( name="Calculator", func=calculator_tool, description="用于执行数学运算,输入是数学表达式" ) ] # 初始化记忆系统 memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # 初始化模型 llm = ChatOpenAI( model="gpt-3.5-turbo", temperature=0.7 ) # 初始化智能体 agent = initialize_agent( tools, llm, agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, memory=memory, verbose=True, callbacks=[langsmith_callback, langfuse_callback] ) # 测试智能体 print("测试1:数学计算") response1 = agent.run("计算12345乘以67890") print(f"响应:{response1}") print("\n测试2:信息搜索") response2 = agent.run("什么是LangChain?") print(f"响应:{response2}") print("\n测试3:多轮对话") response3 = agent.run("之前我们讨论了什么?") print(f"响应:{response3}")调试问题:
- 使用LangSmith查看智能体的执行轨迹
- 检查工具调用的详细信息
- 分析记忆系统的工作情况
监控性能:
- 使用LangFuse查看API调用和成本
- 监控响应时间和令牌使用
- 分析智能体的整体性能
10.7.3 案例分析
- 调试能力:通过LangSmith和LangFuse可以清晰地看到智能体的执行过程
- 监控能力:能够跟踪API调用、成本和性能指标
- 问题识别:可以快速识别智能体的问题所在
- 性能优化:基于监控数据进行有针对性的优化
10.8 小结与展望
10.8.1 本集要点回顾
- 介绍了LangSmith和LangFuse的安装配置和使用方法
- 详细讲解了调试智能体的最佳实践和常见问题解决方案
- 提供了监控智能体的关键指标和监控策略
- 分享了如何将调试和监控集成到开发工作流中
- 实践了完整的智能体调试和监控案例
10.8.2 后续学习方向
- 深入学习提示词工程的核心技巧
- 开始实际的智能体开发实践
- 探索智能体的高级功能和应用场景
- 学习多智能体系统的设计和实现
- 研究智能体的评估和优化方法