上下文工程是指构建动态系统的实践,这些系统能够以正确的格式提供适当的信息和工具,从而使人工智能应用能够完成任务。上下文可以沿着两个关键维度进行描述:
通过 可变性:
- 静态上下文:在执行过程中不发生变化的不可变数据(例如,用户元数据、数据库连接、工具)
- 动态上下文:随着应用程序运行而演变的可变数据(例如,对话历史、中间结果、工具调用观察)
- 通过 生命周期:
- 运行时上下文:数据范围限于单个运行或调用
- 跨对话上下文:跨越多个对话或会话持续存在的数据
运行时上下文指的是局部上下文:您的代码运行所需的 数据和依赖项。它 不 指的是:
- LLM上下文,即传递给LLM提示的数据。
- “上下文窗口”,即可以传递给LLM的最大令牌数。
运行时上下文可用于优化LLM上下文。例如,您可以使用运行时上下文中的用户元数据来获取用户偏好并将其输入到上下文窗口中。
LangGraph提供了三种管理上下文的方法,这些方法结合了可变性和生命周期维度:
| 上下文类型 | 描述 | 可变性 | 生命周期 | 访问方法 |
| 静态运行时上下文 | 用户元数据、工具、数据库连接在启动时传递 | 静态 | 单次运行 | context 参数传递给 invoke/stream |
| 动态运行时上下文(状态) | 在单次运行期间演变的可变数据 | 动态 | 单次运行 | LangGraph 状态对象 |
| 动态跨对话上下文(存储) | 在对话之间共享的持久数据 | 动态 | 跨对话 | LangGraph 存储 |
静态运行时上下文
静态运行时上下文表示在运行开始时通过invoke/stream的context参数传递给应用程序的不可变数据,如用户元数据、工具和数据库连接。这些数据在执行期间不会发生变化。
@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
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="anthropic:claude-sonnet-4-5",
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")
)
See Agents for details.from langgraph.runtime import Runtime
def node(state: State, runtime: Runtime[ContextSchema]):
user_name = runtime.context.user_name
...
from langchain.tools import tool, ToolRuntime
@tool
def get_user_email(runtime: ToolRuntime[ContextSchema]) -> str:
"""Retrieve user information based on user ID."""
# simulate fetching user info from a database
email = get_user_email_from_db(runtime.context.user_name)
return email
查看工具调用指南获取详细信息。
可以使用 Runtime 对象来访问静态上下文以及其他实用工具,如活动存储和流写入器。
有关详细信息,请参阅 @[Runtime][langgraph.runtime.Runtime] 文档。
动态运行时上下文
动态运行时上下文表示在单次运行过程中可以演变的数据,通过LangGraph状态对象进行管理。这包括对话历史、中间结果以及来自工具或LLM输出的派生值。在LangGraph中,状态对象在运行期间充当短期记忆。
In an agent
In a workflow
示例展示了如何将状态融入智能体 提示 中。状态也可以通过智能体的工具访问,这些工具可以根据需要读取或更新状态。有关详细信息,请参阅工具调用指南。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="anthropic:claude-sonnet-4-5",
tools=[...],
state_schema=CustomState,
middleware=[personalized_prompt],
)
agent.invoke({
"messages": "hi!",
"user_name": "John Smith"
})
from typing_extensions import TypedDict
from langchain.messages import AnyMessage
from langgraph.graph import StateGraph
class CustomState(TypedDict):
messages: list[AnyMessage]
extra_field: int
def node(state: CustomState):
messages = state["messages"]
...
return {
"extra_field": state["extra_field"] + 1
}
builder = StateGraph(State)
builder.add_node(node)
builder.set_entry_point("node")
graph = builder.compile()
开启记忆功能
请参阅记忆指南以获取有关如何启用记忆的更多详细信息。这是一个强大的功能,允许您在多次调用之间持久化智能体的状态。否则,状态仅限于单次运行。
动态跨对话上下文
动态跨对话上下文表示跨越多个对话或会话的持久、可变数据,通过LangGraph存储进行管理。这包括用户资料、偏好和历史交互。LangGraph存储充当长期记忆,跨越多个运行。这可以用来读取或更新持久事实(例如,用户资料、偏好、先前交互)。