作者:佑瞻
在开发智能体应用时,我们常常面临这样的挑战:如何快速构建一个具备记忆能力、支持工具调用且能与人类交互的智能系统?LangGraph 作为一个强大的框架,为我们提供了从底层原语到高级组件的完整解决方案。今天,我们就来深入探讨如何利用 LangGraph 高效开发生产级智能体应用,揭开智能体开发的神秘面纱。
智能体的核心组成与运行机制
我们可以把智能体看作一个会思考的机器人,它由三个关键部分构成:大语言模型(LLM)、工具集合以及提示词指令。这三个部分协同工作,形成一个循环决策过程:LLM 不断选择工具、获取结果、更新决策,直到满足停止条件。
举个例子,当我们需要开发一个天气查询智能体时,LLM 就像大脑,负责思考下一步该做什么;工具集合里包含获取天气数据的 API;而提示词则告诉智能体 “用户问天气时,先调用天气工具,再整理结果回复”。
智能体的运行遵循一个清晰的循环逻辑:
LLM 根据当前状态选择要调用的工具向工具提供输入并获取观察结果利用新观察更新决策,决定下一步动作重复上述过程,直到收集到足够信息回答用户
这种循环机制让智能体能够逐步逼近正确答案,就像我们人类解决问题时一步步思考、验证一样。
LangGraph 的关键特性:让智能体更强大
内存集成:短期记忆与长期记忆的完美结合
在实际应用中,智能体需要记住用户的历史对话和偏好。LangGraph 原生支持两种内存模式:
短期记忆(基于会话):保存当前对话中的关键信息,比如用户刚刚提到的地点长期记忆(跨会话持久化):存储用户的长期偏好,比如默认城市设置
想象一下,用户第一次使用天气智能体时设置了 “北京” 作为默认城市,长期记忆会记住这个设置,即使下次用户换了设备登录,智能体也能自动获取北京的天气,无需重复设置。
人在回路控制:赋予人类干预的能力
与传统实时交互方案不同,LangGraph 允许智能体在执行过程中无限期暂停,等待人类反馈。这一特性在需要审核或复杂决策的场景中尤为重要。
比如在金融智能体处理大额转账时,系统可以自动暂停并等待人工审核,确认无误后再继续执行,大大提高了系统的安全性和可靠性。
流支持:实时反馈提升用户体验
在智能体运行过程中,我们常常需要实时了解其状态。LangGraph 支持多种流数据:
这些实时流数据可以让我们在开发和使用过程中,直观地看到智能体的思考过程,比如在天气查询时,我们能看到智能体如何一步步调用工具、处理数据、生成回答。
部署工具:从开发到生产的无缝衔接
LangGraph 提供了一套完整的部署工具链,包括:
无基础设施的部署工具可视化 IDE(LangGraph Studio)用于工作流检查和调试多种生产环境部署选项
这意味着我们可以在本地快速开发和调试智能体,然后轻松部署到生产环境,无需担心环境差异带来的问题。
预构建组件:加速智能体开发的利器
LangGraph 的一大优势在于提供了丰富的预构建组件,这些组件封装了常见的智能体行为和工作流程,让我们可以专注于业务逻辑,而不是基础设施建设。
包生态系统:各司其职的功能模块
LangGraph 的组件按功能划分为多个包:
langgraph-prebuilt:创建智能体的核心预构建组件langgraph-supervisor:构建监督智能体的工具langgraph-swarm:多智能体系统构建工具langchain-mcp-adapters:集成 MCP 服务器的接口langmem:智能体内存管理(短期和长期)agentevals:评估智能体性能的实用工具
这些包就像乐高积木,我们可以根据需求灵活组合,快速搭建复杂的智能体系统。
可视化智能体图:直观理解系统结构
LangGraph 提供了工具来可视化智能体的结构,我们可以清晰地看到:
智能体可用的工具列表模型调用前的预处理函数(pre_model_hook)模型调用后的后处理函数(post_model_hook)输出格式约束(response_format)
这种可视化能力对于理解复杂智能体的工作流程、调试问题非常有帮助。下面是一个创建智能体并可视化其结构的示例代码:
python- from langgraph.prebuilt import create_react_agent
- from langchain_openai import ChatOpenAI
- # 初始化模型
- model = ChatOpenAI("o4-mini")
- # 定义工具
- def tool() -> None:
- """测试工具"""
- ...
- # 创建智能体
- agent = create_react_agent(
- model,
- tools=[tool],
- )
- # 可视化智能体图
- agent.get_graph().draw_mermaid_png()
复制代码 智能体的运行与交互:从输入到输出的全流程
两种执行模式:同步与异步
LangGraph 智能体支持两种执行模式,满足不同场景的需求:
同步模式:使用.invoke()或.stream()获取即时响应异步模式:使用await .ainvoke()或async for .astream()处理高并发场景
下面是一个同步调用智能体的示例:
python
运行- from langgraph.prebuilt import create_react_agent
- # 创建智能体
- agent = create_react_agent(...)
- # 同步调用智能体
- response = agent.invoke({"messages": [{"role": "user", "content": "what is the weather in sf"}]})
复制代码 输入输出格式:标准化的数据交互
智能体的输入输出遵循统一的格式规范:
输入必须是包含messages键的字典,可以是字符串、消息字典或消息列表输出包含messages列表,记录所有交互消息,可选structured_response结构化输出
这种标准化格式让我们可以轻松与不同的模型和工具集成,确保数据交互的一致性。
流式输出:实时反馈的实现
流式输出是提升用户体验的关键特性,LangGraph 支持在同步和异步模式下进行流式输出:
python- # 同步流式输出示例
- for chunk in agent.stream(
- {"messages": [{"role": "user", "content": "what is the weather in sf"}]},
- stream_mode="updates"
- ):
- print(chunk)
复制代码 通过流式输出,我们可以在智能体处理过程中实时展示进度,比如在生成较长回答时,逐字显示内容,让用户感觉系统更流畅、更响应。
执行控制:避免无限循环的保护机制
为了防止智能体陷入无限循环,LangGraph 提供了递归限制配置:
python- from langgraph.errors import GraphRecursionError
- from langgraph.prebuilt import create_react_agent
- # 设置最大迭代次数
- max_iterations = 3
- recursion_limit = 2 * max_iterations + 1
- # 创建智能体
- agent = create_react_agent(
- model="anthropic:claude-3-5-haiku-latest",
- tools=[get_weather]
- )
- try:
- # 调用智能体并设置递归限制
- response = agent.invoke(
- {"messages": [{"role": "user", "content": "what's the weather in sf"}]},
- {"recursion_limit": recursion_limit},
- )
- except GraphRecursionError:
- print("Agent stopped due to max iterations.")
复制代码 这种机制就像给智能体设置了一个 “安全绳”,确保即使在异常情况下也能正常终止。
模型配置与工具调用:智能体的 “大脑” 与 “双手”
灵活的模型配置方式
LangGraph 支持多种方式配置智能体使用的模型:
通过名称指定模型(如 "openai:gpt-4.1")使用init_chat_model工具简化模型初始化直接实例化特定提供商的模型类
下面是使用init_chat_model初始化模型的示例:
python- import os
- from langchain.chat_models import init_chat_model
- # 设置API密钥
- os.environ["OPENAI_API_KEY"] = "sk-..."
- # 初始化模型
- model = init_chat_model(
- "openai:gpt-4.1",
- temperature=0,
- # 其他参数
- )
复制代码 模型备用方案:提高系统可靠性
为了应对模型服务可能出现的故障,LangGraph 支持为模型添加备用方案:
python- from langchain.chat_models import init_chat_model
- # 创建主模型
- primary_model = init_chat_model("anthropic:claude-3-5-haiku-latest")
- # 添加备用模型
- model_with_fallbacks = primary_model.with_fallbacks([
- init_chat_model("openai:gpt-4.1-mini"),
- ])
复制代码 这种机制就像为智能体准备了 “备胎”,当主模型不可用时,自动切换到备用模型,保证系统的稳定性。
工具调用支持:扩展智能体的能力边界
智能体的强大之处在于能够调用外部工具,LangGraph 支持与各种工具集成,但需要底层 LLM 支持工具调用。我们可以通过 LangChain 集成目录找到兼容的模型。
上下文管理:让智能体更 “懂” 你
上下文的三种类型:不同场景下的信息支持
智能体要有效工作,除了消息列表外,还需要上下文信息。LangGraph 提供了三种上下文类型:
配置(Config):运行开始时传递的不可变数据,如用户 ID、API 密钥状态(State):执行过程中可变的动态数据,如工具调用结果长期记忆(Store):跨对话共享的持久数据,如用户偏好
这三种上下文类型就像智能体的 “知识库”,根据不同需求提供相应的信息支持。
运行时上下文的提供与使用
我们可以在运行时向智能体注入上下文数据:
python- # 提供配置上下文
- agent.invoke(
- {"messages": [{"role": "user", "content": "hi!"}]},
- config={"configurable": {"user_id": "user_123"}}
- )
- # 提供状态上下文
- class CustomState(AgentState):
- user_name: str
- agent = create_react_agent(
- # 其他参数...
- state_schema=CustomState,
- )
- agent.invoke({
- "messages": "hi!",
- "user_name": "Jane"
- })
复制代码 上下文在提示词与工具中的应用
我们可以根据上下文动态生成提示词,实现个性化交互:
python- from langchain_core.messages import AnyMessage
- from langchain_core.runnables import RunnableConfig
- from langgraph.prebuilt import create_react_agent
- from langgraph.prebuilt.chat_agent_executor import AgentState
- def prompt(
- state: AgentState,
- config: RunnableConfig,
- ) -> list[AnyMessage]:
- # 从配置中获取用户名
- user_name = config["configurable"].get("user_name")
- # 生成个性化系统消息
- system_msg = f"You are a helpful assistant. User's name is {user_name}"
- return [{"role": "system", "content": system_msg}] + state["messages"]
- agent = create_react_agent(
- model="anthropic:claude-3-7-sonnet-latest",
- tools=[get_weather],
- prompt=prompt
- )
- # 调用智能体并传递配置
- agent.invoke(
- ...,
- config={"configurable": {"user_name": "John Smith"}}
- )
复制代码 工具也可以访问上下文信息,实现更智能的处理:
python- def get_user_info(
- config: RunnableConfig,
- ) -> str:
- """根据配置获取用户信息"""
- user_id = config["configurable"].get("user_id")
- return "User is John Smith" if user_id == "user_123" else "Unknown user"
- agent = create_react_agent(
- model="anthropic:claude-3-7-sonnet-latest",
- tools=[get_user_info],
- )
- # 调用智能体并传递配置
- agent.invoke(
- {"messages": [{"role": "user", "content": "look up user information"}]},
- config={"configurable": {"user_id": "user_123"}}
- )
复制代码 总结与展望
通过本文的介绍,我们深入了解了 LangGraph 在智能体开发中的强大能力。从智能体的核心组成到运行机制,从关键特性到预构建组件,从模型配置到上下文管理,LangGraph 为我们提供了一套完整的智能体开发解决方案。
使用 LangGraph,我们可以:
快速构建具备记忆能力的智能体轻松实现人在回路的交互控制利用流式输出提升用户体验通过预构建组件加速开发过程灵活配置模型和工具借助上下文管理实现更智能的交互
随着 AI 技术的不断发展,智能体在各个领域的应用将越来越广泛。LangGraph 作为一个强大的开发框架,将帮助我们更高效地构建智能体应用,释放 AI 的真正潜力。
如果本文对你有帮助,别忘了点赞收藏,关注我,一起探索更高效的开发方式~
原文地址:https://blog.csdn.net/The_Thieves/article/details/148794585 |