LangGraph实战构建智能决策助手的全流程指南想象一下你正在开发一个能理解自然语言指令的AI助手——当用户询问2024年欧洲杯冠军是谁时它能自动搜索最新赛事结果当用户要求画一只戴着墨镜的柴犬冲浪时又能无缝切换到图像生成模式。这种动态路由能力正是现代AI应用的核心竞争力。本文将带你用LangGraph框架结合GPT-4o-mini、Google搜索API和DALL-E图像生成构建这样一个能自主决策的智能系统。1. 环境准备与工具配置在开始构建前我们需要配置三个关键组件语言模型、搜索工具和图像生成工具。这个组合将赋予我们的助手思考、查询和创作的能力。首先安装必要的Python包pip install langgraph langchain-openai langchain-community python-dotenv接着准备.env文件存储API密钥OPENAI_API_KEY你的OpenAI密钥 SERPER_API_KEY你的Google搜索API密钥工具初始化代码from dotenv import load_dotenv from langchain_community.tools import GoogleSerperRun from langchain_community.tools.openai_dalle_image_generation import OpenAIDALLEImageGenerationTool from langchain_openai import ChatOpenAI load_dotenv() # 初始化语言模型 llm ChatOpenAI(modelgpt-4o-mini) # 配置搜索工具 search_tool GoogleSerperRun( nameweb_search, description查询最新网络信息适用于时事、赛事结果等需要实时数据的请求 ) # 配置图像生成工具 dalle_tool OpenAIDALLEImageGenerationTool( nameimage_generator, description根据文本描述生成创意图像 ) tools [search_tool, dalle_tool] llm_with_tools llm.bind_tools(tools)提示Google Serper API提供比传统搜索引擎API更经济的搜索方案适合中小规模应用。若需要更高查询额度可以考虑其他商业API服务。2. 构建智能路由核心逻辑LangGraph的核心优势在于其灵活的状态管理和条件路由系统。我们需要设计一个决策大脑来动态判断应该使用搜索还是画图功能。状态类型定义from typing import TypedDict, Annotated, Literal from langgraph.graph.message import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages] # 消息历史记录路由决策函数def route_action(state: AgentState) - Literal[search, draw, end]: last_msg state[messages][-1] if not hasattr(last_msg, tool_calls): return end # 无工具调用则结束 tool_name last_msg.tool_calls[0][name] return search if tool_name web_search else draw这个路由函数会检查最近一条消息中的工具调用指令根据工具名称决定下一步动作。这种设计模式在以下场景特别有用需要处理多种类型用户请求的客服系统根据输入内容自动选择分析工具的数据处理平台混合文本和多媒体生成的内容创作助手3. 实现工具执行节点每个工具都需要专门的执行节点来处理具体操作。我们采用模块化设计使系统易于扩展新功能。搜索执行节点def search_node(state: AgentState): tool_call state[messages][-1].tool_calls[0] search_result search_tool.invoke(tool_call[args]) return {messages: [ToolMessage( contentstr(search_result), tool_call_idtool_call[id] )]}图像生成节点def draw_node(state: AgentState): tool_call state[messages][-1].tool_calls[0] image_url dalle_tool.invoke(tool_call[args]) return {messages: [ToolMessage( contentf![生成图像]({image_url}), tool_call_idtool_call[id] )]}注意DALL-E 3生成的图像链接通常有效期为2小时如需永久保存需要额外实现下载存储功能。4. 组装完整工作流现在我们将所有组件整合到一个有向图中定义完整的工作流程from langgraph.graph import StateGraph, END # 初始化图构建器 workflow StateGraph(AgentState) # 添加节点 workflow.add_node(llm, llm_with_tools) workflow.add_node(search, search_node) workflow.add_node(draw, draw_node) # 设置边关系 workflow.add_edge(search, llm) workflow.add_edge(draw, llm) workflow.add_conditional_edges( llm, route_action, { search: search, draw: draw, end: END } ) # 设置入口点 workflow.set_entry_point(llm) # 编译可执行图 agent workflow.compile()这个架构的精妙之处在于它的循环设计LLM生成决策 → 工具执行 → 结果返回LLM → 生成最终响应。这种模式被称为思考-行动-观察循环是构建复杂Agent的基础范式。5. 实战测试与效果优化让我们用几个典型场景测试我们的智能助手场景1事实查询result agent.invoke({ messages: [(user, 2024年温网男单冠军是谁)] }) print(result[messages][-1][content])预期输出会包含最新冠军信息如2024年温布尔登网球锦标赛男单冠军是...场景2图像生成result agent.invoke({ messages: [(user, 画一幅未来主义风格的城市景观有飞行汽车和玻璃幕墙大厦)] })系统会返回DALL-E生成的图像链接展示符合描述的科幻场景。性能优化技巧为搜索工具添加缓存机制减少重复查询对图像生成设置分辨率参数如1024x1024添加用户指令分类器提前过滤不合法请求实现对话历史摘要功能处理长对话场景# 缓存优化示例 from langchain.cache import SQLiteCache import langchain langchain.llm_cache SQLiteCache(database_path.langchain.db)6. 高级功能扩展基础版本运行稳定后可以考虑添加这些增强功能多工具并行执行# 在route_action函数中添加并行逻辑 if 和 in last_msg.content and 搜索 in last_msg.content and 画 in last_msg.content: return [search, draw] # 返回列表实现并行自定义工具验证def validate_request(state: AgentState): last_msg state[messages][-1].content if 暴力 in last_msg or 仇恨 in last_msg: raise ValueError(内容不符合使用政策) return state对话状态可视化使用Graphvizfrom pygraphviz import AGraph g AGraph() g.add_nodes_from([llm, search, draw, end]) g.add_edges_from([ (llm, search), (llm, draw), (search, llm), (draw, llm) ]) g.draw(workflow.png, progdot)这个项目最令人兴奋的部分是你可以基于这个框架快速开发各种专业领域的智能助手。比如电商客服自动查询订单/生成产品示意图学术研究文献检索/数据可视化生成内容创作事实核查/插图生成一体化我在实际项目中发现最影响用户体验的不是单个工具的精度而是系统能否准确理解用户意图并选择正确的工具。这需要精心设计工具的描述文本和大量边界案例测试。