上下文工程是构建动态系统的实践:以正确的格式提供正确的信息和工具,让 AI 应用能够完成任务。上下文可以沿两个关键维度来描述:
  1. 可变性
    • 静态上下文:执行期间不会改变的不可变数据,例如用户元数据、数据库连接和工具
    • 动态上下文:随着应用运行而演变的可变数据,例如对话历史、中间结果和工具调用观察结果
  2. 生命周期
    • 运行时上下文:作用域限定在单次运行或调用内的数据
    • 跨对话上下文:跨多次对话或会话持久保存的数据
运行时上下文指本地上下文,即代码运行所需的数据和依赖项。它不是指:
  • LLM 上下文,即传入 LLM prompt 的数据。
  • “上下文窗口”,即可以传给 LLM 的最大 token 数量。
运行时上下文用于在 agent 中传递数据。相比把内容存储在全局状态中,你可以把数据库连接、用户会话或配置等值附加到上下文,并在工具和 middleware 内访问它们。这会让内容保持无状态、可测试且可复用。例如,你可以使用运行时上下文中的用户元数据来获取用户偏好,并将其传入上下文窗口。
LangGraph 提供三种管理上下文的方式,它们组合了可变性和生命周期这两个维度:
上下文类型描述可变性生命周期
Config运行开始时传入的数据静态单次运行
动态运行时上下文(state)单次运行期间不断演变的可变数据动态单次运行
动态跨对话上下文(store)跨对话共享的持久数据动态跨对话

Config

Config 用于用户元数据或 API key 等不可变数据。当你拥有运行期间不会改变的值时,请使用它。 使用名为 “configurable” 的 key 指定配置。该 key 专门保留用于此目的。
await graph.invoke(
  { messages: [{ role: "user", content: "hi!" }] },
  { configurable: { user_id: "user_123" } }
);

动态运行时上下文

动态运行时上下文表示可以在单次运行期间演变的可变数据,并通过 LangGraph state 对象进行管理。这包括对话历史、中间结果,以及从工具或 LLM 输出派生的值。在 LangGraph 中,state 对象会在一次运行期间充当短期记忆
示例展示如何将 state 纳入 agent promptAgent 的工具也可以访问 state,并根据需要读取或更新 state。参阅工具调用指南了解详情。
import { createAgent, createMiddleware } from "langchain";
import type { AgentState } from "langchain";
import * as z from "zod";

const CustomState = z.object({
  userName: z.string(),
});

const personalizedPrompt = createMiddleware({
  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({
  model: "claude-sonnet-4-6",
  tools: [/* your tools here */],
  middleware: [personalizedPrompt] as const,
});

await agent.invoke({
  messages: [{ role: "user", content: "hi!" }],
  userName: "John Smith",
});
开启 memory 请参阅 memory 指南,了解如何启用 memory。这是一项强大功能,允许你跨多次调用持久保存 agent 的 state。否则,state 只会作用于单次运行。

动态跨对话上下文

动态跨对话上下文表示跨多次对话或会话存在的持久可变数据,并通过 LangGraph store 进行管理。这包括用户资料、偏好和历史交互。LangGraph store 会在多次运行之间充当长期记忆。它可用于读取或更新持久事实,例如用户资料、偏好和先前交互。

延伸阅读