Skip to content

Memory 与 State

Memory 解决的是“应用是否记得之前发生了什么”。它不是让模型拥有永久记忆,而是应用把需要保留的信息保存下来,并在合适的时候放回上下文。

两类记忆

类型范围典型内容
Short-term memory单个 thread当前对话消息、工具结果、中间状态
Long-term memory跨 thread/session用户偏好、长期事实、历史记录

短期记忆偏向会话状态,长期记忆偏向用户或业务数据。

Short-term Memory

LangChain agent 通过 checkpointer 保存 thread 状态。调用时用 thread_id 区分不同会话。

ts
import { createAgent } from 'langchain';
import { MemorySaver } from '@langchain/langgraph';

const agent = createAgent({
  model: 'openai:<model-name>',
  tools: [],
  checkpointer: new MemorySaver(),
});

await agent.invoke(
  {
    messages: [{ role: 'user', content: '我叫 Renouc。' }],
  },
  {
    configurable: { thread_id: 'thread_1' },
  },
);

生产环境不要用内存保存关键状态,应换成数据库 backed checkpointer。

Long-term Memory

长期记忆通过 store 保存跨会话数据。常见做法是按用户或租户组织 namespace。

ts
import { createAgent, tool, type ToolRuntime } from 'langchain';
import { InMemoryStore } from '@langchain/langgraph';
import * as z from 'zod';

const contextSchema = z.object({
  userId: z.string(),
});

const savePreference = tool(
  async (
    { style },
    runtime: ToolRuntime<unknown, z.infer<typeof contextSchema>>,
  ) => {
    await runtime.store.put(['preferences'], runtime.context.userId, { style });
    return 'Preference saved.';
  },
  {
    name: 'save_preference',
    description: 'Save user response style preference.',
    schema: z.object({
      style: z.string(),
    }),
  },
);

const agent = createAgent({
  model: 'openai:<model-name>',
  tools: [savePreference],
  contextSchema,
  store: new InMemoryStore(),
});

长期记忆应只保存稳定、可解释、可删除的信息。不要把完整聊天记录无差别写入长期记忆。

上下文控制

记忆最终还是要进入模型上下文,因此必须控制长度和质量。

常见策略:

  • 只保留最近 N 轮消息
  • 对早期消息做摘要
  • 按当前问题检索相关记忆
  • 对写入长期记忆的内容做 schema 校验

关键结论

  • Memory 是应用状态,不是模型能力。
  • short-term memory 用于恢复当前 thread。
  • long-term memory 用于跨会话保存稳定信息。
  • 进入模型上下文的记忆越多,越需要筛选、压缩和校验。

参考: