代理通常需要除消息列表之外的更多信息才能有效运行。它们需要上下文

上下文包括消息列表之外的_任何_数据,这些数据可以影响代理行为或工具执行。这可以是:

  • 运行时传入的信息,如 `user_id` 或 API 凭据。
  • 多步推理过程中更新的内部状态。
  • 来自先前交互的持久记忆或事实。

LangGraph 提供了三种提供上下文的主要方式:

您可以使用上下文来:

  • 调整模型看到的系统提示
  • 为工具提供必要的输入
  • 在正在进行的对话中跟踪事实

当您需要在运行时向代理注入数据时使用此功能。

配置适用于不可变数据,如用户元数据或 API 密钥。当您有在运行期间不会更改的值时使用。

使用保留用于此目的的键 “configurable” 指定配置

<span id="__span-0-1">agent.invoke(
<span id="__span-0-2">    {"messages": [{"role": "user", "content": "hi!"}]},
<span id="__span-0-3">    config={"configurable": {"user_id": "user_123"}}
<span id="__span-0-4">)

状态在运行期间充当短期记忆。它保存可在执行期间演变的动态数据,例如从工具或 LLM 输出派生的值。

<span id="__span-1-1">class CustomState(AgentState):
<span id="__span-1-2">    user_name: str
<span id="__span-1-3">
<span id="__span-1-4">agent = create_react_agent(
<span id="__span-1-5">    # Other agent parameters...
<span id="__span-1-6">    state_schema=CustomState,
<span id="__span-1-7">)
<span id="__span-1-8">
<span id="__span-1-9">agent.invoke({
<span id="__span-1-10">    "messages": "hi!",
<span id="__span-1-11">    "user_name": "Jane"
<span id="__span-1-12">})

开启记忆功能

请参阅记忆指南,了解如何启用记忆功能的更多详细信息。这是一个强大的功能,允许您在多次调用中持久化代理的状态。否则,状态仅限于单个代理运行。

对于跨对话或会话的上下文,LangGraph 允许通过 `store` 访问长期记忆。这可用于读取或更新持久事实(例如,用户配置文件、偏好、先前交互)。更多信息请参阅记忆指南

提示定义了代理的行为方式。要结合运行时上下文,您可以根据代理的状态或配置动态生成提示。

常见用例

  • 个性化
  • 角色或目标定制
  • 条件行为(例如,用户是管理员)
<span id="__span-2-1">from langchain_core.messages import AnyMessage
<span id="__span-2-2">from langchain_core.runnables import RunnableConfig
<span id="__span-2-3">from langgraph.prebuilt import create_react_agent
<span id="__span-2-4">from langgraph.prebuilt.chat_agent_executor import AgentState
<span id="__span-2-5">
<span id="__span-2-6">def prompt(
<span id="__span-2-7">    state: AgentState,
<span id="__span-2-8">    config: RunnableConfig,
<span id="__span-2-9">) -&gt; list[AnyMessage]:
<span id="__span-2-10">    user_name = config["configurable"].get("user_name")
<span id="__span-2-11">    system_msg = f"You are a helpful assistant. User's name is {user_name}"
<span id="__span-2-12">    return [{"role": "system", "content": system_msg}] + state["messages"]
<span id="__span-2-13">
<span id="__span-2-14">agent = create_react_agent(
<span id="__span-2-15">    model="anthropic:claude-3-7-sonnet-latest",
<span id="__span-2-16">    tools=[get_weather],
<span id="__span-2-17">    prompt=prompt
<span id="__span-2-18">)
<span id="__span-2-19">
<span id="__span-2-20">agent.invoke(
<span id="__span-2-21">    ...,
<span id="__span-2-22">    config={"configurable": {"user_name": "John Smith"}}
<span id="__span-2-23">)

工具可以通过特殊参数注解访问上下文。

  • 使用 `RunnableConfig` 访问配置
  • 使用 `Annotated[StateSchema, InjectedState]` 访问代理状态

提示

这些注解可以防止 LLM 尝试填充这些值。这些参数将对 LLM 隐藏

<span id="__span-4-1">def get_user_info(
<span id="__span-4-2">    config: RunnableConfig,
<span id="__span-4-3">) -&gt; str:
<span id="__span-4-4">    """Look up user info."""
<span id="__span-4-5">    user_id = config["configurable"].get("user_id")
<span id="__span-4-6">    return "User is John Smith" if user_id == "user_123" else "Unknown user"
<span id="__span-4-7">
<span id="__span-4-8">agent = create_react_agent(
<span id="__span-4-9">    model="anthropic:claude-3-7-sonnet-latest",
<span id="__span-4-10">    tools=[get_user_info],
<span id="__span-4-11">)
<span id="__span-4-12">
<span id="__span-4-13">agent.invoke(
<span id="__span-4-14">    {"messages": [{"role": "user", "content": "look up user information"}]},
<span id="__span-4-15">    config={"configurable": {"user_id": "user_123"}}
<span id="__span-4-16">)

工具可以在执行期间更新代理的上下文(状态和长期记忆)。这对于持久化中间结果或使信息可供后续工具或提示访问非常有用。更多信息请参阅记忆指南。