拓冰建站拓冰建站
首页 / 资讯中心 / 正文

LangGraph实战:从零构建具备状态管理与条件路由的智能客服Agent

如果你正在学习LangChain想构建更复杂的AI应用却发现简单的链式调用已经不够用了——当任务需要多步骤决策、状态管理、循环执行时传统的LangChain链条就显得力不从心。这正是LangGraph要解决的核心问题。LangGraph不是LangChain的替代品而是它的“增强引擎”。它基于LangChain生态专门用于构建有状态的、多智能体协作的复杂工作流。简单来说LangChain帮你连接工具和模型而LangGraph帮你编排这些连接背后的复杂逻辑和状态流转。最近无论是GitHub趋势还是技术社区LangGraph的热度都在飙升因为它让构建真正具备“自主决策”能力的智能体Agent变得前所未有的清晰和可控。本文将带你从零开始深入理解LangGraph的核心思想并通过一个完整的“智能客服工单处理”项目实战手把手教你搭建一个具备记忆、工具调用和条件路由的智能体。你会学到如何定义状态、设计节点、控制流程并最终部署一个可运行的智能体应用。无论你是想进阶LangChain还是探索AI Agent开发这篇文章都将提供一条清晰的实践路径。1. 为什么你需要关注LangGraph从链到图的思维跃迁在深入代码之前我们必须先理解LangGraph要解决的痛点。传统的LangChain应用大多基于LLMChain或SequentialChain这是一种“链式”思维A做完给BB做完给C流程是线性的、预设好的。但现实世界的任务远非线性。例如一个智能客服收到用户问题。判断是否需要查询知识库如果需要则查询。判断是否需要询问更多信息如果需要则反问用户。综合所有信息生成最终回答。用户可能追问需要记住之前的对话历史。这个过程充满了“判断-分支-循环”。用链来实现代码会变得极其复杂和难以维护状态如对话历史、查询结果需要在各个链之间手动传递。LangGraph引入了“图”的思维模型。它将整个应用视为一个由节点Node和边Edge构成的有向图。节点代表一个可执行单元比如调用一次LLM、执行一个工具、或者处理一段逻辑。边定义了节点之间的流转条件。基于当前节点的执行结果决定下一步该去哪个节点。这种模型天然适合描述带有分支、循环和状态的工作流。LangGraph的核心价值在于它提供了一个框架让你能够显式地定义状态结构、清晰地编排执行逻辑并可靠地管理整个工作流的生命周期。对于想构建超越简单问答的、具备复杂逻辑的AI应用开发者来说这是必须掌握的工具。2. LangGraph核心概念三要素构建智能工作流要掌握LangGraph必须吃透它的三个核心概念State状态、Node节点和Edge边。这是构建任何LangGraph应用的基石。2.1 State工作流的记忆中枢State是一个Pydantic模型定义了在整个图执行过程中需要传递和更新的所有数据。你可以把它理解为工作流的“记忆体”或“共享白板”。from typing import TypedDict, List, Annotated import operator from langgraph.graph.message import add_messages class State(TypedDict): # 消息历史这是LangGraph内置的、专为对话设计的状态字段 # add_messages是一个归约函数确保消息能正确追加 messages: Annotated[List[dict], add_messages] # 用户输入的原始问题 user_query: str # 从知识库查询到的结果可能为空 knowledge_result: str # 标志位是否需要进一步询问用户 need_clarify: bool # 标志位当前流程是否已结束 finished: bool关键点TypedDict或PydanticBaseModel都可以用来定义State。Annotated用于为字段指定“归约函数”reducer。归约函数决定了当多个节点并发修改同一个字段时如何合并这些修改。add_messages是LangGraph为对话消息历史提供的标准归约器。设计State是第一步也是最重要的一步。它直接决定了你的智能体能“记住”什么以及节点之间能共享什么信息。2.2 Node执行具体任务的单元Node是一个普通的异步函数它接收当前的State执行一些操作如调用LLM、查询数据库然后返回一个包含对State更新内容的字典。from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo) async def classify_intent_node(state: State): 节点对用户意图进行分类 messages state[messages] last_message messages[-1][content] if messages else state[user_query] # 构建分类提示词 prompt f 请判断用户意图属于哪一类 1. 产品咨询如价格、功能 2. 技术问题如错误代码、安装问题 3. 投诉建议 4. 其他 用户输入{last_message} 只返回数字1、2、3或4。 # 调用LLM response await llm.ainvoke(prompt) intent response.content.strip() # 返回State的更新部分 return {intent: intent}关键点Node函数应该职责单一。它通过返回字典来“提议”对State的修改。LangGraph框架会应用这些修改。Node可以调用任何Python代码包括网络请求、数据库操作等。2.3 Edge控制流程的方向盘Edge决定了执行完一个Node后接下来该去哪个Node。有两种主要类型条件边Conditional Edge根据State中的某个值决定下一个节点。普通边无条件地指向下一个节点。条件边是LangGraph实现分支逻辑的关键。from langgraph.graph import END def route_after_intent(state: State): 路由函数根据意图分类结果决定下一步 intent state.get(intent) if intent 1: return query_knowledge_base # 跳转到知识库查询节点 elif intent 2: return create_tech_ticket # 跳转到创建技术工单节点 elif intent 3: return escalate_to_human # 跳转到人工客服节点 else: return general_response # 跳转到通用回复节点END是一个特殊的节点表示工作流终止。将边指向END意味着流程在此结束。3. 环境准备搭建你的LangGraph开发环境在开始项目实战前我们需要准备好Python环境。建议使用Python 3.10或以上版本并使用虚拟环境管理依赖。3.1 创建虚拟环境与安装依赖# 1. 创建并进入项目目录 mkdir langgraph-ticket-agent cd langgraph-ticket-agent # 2. 创建虚拟环境以venv为例 python -m venv venv # 3. 激活虚拟环境 # Linux/macOS source venv/bin/activate # Windows venv\Scripts\activate # 4. 安装核心依赖 pip install langgraph langchain-openai langchain-community # 5. 安装可选但常用的依赖用于示例中的工具调用等 pip install requests python-dotenv3.2 配置API密钥本项目需要OpenAI API密钥或其他兼容API的密钥。强烈建议通过环境变量管理避免硬编码在代码中。在项目根目录创建.env文件。在.env文件中填入你的密钥OPENAI_API_KEYsk-your-openai-api-key-here # 如果你使用其他模型如通义千问、DeepSeek等配置对应的环境变量 # DASHSCOPE_API_KEYyour-dashscope-key在代码中通过os.getenv读取。# config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY 环境变量)4. 项目实战构建智能客服工单处理Agent我们将构建一个能自动处理用户客服请求的智能体。它的工作流程如下接收用户输入。意图识别判断用户是想咨询、报修还是投诉。分支处理咨询 - 查询知识库并回答。报修 - 收集必要信息设备型号、问题描述自动创建工单。投诉 - 转接人工客服。维护对话记忆支持多轮交互。4.1 定义完整的状态StateState是整个应用的数据蓝图。# state.py from typing import TypedDict, List, Optional, Annotated from langgraph.graph.message import add_messages class AgentState(TypedDict): 智能客服Agent的完整状态定义。 # 对话消息历史由LangGraph管理追加逻辑 messages: Annotated[List[dict], add_messages] # 当前用户输入 current_input: str # 识别出的用户意图consult, repair, complain, other detected_intent: Optional[str] # 从知识库查询到的答案针对咨询 knowledge_answer: Optional[str] # 为报修工单收集的信息 repair_device_model: Optional[str] repair_problem_desc: Optional[str] # 工单ID创建后回填 ticket_id: Optional[str] # 控制流程是否应该结束 should_end: bool4.2 构建图的核心节点我们将创建多个节点每个节点负责一个具体任务。# nodes.py from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, AIMessage import json import asyncio from state import AgentState llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) async def intent_classification_node(state: AgentState): 节点1意图分类 # 获取最新的用户消息 history state[messages] user_input state[current_input] # 构建分类提示词 prompt f 你是一个客服助手。请分析用户输入判断其意图类别。 类别定义 - consult咨询询问产品信息、功能、价格、使用方法等。 - repair报修报告产品故障、无法使用、需要维修等。 - complain投诉表达不满、投诉服务或质量等问题。 - other其他不属于以上任何一类或意图不明。 用户输入{user_input} 请只返回一个JSON对象格式如下 {{intent: consult|repair|complain|other, confidence: 0.95}} try: response await llm.ainvoke(prompt) result json.loads(response.content) return {detected_intent: result[intent]} except json.JSONDecodeError: # 如果LLM返回非JSON降级处理 return {detected_intent: other} async def handle_consult_node(state: AgentState): 节点2处理咨询意图 - 模拟查询知识库 user_input state[current_input] # 这里模拟一个知识库查询过程。真实场景可替换为向量数据库检索。 mock_knowledge_base { 价格: 基础版每月30元专业版每月99元。, 登录: 请访问我们的官网点击右上角登录按钮。, 退款: 购买后7天内可申请无条件退款。 } # 简单关键词匹配实际应用应用Embedding相似度搜索 answer 抱歉我暂时没有找到这个问题的答案建议您联系人工客服。 for keyword, resp in mock_knowledge_base.items(): if keyword in user_input: answer resp break # 也可以让LLM基于知识库内容生成更友好的回答 prompt f用户咨询{user_input}\n相关答案{answer}\n请生成一段友好、专业的客服回复。 final_response await llm.ainvoke(prompt) return { knowledge_answer: final_response.content, messages: [AIMessage(contentfinal_response.content)] # 更新消息历史 } async def handle_repair_node(state: AgentState): 节点3处理报修意图 - 收集必要信息 # 检查是否已收集足够信息 if not state.get(repair_device_model): # 第一轮询问设备型号 question 为了帮您创建维修工单请先告诉我您的设备型号例如ABC-2000。 return { messages: [AIMessage(contentquestion)], # 注意此时不结束需要等待用户下一轮回复 } elif not state.get(repair_problem_desc): # 第二轮已有机型询问问题描述 # 这里state[‘repair_device_model’]已由上轮用户回复填充通过另一个节点 question f好的设备型号是 {state[repair_device_model]}。请详细描述一下您遇到的问题。 return { messages: [AIMessage(contentquestion)], } else: # 信息已收集完整创建工单 ticket_id fTICKET-{int(asyncio.get_event_loop().time())} # 模拟调用创建工单的API # api_create_ticket(state[‘repair_device_model’], state[‘repair_problem_desc’]) confirmation f工单已创建工单号{ticket_id}。我们的工程师将在24小时内联系您。 return { ticket_id: ticket_id, messages: [AIMessage(contentconfirmation)], should_end: True # 此分支流程结束 } async def handle_complain_node(state: AgentState): 节点4处理投诉意图 - 转接人工 response 您的问题已升级。稍后将有专属客服经理联系您请保持电话畅通。 return { messages: [AIMessage(contentresponse)], should_end: True } async def general_response_node(state: AgentState): 节点5通用回复节点用于‘other’意图或兜底 response 我明白了。请问还有什么其他可以帮您的吗 return { messages: [AIMessage(contentresponse)] } async def update_repair_info_node(state: AgentState): 节点6专门用于更新报修信息设备型号、问题描述 # 这个节点在用户回复报修相关的追问时被调用 latest_message state[messages][-1][content] if state[messages] else if not state.get(repair_device_model): # 用户回复了设备型号 return {repair_device_model: latest_message} elif not state.get(repair_problem_desc): # 用户回复了问题描述 return {repair_problem_desc: latest_message} else: return {} # 信息已全无需更新4.3 设计流程路由边路由逻辑是智能体的大脑它根据当前状态决定下一步做什么。# edges.py from langgraph.graph import END from state import AgentState def route_by_intent(state: AgentState): 主路由根据识别出的意图分发到不同处理节点 intent state.get(detected_intent) if intent consult: return handle_consult elif intent repair: return handle_repair elif intent complain: return handle_complain else: return general_response def route_after_repair_question(state: AgentState): 报修流程子路由判断信息收集的进度 # 如果还没有设备型号说明刚进入报修流程需要去问型号 if not state.get(repair_device_model): return ask_device_model # 这是一个我们稍后会在图中定义的“虚拟”节点实际指向handle_repair_node的特定逻辑分支 # 如果有型号但没问题描述说明刚问完型号需要去问问题 elif not state.get(repair_problem_desc): return ask_problem_desc else: # 信息齐全可以结束这个子流程返回主流程或结束 # 在我们的设计中handle_repair_node的最后一步会设置should_endTrue return __end__ def should_continue(state: AgentState): 判断整个图是否应该继续执行还是结束 # 如果某个节点明确设置了结束标志或者用户输入了结束语则停止 if state.get(should_end, False): return END # 否则继续执行下一个循环例如等待用户下一轮输入 # 这里我们返回一个特殊节点名代表“等待外部输入”实际应用中可能需要与外部系统交互。 # 为了简化我们设计为每次调用都从intent_classification开始新一轮。 # 更复杂的图可以在这里进行其他判断。 return intent_classification4.4 组装完整的图并编译现在我们将所有节点和边组装成一个完整的、可执行的工作流图。# graph_builder.py from langgraph.graph import StateGraph, START, END from nodes import ( intent_classification_node, handle_consult_node, handle_repair_node, handle_complain_node, general_response_node, update_repair_info_node ) from edges import route_by_intent, route_after_repair_question, should_continue from state import AgentState # 1. 创建一个以AgentState为状态类型的图 workflow StateGraph(AgentState) # 2. 添加所有节点 workflow.add_node(intent_classification, intent_classification_node) workflow.add_node(handle_consult, handle_consult_node) workflow.add_node(handle_repair, handle_repair_node) # 这个节点内部有分支逻辑 workflow.add_node(handle_complain, handle_complain_node) workflow.add_node(general_response, general_response_node) workflow.add_node(update_repair_info, update_repair_info_node) # 用于更新报修信息 # 3. 设置入口点 workflow.set_entry_point(intent_classification) # 4. 添加主要的条件边从意图分类节点出发 workflow.add_conditional_edges( intent_classification, route_by_intent, # 路由函数 { handle_consult: handle_consult, handle_repair: handle_repair, handle_complain: handle_complain, general_response: general_response, } ) # 5. 为咨询、投诉、通用回复节点添加结束边它们执行完后通常结束一轮对话 # 但我们的设计里它们执行完后会通过should_continue判断是否真正结束。 # 我们先让它们都流向一个“判断是否继续”的节点这里简化直接指向END。 # 更精细的控制可以在节点内设置state[‘should_end’]并在后续边中判断。 workflow.add_edge(handle_consult, END) # 咨询完一轮结束 workflow.add_edge(handle_complain, END) # 投诉转接后结束 workflow.add_edge(general_response, END) # 通用回复后结束 # 6. 处理报修节点的复杂流程这是一个子图逻辑 # 思路handle_repair_node - 根据state判断 - 可能返回追问 - 等待用户输入 - update_repair_info_node - 回到handle_repair_node # 为了清晰我们创建两个“虚拟”节点来代表追问实际上它们共用handle_repair_node的逻辑。 # 更好的方式是用add_conditional_edges在handle_repair_node之后进行路由。 # 这里我们简化假设handle_repair_node自己处理多轮并在完成后设置should_end。 # 7. 编译图 app workflow.compile() # 可选保存图的可视化 try: from IPython.display import Image, display # 生成流程图 image_data app.get_graph().draw_mermaid_png() with open(workflow.png, wb) as f: f.write(image_data) print(流程图已保存为 workflow.png) except ImportError: print(如需生成可视化图请安装 pygraphviz 或 ipython。)5. 运行与测试让你的智能体工作起来图编译好后我们就可以像调用函数一样运行它通过输入不同的State来驱动整个工作流。5.1 编写主程序与测试用例# main.py import asyncio from graph_builder import app from state import AgentState async def run_agent(user_input: str, initial_state: dict None): 运行智能体处理一次用户输入。 Args: user_input: 用户当前输入。 initial_state: 初始状态字典用于多轮对话携带历史。 Returns: 更新后的状态字典和整个执行过程的流Stream。 # 准备初始状态 config {configurable: {thread_id: test_thread_1}} # 线程ID用于区分会话 if initial_state is None: initial_state { messages: [], # 初始消息为空 current_input: user_input, detected_intent: None, knowledge_answer: None, repair_device_model: None, repair_problem_desc: None, ticket_id: None, should_end: False, } else: initial_state[current_input] user_input # 更新当前输入 # 执行图 # app.astream()返回一个异步生成器可以观察执行过程 # app.ainvoke()直接获取最终结果 final_state await app.ainvoke(initial_state, configconfig) # 从最终状态中提取AI的最后一条回复 ai_response None if final_state.get(messages): for msg in reversed(final_state[messages]): if msg[type] ai: # 注意实际消息类型可能是‘AIMessage’等取决于你使用的消息类 ai_response msg[content] break return final_state, ai_response async def test_scenarios(): 测试不同的用户场景 print( 开始测试智能客服Agent \n) # 场景1产品咨询 print(场景1: 用户咨询产品价格) state, resp await run_agent(你们的产品怎么收费的) print(f用户: 你们的产品怎么收费的) print(fAgent: {resp}) print(f检测意图: {state.get(detected_intent)}) print(- * 40) # 场景2技术报修多轮对话 print(\n场景2: 用户报告设备故障) state, resp await run_agent(我的设备坏了需要维修。) print(f用户: 我的设备坏了需要维修。) print(fAgent (第一轮): {resp}) # 模拟用户回复设备型号第二轮 # 注意这里需要将上一轮的state传递下去 state[current_input] ABC-2000 # 我们需要手动触发信息更新和下一轮处理。在实际聊天应用中这由外部循环驱动。 # 为了测试我们直接调用处理报修信息更新的逻辑然后再次运行图。 from nodes import update_repair_info_node update await update_repair_info_node(state) state.update(update) # 再次调用图处理下一轮此时state中已有设备型号 state, resp await run_agent(, state) # 当前输入为空但state已更新 print(f用户 (回复型号): ABC-2000) print(fAgent (第二轮): {resp}) # 模拟用户回复问题描述第三轮 state[current_input] 开机没反应指示灯也不亮。 update await update_repair_info_node(state) state.update(update) state, resp await run_agent(, state) print(f用户 (回复问题): 开机没反应指示灯也不亮。) print(fAgent (第三轮): {resp}) print(f生成的工单ID: {state.get(ticket_id)}) print(- * 40) # 场景3投诉 print(\n场景3: 用户投诉) state, resp await run_agent(我要投诉上次的服务太差了。) print(f用户: 我要投诉上次的服务太差了。) print(fAgent: {resp}) print(f检测意图: {state.get(detected_intent)}) print(- * 40) if __name__ __main__: asyncio.run(test_scenarios())5.2 运行与结果分析在终端运行测试程序python main.py预期输出示例 开始测试智能客服Agent 场景1: 用户咨询产品价格 用户: 你们的产品怎么收费的 Agent: 基础版每月30元专业版每月99元。您可以根据需要选择适合的版本。 检测意图: consult ---------------------------------------- 场景2: 用户报告设备故障 用户: 我的设备坏了需要维修。 Agent (第一轮): 为了帮您创建维修工单请先告诉我您的设备型号例如ABC-2000。 用户 (回复型号): ABC-2000 Agent (第二轮): 好的设备型号是 ABC-2000。请详细描述一下您遇到的问题。 用户 (回复问题): 开机没反应指示灯也不亮。 Agent (第三轮): 工单已创建工单号TICKET-1741234567。我们的工程师将在24小时内联系您。 生成的工单ID: TICKET-1741234567 ---------------------------------------- 场景3: 用户投诉 用户: 我要投诉上次的服务太差了。 Agent: 您的问题已升级。稍后将有专属客服经理联系您请保持电话畅通。 检测意图: complain ----------------------------------------结果分析场景1成功识别为consult意图并模拟查询知识库返回了价格信息。场景2成功识别为repair意图并展开了多轮对话逐步收集设备型号和问题描述最终模拟生成了工单ID。这展示了LangGraph管理多轮、有状态对话的能力。场景3成功识别为complain意图并执行了转接人工的流程。6. 常见问题与排查思路在开发和运行LangGraph应用时你可能会遇到以下典型问题问题现象可能原因排查方式解决方案TypeError: ‘xxx’ object is not subscriptableState字段访问错误例如字段名拼写错误或类型不匹配。1. 检查State的TypedDict或BaseModel定义。2. 检查节点函数中访问的字段名是否与定义完全一致。3. 使用state.get(‘field’, default)安全访问。统一字段命名使用类型提示工具如mypy检查。图编译失败提示节点或边未定义1. 节点未通过add_node添加到图中。2. 边的目标节点名称拼写错误。3. 条件边返回的字符串不在提供的映射中。1. 检查add_node和add_edge/add_conditional_edges的调用顺序和参数。2. 打印图的结构print(app.get_graph().draw_mermaid())。确保所有被引用的节点都已添加且名称完全匹配。工作流陷入无限循环或提前结束1. 边Edge的路由逻辑有误形成了环。2. 没有正确设置结束条件指向END。3. 状态State中的控制标志如should_end未被正确更新。1. 可视化你的图检查是否存在意外的循环。2. 在节点函数中打印日志观察State的变化。3. 使用app.astream()逐步调试执行流。仔细设计路由逻辑确保每个分支都有明确的出口指向下一个节点或END。多轮对话中状态混乱或丢失1. 没有正确传递和更新State。2. 消息历史归约函数add_messages使用不当。3. 每次调用ainvoke都使用了全新的初始状态。1. 确保每次调用都将前一次的final_state作为下一次的initial_state。2. 确认messages字段使用了Annotated[List, add_messages]。3. 检查节点返回的更新字典是否正确。使用configurable参数如thread_id来持久化会话状态需配合存储层。在简单测试中手动传递完整State。工具调用Tool不执行或报错1. 工具未正确绑定到LLM。2. 工具调用节点的逻辑错误。3. State结构不包含工具调用结果字段。1. 确认工具是否通过bind_tools方法绑定给了LLM。2. 在节点中检查工具调用的返回结果并正确更新State。3. 参考LangChain官方文档关于Tool Calling的部分。将工具调用封装成独立的Node在该Node中处理工具的执行和结果解析。异步async函数报错节点函数定义为async但未正确使用await或在同步上下文中调用了异步函数。1. 确保所有节点函数要么全是async要么全是同步。2. 使用asyncio.run()运行主程序。3. 在Jupyter等环境中注意异步环境。统一使用异步风格并在入口点使用asyncio.run。对于简单的图也可以使用同步函数和app.invoke()。7. 最佳实践与进阶建议掌握了基础之后遵循以下最佳实践能让你的LangGraph项目更加健壮和可维护。7.1 状态设计原则最小化与清晰化State只存储工作流真正需要共享和传递的数据。避免将临时计算变量放入State。使用强类型坚持使用TypedDict或PydanticBaseModel这能在开发早期借助IDE和类型检查工具发现许多错误。合理使用归约器对于列表类数据如消息历史使用add_messages等内置归约器。对于普通字段默认的“最后一次写入获胜”策略通常就够用。7.2 节点设计原则单一职责一个节点只做一件事。例如将“调用LLM”、“查询数据库”、“处理业务逻辑”拆分成不同的节点。幂等性尽可能让节点函数是幂等的即相同输入产生相同输出这有助于调试和重试。充分的日志在节点开始、结束和关键决策点打印日志便于跟踪执行流。可以使用Python的logging模块。7.3 图结构设计建议模块化与子图对于复杂流程使用StateGraph的add_conditional_edges和嵌套子图通过as_graph将小图作为大图的节点来保持主图清晰。可视化先行在编写大量代码前先用纸笔或绘图工具画出工作流草图明确节点、边和状态流转。处理异常路径为关键节点设计错误处理边。例如数据库查询失败后是重试、降级还是直接转人工7.4 生产环境部署考量状态持久化app.compile()产生的图对象是无状态的。生产环境中你需要将State持久化到数据库如Redis、PostgreSQL并在每次请求时加载。LangGraph的configurable参数如thread_id是连接持久化存储的关键。超时与重试为节点执行特别是网络调用LLM、API设置超时和重试机制。监控与可观测性集成监控工具记录图的执行轨迹、每个节点的耗时和状态变化这对于排查复杂问题至关重要。版本管理图的定义节点、边逻辑会迭代。需要建立图的版本管理机制确保线上服务的稳定性和可回滚。7.5 后续学习方向深入研究官方文档LangGraph官方文档是宝库重点关注StateGraph、MessageGraph、Prebuilt预建组件如AgentExecutor等高级特性。探索预构建智能体LangGraph提供了create_react_agent、create_agent_executor等高级API能快速构建基于工具使用的ReAct智能体理解其内部图结构是很好的学习方式。集成向量数据库将本实战中的“模拟知识库”替换为真实的向量数据库如Chroma, Weaviate实现基于语义检索的精准问答。多智能体协作尝试构建多个具有不同专长的智能体如查询专家、总结专家、审核专家并通过LangGraph编排它们之间的协作解决更复杂的任务。前端交互为你的智能体构建一个简单的Web界面使用Gradio、Streamlit或FastAPI实现真正的交互式应用。LangGraph将AI应用的开发从“链式编程”提升到了“流程编排”的维度。它带来的最大改变是思维模式你需要像设计系统架构一样去设计智能体的状态机和工作流。这种显式、可视化的控制方式使得构建可靠、可维护、可调试的复杂AI应用成为了可能。从今天这个简单的客服工单智能体开始尝试用图的思维去解构你遇到的每一个复杂任务你会发现一片更广阔的AI工程化天地。建议将本文的代码作为模板收藏在后续的项目中不断迭代和扩展。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门