这是一个综合使用LangChain、LangGraph和LangSmith的完整代码示例。这个示例将创建一个智能客服聊天机器人,展示如何将这三个工具结合使用。这个综合示例展示了如何将LangChain、LangGraph和LangSmith三个工具有机结合使用。
## 🔗 LangChain 的使用
**核心组件:**
- `ChatOpenAI`: 提供LLM能力,处理自然语言理解和生成
- `ChatPromptTemplate`: 创建结构化的提示模板,确保一致的输入格式
- `DuckDuckGoSearchRun`: 集成外部搜索能力,获取实时信息
**主要作用:** 提供基础的AI能力和工具链,是整个系统的"大脑"
## 🕸️ LangGraph 的使用
**核心概念:**
- `StateGraph`: 定义有状态的工作流程图
- **节点系统**: 将复杂逻辑分解为独立的处理单元
- **条件边**: 实现智能的流程分支控制
**工作流程:**
1. **意图识别** → 分析用户需求
2. **条件判断** → 决定是否需要搜索
3. **信息搜索** → 获取外部信息(如需要)
4. **响应生成** → 创建个性化回答
5. **质量检查** → 确保回答质量
**主要优势:** 管理复杂的多步骤处理流程,支持动态决策
## 📊 LangSmith 的使用
**监控功能:**
- **自动追踪**: 监控所有LLM调用和工具使用
- **性能指标**: 记录响应时间、token使用量等
- **错误日志**: 捕获和分析系统异常
**调试功能:**
- **完整链路追踪**: 查看每个步骤的详细信息
- **输入输出记录**: 分析数据流转过程
- **元数据标记**: 便于后续分析和优化
## 🚀 实际使用建议
**环境配置:**
```bash
# 安装必要的包
pip install langchain langgraph langsmith openai duckduckgo-search
# 设置环境变量
export OPENAI_API_KEY="your-key"
export LANGCHAIN_API_KEY="your-langsmith-key"
```
**扩展方向:**
1. **添加更多工具**: 集成数据库查询、API调用等
2. **优化工作流**: 根据实际业务需求调整节点逻辑
3. **增强监控**: 设置告警和自动化分析
4. **A/B测试**: 使用LangSmith比较不同版本的性能
这个示例展示了现代AI应用开发的最佳实践:使用LangChain构建AI能力,用LangGraph管理复杂流程,通过LangSmith确保系统的可观测性和持续优化。
``` python
"""
智能客服聊天机器人 - 综合使用LangChain、LangGraph和LangSmith
这个示例展示了如何将三个工具结合使用:
- LangChain: 提供基础的LLM交互和工具链
- LangGraph: 实现复杂的工作流程和状态管理
- LangSmith: 提供监控、调试和优化功能
"""
import os
from typing import Dict, List, Any, Annotated
from datetime import datetime
# LangChain 核心组件
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.tools import Tool
# LangGraph 组件 - 用于构建复杂的工作流
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from typing_extensions import TypedDict
# LangSmith 组件 - 用于监控和调试
from langsmith import Client
from langchain_core.tracers import LangChainTracer
# 配置环境变量(实际使用时需要设置真实的API密钥)
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
os.environ["LANGCHAIN_PROJECT"] = "customer-service-bot"
class CustomerServiceBot:
"""
智能客服机器人类
整合了LangChain的LLM能力、LangGraph的工作流管理和LangSmith的监控功能
"""
def __init__(self):
# 初始化LangChain组件
self.llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
# LangSmith会自动追踪这个LLM的调用
)
# 初始化搜索工具(LangChain工具)
self.search_tool = DuckDuckGoSearchRun()
# 初始化LangSmith客户端用于监控
self.langsmith_client = Client()
# 创建LangGraph工作流
self.workflow = self._create_workflow()
# 编译工作流为可执行的图
self.app = self.workflow.compile()
def _create_workflow(self):
"""
使用LangGraph创建客服机器人的工作流程
工作流程包括:
1. 意图识别
2. 信息搜索(如需要)
3. 响应生成
4. 质量检查
"""
# 定义状态结构 - LangGraph的核心概念
class State(TypedDict):
messages: Annotated[List, add_messages] # 对话历史
intent: str # 用户意图
search_results: str # 搜索结果
confidence: float # 响应置信度
needs_search: bool # 是否需要搜索
# 创建状态图
workflow = StateGraph(State)
# 添加节点(每个节点是一个处理步骤)
workflow.add_node("classify_intent", self._classify_intent)
workflow.add_node("search_information", self._search_information)
workflow.add_node("generate_response", self._generate_response)
workflow.add_node("quality_check", self._quality_check)
# 设置入口点
workflow.set_entry_point("classify_intent")
# 添加边(定义节点之间的流转逻辑)
workflow.add_conditional_edges(
"classify_intent",
self._should_search, # 条件函数
{
"search": "search_information", # 需要搜索
"direct": "generate_response" # 直接回答
}
)
workflow.add_edge("search_information", "generate_response")
workflow.add_edge("generate_response", "quality_check")
# 添加条件结束边
workflow.add_conditional_edges(
"quality_check",
self._should_regenerate,
{
"regenerate": "generate_response", # 重新生成
"end": END # 结束
}
)
return workflow
def _classify_intent(self, state: Dict) -> Dict:
"""
意图识别节点 - 使用LangChain的提示模板和LLM
"""
# 创建意图分类提示模板(LangChain组件)
intent_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个客服意图分类器。请分析用户消息并分类为以下之一:
- product_inquiry: 产品咨询
- technical_support: 技术支持
- complaint: 投诉
- general_question: 一般问题
- order_status: 订单状态
只返回分类结果,不要其他内容。"""),
("human", "{message}")
])
# 获取最新的用户消息
last_message = state["messages"][-1].content
# 使用LangChain的链式调用
chain = intent_prompt | self.llm
# LangSmith会自动追踪这个调用
intent_result = chain.invoke({"message": last_message})
intent = intent_result.content.strip()
# 判断是否需要搜索外部信息
needs_search = intent in ["product_inquiry", "technical_support", "general_question"]
return {
"intent": intent,
"needs_search": needs_search
}
def _should_search(self, state: Dict) -> str:
"""
LangGraph条件函数 - 决定是否需要搜索
"""
return "search" if state["needs_search"] else "direct"
def _search_information(self, state: Dict) -> Dict:
"""
信息搜索节点 - 使用LangChain工具
"""
last_message = state["messages"][-1].content
# 使用LangChain的搜索工具
try:
# 构造搜索查询
search_query = f"客服 {state['intent']} {last_message}"
# LangSmith会追踪工具的使用
search_results = self.search_tool.run(search_query)
return {"search_results": search_results}
except Exception as e:
print(f"搜索出错: {e}")
return {"search_results": "搜索暂时不可用"}
def _generate_response(self, state: Dict) -> Dict:
"""
响应生成节点 - 核心的LangChain LLM调用
"""
# 构建响应生成提示
system_message = """你是一个专业的客服代表。请根据以下信息回答用户问题:
用户意图: {intent}
搜索结果: {search_results}
要求:
5. 回答要专业、友好、有帮助
6. 如果有搜索结果,要结合使用
7. 如果无法解决问题,要诚实说明并提供替代方案
"""
# 创建消息列表
messages = [
SystemMessage(content=system_message.format(
intent=state.get("intent", "未知"),
search_results=state.get("search_results", "无")
))
]
# 添加对话历史
messages.extend(state["messages"])
# 生成响应(LangSmith自动追踪)
response = self.llm.invoke(messages)
# 简单的置信度计算
confidence = 0.8 if state.get("search_results") else 0.6
return {
"messages": [response],
"confidence": confidence
}
def _quality_check(self, state: Dict) -> Dict:
"""
质量检查节点 - 确保响应质量
"""
# 获取最新的AI响应
last_ai_message = state["messages"][-1].content
# 简单的质量检查逻辑
quality_indicators = [
len(last_ai_message) > 20, # 响应长度合理
"抱歉" not in last_ai_message or "帮助" in last_ai_message, # 积极响应
state["confidence"] > 0.5 # 置信度足够
]
quality_score = sum(quality_indicators) / len(quality_indicators)
return {"confidence": quality_score}
def _should_regenerate(self, state: Dict) -> str:
"""
LangGraph条件函数 - 决定是否需要重新生成响应
"""
return "end" if state["confidence"] > 0.6 else "regenerate"
def chat(self, user_message: str) -> str:
"""
主要的聊天接口
Args:
user_message: 用户输入的消息
Returns:
AI生成的响应
"""
# 使用LangSmith创建一个追踪会话
with self.langsmith_client.trace(
name="customer_service_chat",
inputs={"user_message": user_message},
tags=["customer_service", "production"]
) as trace:
try:
# 初始化状态
initial_state = {
"messages": [HumanMessage(content=user_message)],
"intent": "",
"search_results": "",
"confidence": 0.0,
"needs_search": False
}
# 运行LangGraph工作流
final_state = self.app.invoke(initial_state)
# 获取最终响应
ai_response = final_state["messages"][-1].content
# 记录成功的追踪信息
trace.update(
outputs={"ai_response": ai_response},
metadata={
"intent": final_state["intent"],
"confidence": final_state["confidence"],
"timestamp": datetime.now().isoformat()
}
)
return ai_response
except Exception as e:
# 记录错误信息到LangSmith
trace.update(
error=str(e),
outputs={"error": "处理请求时发生错误"}
)
return "抱歉,我现在无法处理您的请求,请稍后再试。"
def main():
"""
主函数 - 演示如何使用这个综合的客服机器人
"""
print("=== LangChain + LangGraph + LangSmith 综合示例 ===")
print("智能客服机器人启动中...")
# 创建客服机器人实例
bot = CustomerServiceBot()
# 测试对话
test_messages = [
"你好,我想了解一下你们的产品",
"我的订单什么时候能到?",
"产品出现了故障,怎么办?",
"你们的退换货政策是什么?"
]
print("\n开始测试对话:")
print("-" * 50)
for i, message in enumerate(test_messages, 1):
print(f"\n[测试 {i}]")
print(f"用户: {message}")
# 调用聊天机器人
response = bot.chat(message)
print(f"客服: {response}")
print("-" * 30)
print(f"\n✅ 测试完成!")
print(f"📊 您可以在LangSmith仪表板中查看详细的追踪信息:")
print(f" - 每次对话的完整流程")
print(f" - LLM调用的token使用情况")
print(f" - 工具调用的性能指标")
print(f" - 错误日志和调试信息")
if __name__ == "__main__":
main()
"""
代码结构说明:
1. LangChain 使用:
- ChatOpenAI: LLM核心引擎
- ChatPromptTemplate: 结构化提示模板
- DuckDuckGoSearchRun: 外部信息搜索工具
2. LangGraph 使用:
- StateGraph: 定义复杂的工作流程
- 节点系统: 将处理逻辑分解为独立节点
- 条件边: 实现动态的流程控制
3. LangSmith 使用:
- 自动追踪: 监控所有LLM和工具调用
- 手动追踪: 创建自定义的追踪会话
- 元数据记录: 保存重要的上下文信息
主要优势:
- 模块化设计,易于维护和扩展
- 完整的监控和调试能力
- 复杂的工作流程管理
- 自动的性能优化建议
实际部署时,记得:
1. 设置正确的API密钥
2. 配置LangSmith项目
3. 根据需要调整工作流程
4. 监控生产环境的性能指标
"""
```