1. LangGraph智能体开发概述
LangGraph是由LangChain团队开发的Python库,专门用于构建基于状态机原理的AI智能体系统。与传统的线性LLM应用相比,LangGraph智能体具有状态管理、多步骤推理、工具调用和任务回溯等核心能力,能够处理更复杂的现实场景需求。
1.1 状态机式AI的核心优势
状态机模型为AI智能体带来了三大革命性突破:
-
状态持久化:智能体可以记住任务执行过程中的所有中间信息,形成完整的上下文记忆。例如在旅行规划场景中,天气数据、景点列表、用户偏好等信息都能被完整保存。
-
非线性工作流:通过条件边和循环边的设计,智能体可以根据当前状态动态调整执行路径。当检测到明天有暴雨时,能自动切换到室内景点查询流程。
-
工具集成能力:智能体可以无缝调用各类API工具获取实时数据(如天气、股价)或执行具体操作(如设置提醒、发送邮件)。
1.2 典型应用场景
LangGraph智能体特别适合以下类型的应用开发:
- 复杂任务规划:旅行行程安排、会议筹备、学习计划制定等需要多步骤协调的场景
- 实时数据交互:股票分析、新闻摘要、市场监测等需要接入外部数据的应用
- 个性化服务:健身教练、营养顾问、购物助手等需要记忆用户偏好的服务
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备
2.1 基础环境配置
建议使用Python 3.9+版本进行开发,首先创建并激活虚拟环境:
bash复制python -m venv langgraph-env
source langgraph-env/bin/activate # Linux/Mac
langgraph-env\Scripts\activate # Windows
2.2 核心依赖安装
安装LangGraph及其相关依赖:
bash复制pip install langgraph langchain-openai python-dotenv
2.3 API密钥配置
在项目根目录创建.env文件,配置必要的API密钥:
env复制OPENAI_API_KEY=your_openai_key
WEATHER_API_KEY=your_weather_api_key
建议使用python-dotenv管理环境变量:
python复制from dotenv import load_dotenv
load_dotenv()
3. 智能体系统设计
3.1 状态设计
使用Pydantic模型定义智能体状态:
python复制from typing import List, Optional, Annotated
from typing_extensions import TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
class TravelPlannerState(TypedDict):
messages: Annotated[List[BaseMessage], add_messages]
destination: Optional[str]
date: Optional[str]
budget: Optional[float]
weather: Optional[dict]
attractions: Optional[List[dict]]
selected_attraction: Optional[dict]
alarm_set: Optional[bool]
task_complete: Optional[bool]
3.2 工具函数实现
天气查询工具
python复制from langchain_core.tools import tool
import requests
@tool
def get_weather(location: str, date: str) -> dict:
"""查询指定地点和日期的天气信息"""
base_url = "https://api.weatherapi.com/v1/history.json"
params = {
"key": os.getenv("WEATHER_API_KEY"),
"q": location,
"dt": date
}
response = requests.get(base_url, params=params)
data = response.json()
return {
"condition": data["forecast"]["forecastday"][0]["day"]["condition"]["text"],
"temp_c": data["forecast"]["forecastday"][0]["day"]["avgtemp_c"],
"will_it_rain": data["forecast"]["forecastday"][0]["day"]["daily_will_it_rain"]
}
景点查询工具
python复制@tool
def search_attractions(location: str, outdoor: bool) -> List[dict]:
"""查询指定地点的景点信息"""
# 实际开发中替换为真实的景点API
outdoor_spots = [
{"name": "中央公园", "type": "park", "price": 0},
{"name": "城市观景台", "type": "viewpoint", "price": 15}
]
indoor_spots = [
{"name": "科技博物馆", "type": "museum", "price": 20},
{"name": "艺术画廊", "type": "gallery", "price": 10}
]
return outdoor_spots if outdoor else indoor_spots
4. 节点与边实现
4.1 节点函数定义
天气查询节点
python复制def fetch_weather_node(state: TravelPlannerState) -> dict:
"""执行天气查询并更新状态"""
weather = get_weather.invoke({
"location": state["destination"],
"date": state["date"]
})
return {
"weather": weather,
"is_outdoor_suitable": not weather["will_it_rain"]
}
景点选择节点
python复制from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
def select_attraction_node(state: TravelPlannerState) -> dict:
"""基于天气条件和预算筛选景点"""
prompt = ChatPromptTemplate.from_template("""
根据以下条件推荐最适合的景点:
- 目的地:{destination}
- 天气情况:{weather_condition}
- 用户预算:{budget}元
- 可用景点:{attractions}
请返回JSON格式的推荐结果,包含name和reason字段。
""")
llm = ChatOpenAI(model="gpt-3.5-turbo")
chain = prompt | llm
response = chain.invoke({
"destination": state["destination"],
"weather_condition": state["weather"]["condition"],
"budget": state["budget"],
"attractions": state["attractions"]
})
return {"selected_attraction": response.json()}
4.2 条件边实现
python复制def should_retry_attraction(state: TravelPlannerState) -> str:
"""判断是否需要重新选择景点"""
if state["selected_attraction"]["price"] > state["budget"]:
return "reselect_attraction"
return "set_reminder"
5. 构建完整工作流
5.1 初始化智能体
python复制from langgraph.graph import StateGraph
workflow = StateGraph(TravelPlannerState)
5.2 添加节点和边
python复制# 添加节点
workflow.add_node("parse_input", parse_input_node)
workflow.add_node("fetch_weather", fetch_weather_node)
workflow.add_node("find_attractions", find_attractions_node)
workflow.add_node("select_attraction", select_attraction_node)
workflow.add_node("set_reminder", set_reminder_node)
# 设置边关系
workflow.add_edge("parse_input", "fetch_weather")
workflow.add_edge("fetch_weather", "find_attractions")
workflow.add_edge("find_attractions", "select_attraction")
# 条件边
workflow.add_conditional_edges(
"select_attraction",
should_retry_attraction,
{
"reselect_attraction": "find_attractions",
"set_reminder": "set_reminder"
}
)
workflow.add_edge("set_reminder", "end")
5.3 编译并运行
python复制app = workflow.compile()
# 执行智能体
inputs = {
"messages": [HumanMessage(content="帮我规划明天纽约的行程,预算50美元")],
"destination": "New York",
"date": "2023-11-15"
}
result = app.invoke(inputs)
6. 调试与优化技巧
6.1 状态监控
在关键节点添加状态打印语句:
python复制def debug_node(state: TravelPlannerState) -> dict:
print(f"Current state: {state}")
return {}
6.2 超时处理
为工具调用添加超时机制:
python复制from functools import partial
@tool
def safe_get_weather(location: str, date: str, timeout: int = 5) -> dict:
"""带超时保护的天气查询"""
try:
return get_weather.invoke({"location": location, "date": date}, timeout=timeout)
except Exception as e:
return {"error": str(e)}
6.3 性能优化
- 缓存常用数据:对不常变的数据(如景点信息)实现本地缓存
- 并行执行:对无依赖关系的节点使用
add_parallel_nodes - 批处理:对多个相似请求进行合并处理
7. 部署方案
7.1 本地API服务
使用FastAPI构建REST接口:
python复制from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class TravelRequest(BaseModel):
message: str
destination: str
date: str
budget: float
@app.post("/plan")
async def plan_trip(request: TravelRequest):
inputs = {
"messages": [{"role": "user", "content": request.message}],
"destination": request.destination,
"date": request.date,
"budget": request.budget
}
return app.invoke(inputs)
7.2 Streamlit网页界面
python复制import streamlit as st
st.title("智能旅行规划助手")
destination = st.text_input("目的地")
date = st.date_input("日期")
budget = st.number_input("预算(USD)", min_value=0)
if st.button("开始规划"):
with st.spinner("正在生成行程..."):
result = app.invoke({
"messages": [{"role": "user", "content": f"规划{destination}的行程"}],
"destination": destination,
"date": str(date),
"budget": float(budget)
})
st.json(result)
8. 进阶开发建议
- 长期记忆集成:使用LangChain的ConversationBufferMemory或VectorStoreRetrieverMemory
- 多模态扩展:结合OpenAI的GPT-4V模型处理图像输入
- 验证与测试:为每个节点编写单元测试,使用pytest进行自动化测试
- 监控与日志:集成Prometheus和Grafana进行性能监控
9. 常见问题解决
Q1:如何处理API调用失败?
A:实现重试机制和降级方案,例如:
python复制from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def reliable_api_call():
# API调用代码
Q2:状态变得过于庞大怎么办?
A:实施状态压缩策略,定期清理不必要的历史数据,或使用外部存储(如Redis)保存状态
Q3:如何提高智能体的响应速度?
A:采用以下优化措施:
- 预加载常用数据
- 实现异步节点执行
- 对LLM调用进行批处理
- 使用更高效的模型(如GPT-3.5-turbo)
10. 实际应用案例
10.1 商务旅行规划
扩展智能体功能以处理:
- 航班信息查询
- 酒店预订
- 会议日程安排
- 差旅政策合规检查
10.2 学习计划制定
开发新智能体用于:
- 学习目标分解
- 资源推荐
- 进度跟踪
- 知识点测试
10.3 家庭活动筹备
定制化功能包括:
- 家庭成员偏好管理
- 预算分配
- 供应商比选
- 任务分配与提醒
开发LangGraph智能体时,建议从简单场景入手,逐步增加复杂度。每次迭代后都进行充分测试,确保状态管理的正确性和工作流的可靠性。
