主题
上下文工程是一种构建动态系统的实践,旨在以正确的格式提供正确的信息和工具,使 AI 应用程序能够完成任务。上下文可以从两个关键维度来表征:
- 按可变性:
- 静态上下文:在执行过程中不会改变的不可变数据(例如,用户元数据、数据库连接、工具)
- 动态上下文:随着应用程序运行而演变的可变数据(例如,对话历史、中间结果、工具调用观察)
- 按生命周期:
- 运行时上下文:限定于单次运行或调用的数据
- 跨对话上下文:在多次对话或会话间持久存在的数据
运行时上下文指的是本地上下文:你的代码运行所需的数据和依赖项。它不指代:
* LLM 上下文,即传递给 LLM 提示的数据。
* "上下文窗口",即可以传递给 LLM 的最大令牌数。
运行时上下文是依赖注入的一种形式,可用于优化 LLM 上下文。它允许你在运行时向工具和节点提供依赖项(如数据库连接、用户 ID 或 API 客户端),而不是硬编码它们。例如,你可以使用运行时上下文中的用户元数据来获取用户偏好,并将其输入到上下文窗口中。
LangGraph 提供了三种管理上下文的方式,结合了可变性和生命周期维度:
| 上下文类型 | 描述 | 可变性 | 生命周期 | 访问方法 |
|---|---|---|---|---|
| 静态运行时上下文 | 在启动时通过 invoke/stream 的 context 参数传递的用户元数据、工具、数据库连接 | 静态 | 单次运行 | invoke/stream 的 context 参数 |
| 动态运行时上下文(状态) | 在单次运行期间演变的可变数据 | 动态 | 单次运行 | LangGraph 状态对象 |
| 动态跨对话上下文(存储) | 跨对话共享的持久化数据 | 动态 | 跨对话 | LangGraph 存储 |
静态运行时上下文
静态运行时上下文表示不可变数据,如用户元数据、工具和数据库连接,这些数据在运行开始时通过 invoke/stream 的 context 参数传递给应用程序。这些数据在执行过程中不会改变。
python
@dataclass
class ContextSchema:
user_name: str
graph.invoke(
{"messages": [{"role": "user", "content": "hi!"}]},
context={"user_name": "John Smith"}
) Agent prompt
Workflow node
In a tool
python
from dataclasses import dataclass
from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest
@dataclass
class ContextSchema:
user_name: str
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
user_name = request.runtime.context.user_name
return f"You are a helpful assistant. Address the user as {user_name}."
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[get_weather],
middleware=[personalized_prompt],
context_schema=ContextSchema
)
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]},
context=ContextSchema(user_name="John Smith")
)详情请参阅 Agents。
Runtime 对象可用于访问静态上下文和其他实用程序,如活动存储和流写入器。 详情请参阅 Runtime 文档。
动态运行时上下文
动态运行时上下文表示在单次运行期间可以演变的可变数据,并通过 LangGraph 状态对象进行管理。这包括对话历史、中间结果以及从工具或 LLM 输出派生的值。在 LangGraph 中,状态对象在运行期间充当短期记忆。
In an agent
In a workflow
示例展示了如何将状态整合到智能体提示中。
状态也可以被智能体的工具访问,这些工具可以根据需要读取或更新状态。详情请参阅 tool calling guide。
python
from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest
from langchain.agents import AgentState
class CustomState(AgentState):
user_name: str
@dynamic_prompt
def personalized_prompt(request: ModelRequest) -> str:
user_name = request.state.get("user_name", "User")
return f"You are a helpful assistant. User's name is {user_name}"
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[...],
state_schema=CustomState,
middleware=[personalized_prompt],
)
agent.invoke({
"messages": "hi!",
"user_name": "John Smith"
})启用记忆 有关如何启用记忆的更多详细信息,请参阅 memory guide。这是一个强大的功能,允许你在多次调用之间持久化智能体的状态。否则,状态仅限定于单次运行。
动态跨对话上下文
动态跨对话上下文表示跨越多次对话或会话的持久化、可变数据,并通过 LangGraph 存储进行管理。这包括用户档案、偏好和历史交互。LangGraph 存储充当跨多次运行的长期记忆。这可用于读取或更新持久化的事实(例如,用户档案、偏好、先前的交互)。