跳到内容

上下文

上下文工程是构建动态系统的实践,这些系统以正确的格式提供正确的信息和工具,以便语言模型能够合理地完成任务。

上下文包括消息列表之外的任何可以影响行为的数据。这可以是

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

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

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

提供运行时上下文

配置 (静态上下文)

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

使用名为 "configurable" 的键指定配置,此键专为此目的保留

graph.invoke( # (1)!
    {"messages": [{"role": "user", "content": "hi!"}]}, # (2)!
    config={"configurable": {"user_id": "user_123"}} # (3)!
)
  1. 这是代理或图的调用。invoke 方法使用提供的输入运行底层图。
  2. 此示例使用消息作为输入,这很常见,但您的应用程序可能使用不同的输入结构。
  3. 这是您传递配置数据的地方。config 参数允许您提供代理在其执行期间可以使用的额外上下文。
from langchain_core.messages import AnyMessage
from langchain_core.runnables import RunnableConfig
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.prebuilt import create_react_agent

def prompt(state: AgentState, config: RunnableConfig) -> list[AnyMessage]:
    user_name = config["configurable"].get("user_name")
    system_msg = f"You are a helpful assistant. Address the user as {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(
    {"messages": [{"role": "user", "content": "what is the weather in sf"}]},
    config={"configurable": {"user_name": "John Smith"}}
)
  • 有关详细信息,请参阅代理
from langchain_core.runnables import RunnableConfig

def node(state: State, config: RunnableConfig):
    user_name = config["configurable"].get("user_name")
    ...
  • 有关详细信息,请参阅图 API
from langchain_core.runnables import RunnableConfig

@tool
def get_user_info(config: RunnableConfig) -> str:
    """Retrieve user information based on user ID."""
    user_id = config["configurable"].get("user_id")
    return "User is John Smith" if user_id == "user_123" else "Unknown user"

有关详细信息,请参阅工具调用指南

短期记忆 (可变上下文)

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

示例展示了如何将状态整合到代理提示中。

状态也可以由代理的工具访问,这些工具可以根据需要读取或更新状态。有关详细信息,请参阅工具调用指南

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): # (1)!
    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, # (2)!
    prompt=prompt
)

agent.invoke({
    "messages": "hi!",
    "user_name": "John Smith"
})
  1. 定义一个扩展 AgentStateMessagesState 的自定义状态模式。
  2. 将自定义状态模式传递给代理。这允许代理在执行期间访问和修改状态。
from typing_extensions import TypedDict
from langchain_core.messages import AnyMessage
from langgraph.graph import StateGraph

class CustomState(TypedDict): # (1)!
    messages: list[AnyMessage]
    extra_field: int

def node(state: CustomState): # (2)!
    messages = state["messages"]
    ...
    return { # (3)!
        "extra_field": state["extra_field"] + 1
    }

builder = StateGraph(State)
builder.add_node(node)
builder.set_entry_point("node")
graph = builder.compile()
  1. 定义自定义状态
  2. 在任何节点或工具中访问状态
  3. 图 API 旨在尽可能轻松地与状态配合使用。节点的返回值表示对状态的请求更新。

开启记忆

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

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

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

有关更多信息,请参阅记忆指南