在开发智能体应用时,我们常常面临这样的挑战:如何快速构建一个具备记忆能力、支持工具调用且能与人类交互的智能系统?LangGraph 作为一个强大的框架,为我们提供了从底层原语到高级组件的完整解决方案。今天,我们就来深入探讨如何利用 LangGraph 高效开发生产级智能体应用,揭开智能体开发的神秘面纱。

智能体的核心组成与运行机制

我们可以把智能体看作一个会思考的机器人,它由三个关键部分构成:大语言模型(LLM)、工具集合以及提示词指令。这三个部分协同工作,形成一个循环决策过程:LLM 不断选择工具、获取结果、更新决策,直到满足停止条件。

举个例子,当我们需要开发一个天气查询智能体时,LLM 就像大脑,负责思考下一步该做什么;工具集合里包含获取天气数据的 API;而提示词则告诉智能体 “用户问天气时,先调用天气工具,再整理结果回复”。

智能体的运行遵循一个清晰的循环逻辑:

  1. LLM 根据当前状态选择要调用的工具
  2. 向工具提供输入并获取观察结果
  3. 利用新观察更新决策,决定下一步动作
  4. 重复上述过程,直到收集到足够信息回答用户

这种循环机制让智能体能够逐步逼近正确答案,就像我们人类解决问题时一步步思考、验证一样。

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 的真正潜力。

如果本文对你有帮助,别忘了点赞收藏,关注我,一起探索更高效的开发方式~

Logo

更多推荐