跳到内容

上下文

智能体通常需要不仅仅是消息列表才能有效工作。他们需要上下文

上下文包括消息列表之外的任何可以影响智能体行为或工具执行的数据。这可以是

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

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

类型 描述 可变? 生命周期
配置 在运行开始时传递的数据 每次运行
状态 在执行期间可以改变的动态数据 每次运行或每个对话
长期记忆 (存储) 可以在对话之间共享的数据 跨对话

你可以使用上下文来

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

提供运行时上下文

当需要在运行时向智能体注入数据时使用此方法。

配置 (静态上下文)

配置用于不可变数据,例如用户元数据或 API 密钥。当你有在运行中不会改变的值时使用。

使用一个名为 "configurable" 的键来指定配置,该键是为此目的保留的

agent.invoke(
    {"messages": [{"role": "user", "content": "hi!"}]},
    config={"configurable": {"user_id": "user_123"}}
)

状态 (可变上下文)

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

class CustomState(AgentState):
    user_name: str

agent = create_react_agent(
    # Other agent parameters...
    state_schema=CustomState,
)

agent.invoke({
    "messages": "hi!",
    "user_name": "Jane"
})

开启记忆功能

请参阅记忆指南了解如何启用记忆的更多详情。这是一个强大的功能,允许你在多次调用之间持久化智能体的状态。否则,状态仅限于单个智能体运行的范围。

长期记忆 (跨对话上下文)

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

使用上下文定制提示词

提示词定义了智能体的行为方式。为了整合运行时上下文,你可以根据智能体的状态或配置动态生成提示词。

常见用例

  • 个性化
  • 角色或目标定制
  • 条件行为(例如,用户是管理员)
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"}}
)
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

class CustomState(AgentState):
    user_name: str

def prompt(
    state: CustomState
) -> list[AnyMessage]:
    user_name = state["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=[...],
    state_schema=CustomState,
    prompt=prompt
)

agent.invoke({
    "messages": "hi!",
    "user_name": "John Smith"
})

在工具中访问上下文

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

  • 使用 RunnableConfig 进行配置访问
  • 使用 Annotated[StateSchema, InjectedState] 获取智能体状态

提示

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

def get_user_info(
    config: RunnableConfig,
) -> str:
    """Look up user info."""
    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"}}
)
from typing import Annotated
from langgraph.prebuilt import InjectedState

class CustomState(AgentState):
    user_id: str

def get_user_info(
    state: Annotated[CustomState, InjectedState]
) -> str:
    """Look up user info."""
    user_id = state["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],
    state_schema=CustomState,
)

agent.invoke({
    "messages": "look up user information",
    "user_id": "user_123"
})

从工具更新上下文

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

评论