LangSmith 调试与评估:构建可观测的AI应用
引言
在传统软件开发中,我们有完善的调试工具、日志系统和测试框架。但在AI应用开发中,由于LLM的非确定性,调试和评估变得异常困难。LangSmith作为LangChain官方推出的AI应用可观测性平台,为开发者提供了完整的调试、测试、评估和监控解决方案。
AI应用调试的挑战
- 黑盒问题:LLM内部决策过程不透明
- 非确定性:相同输入可能产生不同输出
- 成本高昂:每次调试都需要调用API
- 评估困难:如何量化"回答质量"?
- 版本追踪:Prompt和模型变更的影响难以评估
LangSmith核心概念
架构概览
┌─────────────────────────────────────────────────────────────┐ │ LangSmith Platform │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Tracing │ │ Evaluation │ │ Monitoring │ │ │ │ 追踪 │ │ 评估 │ │ 监控 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ Project Dashboard │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ Runs │ │ Datasets │ │ Feedback │ │ │ │ 运行记录 │ │ 测试数据集 │ │ 反馈数据 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ▲ │ SDK调用 │ ┌────────┴───────┐ │ Your App │ │ (Python/JS) │ └────────────────┘核心组件
| 组件 | 功能 | 说明 |
|---|---|---|
| Traces | 追踪记录 | 记录每次运行的完整调用链 |
| Runs | 运行实例 | 单次执行的详细信息 |
| Datasets | 测试数据集 | 用于评估的输入输出对 |
| Evaluators | 评估器 | 自动或人工评估运行结果 |
| Projects | 项目 | 组织和管理应用 |
| Feedback | 反馈 | 用户或自动评估的反馈 |
快速开始
1. 环境配置
importos# 配置LangSmithos.environ["LANGCHAIN_TRACING_V2"]="true"os.environ["LANGCHAIN_API_KEY"]="your-langsmith-api-key"os.environ["LANGCHAIN_PROJECT"]="my-ai-app"# 项目名称# 配置OpenAI(或其他LLM)os.environ["OPENAI_API_KEY"]="your-openai-api-key"2. 基础追踪
fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser# 创建简单的链llm=ChatOpenAI(model="gpt-4")prompt=ChatPromptTemplate.from_template("解释{topic}的概念")output_parser=StrOutputParser()chain=prompt|llm|output_parser# 执行 - 自动追踪到LangSmithresult=chain.invoke({"topic":"机器学习"})print(result)# 在LangSmith中,你可以看到:# - 完整的调用链(prompt -> llm -> parser)# - 每个步骤的输入输出# - Token使用量# - 执行时间# - 成本估算3. 自定义追踪
fromlangchain_core.tracersimportLangChainTracerfromlangsmithimporttraceable# 方法1:使用traceable装饰器@traceable(run_type="llm",name="custom_generation")defgenerate_response(query:str)->str:"""自定义生成函数"""llm=ChatOpenAI(model="gpt-4")response=llm.invoke(query)returnresponse.content# 方法2:手动创建RunfromlangsmithimportClient client=Client()# 创建自定义运行run=client.create_run(name="custom_run",run_type="llm",inputs={"query":"什么是深度学习?"})try:# 执行逻辑result=generate_response("什么是深度学习?")# 更新运行结果client.update_run(run.id,outputs={"result":result},end_time=datetime.now())exceptExceptionase:client.update_run(run.id,error=str(e),end_time=datetime.now())深入追踪功能
1. 追踪嵌套调用
fromlangsmithimporttraceablefromlangchain_openaiimportChatOpenAI llm=ChatOpenAI(model="gpt-4")@traceable(name="analyze_sentiment")defanalyze_sentiment(text:str)->str:"""情感分析"""response=llm.invoke(f"分析以下文本的情感:{text}")returnresponse.content@traceable(name="extract_keywords")defextract_keywords(text:str)->list:"""关键词提取"""response=llm.invoke(f"提取以下文本的关键词(JSON格式):{text}")importjsonreturnjson.loads(response.content)@traceable(name="process_text")defprocess_text(text:str)->dict:"""处理文本 - 嵌套追踪"""sentiment=analyze_sentiment(text)keywords=extract_keywords(text)return{"sentiment":sentiment,"keywords":keywords}# 执行 - 会生成嵌套的追踪树result=process_text("我非常喜欢这个产品,质量很好,物流也快!")# 在LangSmith中,你会看到:# process_text# ├── analyze_sentiment# │ └── ChatOpenAI.invoke# └── extract_keywords# └── ChatOpenAI.invoke2. 添加元数据和标签
@traceable(name="smart_qa",tags=["production","v1.0"],metadata={"model":"gpt-4","temperature":0.7,"max_tokens":1000})defsmart_qa(question:str,user_id:str)->str:"""智能问答"""# 动态添加元数据fromlangsmithimportget_current_run_tree run_tree=get_current_run_tree()ifrun_tree:run_tree.metadata["user_id"]=user_id run_tree.metadata["timestamp"]=datetime.now().isoformat()response=llm