上下文工程 是构建动态系统的实践,这些系统以正确的格式提供正确的信息和工具,使 AI 应用程序能够完成任务。上下文可以沿两个关键维度进行表征:
1. By **可变性**: * **静态上下文**:在执行期间不会改变的不可变数据(例如,用户元数据、数据库连接、工具) * **动态上下文**:随应用程序运行而演变的可变数据(例如,对话历史、中间结果、工具调用观察) 2. By **生命周期**: * **运行时上下文**:限定于单次运行或调用的数据 * **跨对话上下文**:在多个对话或会话之间持续存在的数据
LangGraph 提供了三种管理上下文的方式,这些方式结合了可变性和生命周期的维度:
| 上下文类型 | 描述 | 可变性 | 生命周期 |
|---|---|---|---|
| **配置** | 运行开始时传入的数据 | 静态 | 单次运行 |
| **动态运行时上下文(状态)** | 单次运行中可变化的mutable数据 | 动态 | 单次运行 |
| **动态跨对话上下文(存储)** | 跨对话共享的持久数据 | 动态 | 跨对话 |
配置
配置用于不可变的数据,如用户元数据或 API 密钥。当您的值在运行期间不会变化时使用此功能。
使用名为 **"configurable"** 的键来指定配置,这是为此目的保留的。
await graph.invoke(
{ messages: [{ role: "user", content: "hi!" }] },
{ configurable: { user_id: "user_123" } } // [!code highlight]
);
动态运行时上下文
动态运行时上下文 表示在单次运行中可变化的mutable数据,通过 LangGraph 状态对象进行管理。这包括对话历史、中间结果以及从工具或 LLM 输出中获取的值。在 LangGraph 中,状态对象充当运行期间的 短期记忆 。
In an agent
示例展示了如何将状态整合到智能体的 **提示词**.
状态也可以由智能体的 **工具**访问,这些工具可以根据需要读取或更新状态。请参阅 工具调用指南 了解更多详情。
const CustomState = z.object({ // [!code highlight]
userName: z.string(),
});
const personalizedPrompt = createMiddleware({ // [!code highlight]
name: "PersonalizedPrompt",
stateSchema: CustomState,
wrapModelCall: (request, handler) => {
const userName = request.state.userName || "User";
const systemPrompt = `You are a helpful assistant. User's name is ${userName}`;
return handler({ ...request, systemPrompt });
},
});
const agent = createAgent({ // [!code highlight]
model: "claude-sonnet-4-6",
tools: [/* your tools here */],
middleware: [personalizedPrompt] as const, // [!code highlight]
});
await agent.invoke({
messages: [{ role: "user", content: "hi!" }],
userName: "John Smith",
});
In a workflow
const CustomState = new StateSchema({ // [!code highlight]
messages: MessagesValue,
extraField: z.number(),
});
const builder = new StateGraph(CustomState)
.addNode("node", async (state) => { // [!code highlight]
const messages = state.messages;
// ...
return { // [!code highlight]
extraField: state.extraField + 1,
};
})
.addEdge(START, "node");
const graph = builder.compile();
动态跨对话上下文
动态跨对话上下文 表示跨多个对话或会话持久存在、可变化的数据,通过 LangGraph 存储进行管理。这包括用户画像、偏好设置和历史交互记录。LangGraph 存储充当 长期记忆 跨多次运行。这可用于读取或更新持久化事实(例如,用户档案、偏好设置、先前交互)。