上下文工程 是构建动态系统的一种实践,旨在以恰当的格式提供正确的信息和工具,从而使 AI 应用能够完成特定任务。上下文可从两个关键维度进行描述:
- 按 可变性:
- 静态上下文:在执行期间不会改变的不可变数据(例如用户元数据、数据库连接、工具)
- 动态上下文:随应用运行而不断变化的可变数据(例如对话历史、中间结果、工具调用观察)
- 按 生命周期:
- 运行时上下文:作用域限定于单次运行或调用的数据
- 跨会话上下文:在多个对话或会话间持续存在的数据
运行时上下文指的是本地上下文:即代码运行所需的各类数据与依赖项。它不指代:
- LLM 上下文,即传递给 LLM 提示词的数据。
- “上下文窗口”,即可以传递给 LLM 的最大 token 数量。
运行时上下文可用于优化 LLM 上下文。例如,你可以使用运行时上下文中的用户元数据来获取用户偏好,并将其输入到上下文窗口中。
LangGraph 提供了三种管理上下文的方式,结合了可变性和生命周期两个维度:
| 上下文类型 | 描述 | 可变性 | 生命周期 | 访问方法 |
|---|
| 静态运行时上下文 | 启动时传入的用户元数据、工具、数据库连接 | 静态 | 单次运行 | invoke/stream 的 context 参数 |
| 动态运行时上下文(状态) | 在单次运行期间演变的可变数据 | 动态 | 单次运行 | LangGraph 状态对象 |
| 动态跨会话上下文(存储) | 跨多个对话共享的持久化数据 | 动态 | 跨会话 | LangGraph 存储 |
静态运行时上下文
静态运行时上下文 表示通过 invoke/stream 方法的 context 参数在运行开始时传入的不可变数据,如用户元数据、工具和数据库连接。这些数据在执行过程中不会发生变化。
@dataclass
class ContextSchema:
user_name: str
graph.invoke( # (1)!
{"messages": [{"role": "user", "content": "hi!"}]}, # (2)!
context={"user_name": "John Smith"} # (3)!
)
- 这是代理或图的调用。
invoke 方法使用提供的输入运行底层图。
- 此示例使用消息作为输入,这是常见做法,但您的应用程序可能采用不同的输入结构。
- 在此处传入运行时数据。
context 参数允许您提供代理在执行期间可以使用的额外依赖项。
from langchain_core.messages import AnyMessage
from langgraph.runtime import get_runtime
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.prebuilt import create_react_agent
def prompt(state: AgentState) -> list[AnyMessage]:
runtime = get_runtime(ContextSchema)
system_msg = f"You are a helpful assistant. Address the user as {runtime.context.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,
context_schema=ContextSchema
)
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]},
context={"user_name": "John Smith"}
)
Runtime 对象可用于访问静态上下文及其他实用工具,如活动存储和流写入器。
详情请参阅 [Runtime][langgraph.runtime.Runtime] 文档。
动态运行时上下文
动态运行时上下文 表示在单次运行期间可演变的可变数据,通过 LangGraph 状态对象进行管理。这包括对话历史、中间结果以及从工具或 LLM 输出派生的值。在 LangGraph 中,状态对象在运行期间充当短期记忆。
示例展示了如何将状态整合进代理的提示词中。状态也可由代理的工具访问,工具可根据需要读取或更新状态。详情请参阅 工具调用指南。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"
})
- 定义一个扩展
AgentState 或 MessagesState 的自定义状态模式。
- 将自定义状态模式传递给代理。这样代理便可在执行期间访问并修改状态。
启用记忆功能
有关如何启用记忆功能的更多详细信息,请参阅 记忆指南。这是一个强大的功能,允许您在多次调用之间持久化代理的状态。否则,状态的作用域仅限于单次运行。
动态跨会话上下文
动态跨会话上下文 表示跨越多个对话或会话的持久化可变数据,通过 LangGraph 存储进行管理。这包括用户档案、偏好设置和历史交互记录。LangGraph 存储在多次运行中充当长期记忆。可用于读取或更新持久性事实(例如用户档案、偏好、先前交互)。