Doramagic 项目包 · 项目说明书

langmem 项目

LangMem 帮助智能体从持续交互中学习并不断自我适应。

LangMem 概述与系统架构

LangMem 是一个面向长期记忆管理与持续学习的智能体工具库,旨在让 Agent 通过历史交互不断学习、适配并提升表现。根据 README.md 的描述,其目标包含三层:

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 3.1 知识提取与长期记忆(knowledge)

继续阅读本节完整说明和来源证据。

章节 3.2 提示词优化(prompts)

继续阅读本节完整说明和来源证据。

章节 3.3 短期记忆管理(shortterm)

继续阅读本节完整说明和来源证据。

1. 项目定位与核心价值

LangMem 是一个面向长期记忆管理与持续学习的智能体工具库,旨在让 Agent 通过历史交互不断学习、适配并提升表现。根据 README.md 的描述,其目标包含三层:

  1. 抽取关键信息:从对话中提炼出结构化知识。
  2. 优化 Agent 行为:通过提示词迭代改进决策质量。
  3. 维护长期记忆:跨会话保持一致行为。

库的设计遵循"双轨"原则:既提供与任意存储系统配合的函数式原语(functional primitives),也提供与 LangGraph 存储层深度集成的组件 README.md。这种设计使 LangMem 既可作为独立模块嵌入已有框架,又可借助 LangGraph Platform 的托管能力开箱即用。

主要特性概览 README.md:

  • 🧩 Core Memory API:通用存储无关的内存接口。
  • 🧠 Memory Management Tools:Agent 在主路径(hot path)中用于记录与检索的工具。
  • ⚙️ Background Memory Manager:自动抽取、合并与更新 Agent 知识。
  • Native LangGraph Integration:在 LangGraph Platform 部署中默认启用长期记忆存储。

2. 系统架构总览

顶层包入口 src/langmem/__init__.py 集中导出了三大能力:知识管理(create_memory_managercreate_memory_store_managercreate_manage_memory_toolcreate_search_memory_toolcreate_thread_extractor)、提示词优化(create_multi_prompt_optimizercreate_prompt_optimizerPrompt)以及反思执行器(ReflectionExecutor)。其架构关系如下图:

graph TD
    A[Agent / 应用入口] --> B[short_term<br/>短期记忆]
    A --> C[knowledge<br/>长期记忆抽取]
    A --> D[prompts<br/>提示词优化]
    A --> E[reflection<br/>反思执行器]

    B -->|summarize_messages<br/>SummarizationNode| F[LangGraph 状态]
    C -->|create_memory_store_manager| G[BaseStore<br/>语义存储]
    C -->|create_manage_memory_tool<br/>create_search_memory_tool| G
    D -->|metaprompt / gradient| H[优化后的 Prompt]
    E -->|ReflectionExecutor| I[经验回放]

四大子模块协同工作:短期记忆压缩上下文、知识模块沉淀长期事实、提示词优化器基于反馈迭代策略、反思器串起"评估—更新"循环。

3. 核心模块详解

3.1 知识提取与长期记忆(knowledge)

langmem.knowledge 子包同时提供函数式状态式两种接口 src/langmem/knowledge/__init__.py:

  • create_memory_manager(model, schemas=None):返回基于 schema 的结构化抽取器,输入消息列表与既有记忆,返回 [(namespace, Memory), ...] 的更新列表。
  • create_memory_store_manager(model, store=None):把抽取结果直接写入 LangGraph 的 BaseStore,完成"抽取即存储"。
  • create_thread_extractor(model, schema=None):将一段对话总结为带 titlesummary 的结构化记录,底层依赖 trustcall.create_extractor 调用工具 src/langmem/knowledge/extraction.py。
  • create_manage_memory_tool / create_search_memory_tool:暴露为 LangGraph 工具,Agent 能在主动推理路径上增删改查记忆 src/langmem/knowledge/tools.py。

MemoryPhase 枚举用于标注抽取阶段(如观察、反思、整合),从而支持多阶段提取流水线 src/langmem/knowledge/__init__.py。

3.2 提示词优化(prompts)

prompts 子包围绕 Prompt TypedDict 构建 src/langmem/prompts/types.py:nameprompt 为必填字段,update_instructionswhen_to_update 用于控制何时/如何更新。AnnotatedTrajectory 则把对话历史与开发者反馈封装为优化器的输入。

两类优化策略 src/langmem/prompts/optimization.py:

  • Metaprompt Optimizer:基于元提示的多轮反思,默认 max_reflection_steps=5min_reflection_steps=1,由 src/langmem/prompts/metaprompt.py 实现 DEFAULT_METAPROMPT 模板。
  • Gradient Optimizer:先诊断失败假设,再生成最小侵入式编辑建议,模板见 src/langmem/prompts/gradient.py。
  • Multi-Prompt Optimizer:当存在多个相互依赖的 Prompt(通过 when_to_update 串联)时统一优化。

为了让 f-string 变量在优化过程中不被破坏,get_prompt_extraction_schema 会扫描原始 prompt 中所有 {var} 并在 schema 中要求保留 src/langmem/prompts/utils.py。

3.3 短期记忆管理(short_term)

当对话历史逼近模型上下文上限时,需要压缩而非丢弃。short_term.summarization 暴露 summarize_messagesasummarize_messages 函数与 SummarizationNode LangGraph 节点 src/langmem/short_term/__init__.py。核心参数见 src/langmem/short_term/summarization.py:

参数作用默认/说明
max_tokens输出最终消息列表的最大 token 数在摘要生成后强制截断
max_tokens_before_summary触发摘要的累计 token 阈值默认同 max_tokens
max_summary_tokens摘要允许占用的预算仅用于估算,不传给 LLM
token_counter消息 token 计数函数默认近似计数,可换 model.get_num_tokens_from_messages
initial_summary_prompt / existing_summary_prompt / final_prompt三段式提示模板分别覆盖首次生成、增量更新、最终合成

RunningSummarySummarizationResult 数据类分别追踪已摘要消息 ID 与输出消息列表,确保重复调用不会重复摘要 src/langmem/short_term/summarization.py。

3.4 反思与图编排(reflection / graphs)

顶层导出的 ReflectionExecutor 提供"经验回放式"反思能力 src/langmem/__init__.py。在 src/langmem/graphs/prompts.py](https://github.com/langchain-ai/langmem/blob/7d4fd50f412042995acb9517d793559204258ccf/src/langmem/graphs/prompts.py) 中,预置了一个 LangGraph StateGraph:输入 InputState(prompts, threads),节点 optimize 会根据 configurable.kindgradient / metaprompt 之间切换,并在只有一个 Prompt 且无 when_to_update 时退化为单 Prompt 优化器,输出 OutputState.updated_prompts`。

4. 端到端数据流与典型用法

以"主动记忆 Agent"为例,典型数据流为:

  1. 用户交互 进入 LangGraph 状态。
  2. 短期层 SummarizationNode 在 token 溢出前对历史做摘要,保持状态紧凑 src/langmem/short_term/summarization.py。
  3. Agent 主路径 通过 create_manage_memory_toolcreate_search_memory_tool 即时写入或检索记忆 src/langmem/knowledge/tools.py。
  4. 后台 create_memory_store_manager 异步抽取新事实并合并到 BaseStore src/langmem/knowledge/extraction.py。
  5. 离线评估 create_prompt_optimizer 基于 AnnotatedTrajectory 反馈迭代 Prompt src/langmem/prompts/optimization.py。
  6. 反思闭环 ReflectionExecutor 把优化后的 Prompt 重新部署到 Agent,形成持续学习回路。

无需 LangGraph 时,可在独立脚本中使用自定义存储后端 examples/standalone_examples/README.md,例如 custom_store_example.py 展示了在 LangGraph 上下文之外接入 LangMem 的方式。

5. 常见注意事项

  • schema 必填字段:自定义 Pydantic schema 时需在 json_schema_extra 中保留 required 列表,工具层通过 _ensure_schema_contains_required 自动补齐 src/langmem/knowledge/tools.py。
  • f-string 变量保留:调用 get_prompt_extraction_schema 后再优化,可防止提示词中的 {var} 被 LLM 改写为非法模板 src/langmem/prompts/utils.py。
  • 存储获取失败:在 LangGraph 运行时若取不到 BaseStore_get_store 会抛出 errors.ConfigurationError,提示需要传入 store= 或处于 LangGraph 上下文内 src/langmem/knowledge/tools.py。
  • 依赖 LangSmith:优化与反思流程使用了 @langsmith.traceable(如 ls 模块)作为可观测性后置,需要在生产中配置 LangSmith。

See Also

  • LangMem Knowledge Extraction Reference
  • LangMem Prompt Optimizers Reference
  • LangMem Short-Term Summarization Reference
  • LangGraph Long-term Memory Store Documentation

来源:https://github.com/langchain-ai/langmem / 项目说明书

长期记忆管理:提取、工具与后台管理器

langmem.knowledge 子包为长期记忆(Long-term Memory)提供了一组完整的功能层,覆盖了从对话中提取结构化摘要、写入可检索的存储,以及以 LangGraph 工具的形式暴露给智能体调用的全部环节。该模块被设计为与 LangGraph 的 BaseStore 紧密集成,可按用户命名空间(namespace)持久化语义、过程和情节记忆,从而支持"终身...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

langmem.knowledge 子包为长期记忆(Long-term Memory)提供了一组完整的功能层,覆盖了从对话中提取结构化摘要、写入可检索的存储,以及以 LangGraph 工具的形式暴露给智能体调用的全部环节。该模块被设计为与 LangGraph 的 BaseStore 紧密集成,可按用户命名空间(namespace)持久化语义、过程和情节记忆,从而支持"终身学习"型智能体。

模块对外导出的核心入口共六个:create_memory_managercreate_memory_store_managercreate_thread_extractorcreate_manage_memory_toolcreate_search_memory_toolMemoryPhase(src/langmem/knowledge/__init__.py:9-19)。在 langmem 顶层 __init__.py 中,它们与提示优化器一同被再导出(src/langmem/__init__.py:2-23),形成统一的公共 API。

结构化提取:create_thread_extractor

create_thread_extractor 负责把一段对话消息流压缩成由 Pydantic 模型约束的结构化输出(如默认的 SummarizeThread,包含 titlesummary)。其内部基于 trustcall.create_extractor 配合 tool_choice="any" 实现"工具式"的结构化生成,并以 ChatPromptTemplate 注入 system 与 user 两段指令(src/langmem/knowledge/extraction.py 中的 create_thread_extractor 实现)。

函数提供了两种重载:未指定 schema 时返回 Runnable[MessagesState, SummarizeThread];指定时返回 Runnable[MessagesState, S]。返回值是一个 merge_messages | template | extractor | (lambda out: out["responses"][0]) 链,并通过 .with_config({"run_name": "thread_extractor"}) 显式命名以便 LangSmith 追踪。

典型调用方式如下:

from langmem import create_thread_extractor
summarizer = create_thread_extractor("gpt-4")
summary = await summarizer.ainvoke({"messages": messages})
print(summary.title, summary.summary)

merge_messages 辅助函数通过 utils.get_conversation 把消息列表渲染为字符串,并把其它键透传,与 system 模板中的 {conversation} 占位符对接。

后台存储管理:MemoryStoreManager

对于需要持续累积、增量更新的场景,模块提供了 MemoryStoreManager 类,它是一个 Runnable[MemoryStoreManagerInput, list[dict]],可在节点级别直接被 LangGraph 工作流调用。其关键设计要点(src/langmem/knowledge/extraction.py)包括:

  • 阶段化处理MemoryPhase TypedDict 允许按 instructionsinclude_messagesenable_insertsenable_deletes 等维度配置不同处理阶段,实现"提取—清理—整合"的流水线。
  • 命名空间隔离:默认 namespace=("memories", "{langgraph_user_id}"),可被 get_store() 与配置注入的 user_id 模板替换,做到按用户的多租户记忆隔离。
  • 可插拔查询模型query_modelquery_limit 决定了在写入前如何从已有记忆中检索相关上下文,为模型"对比 & 更新"提供依据。
  • 运行时配置MemoryStoreManagerInput 显式声明了 messages: list[AnyMessage]max_steps: int,与 LangGraph 节点的状态保持一致。

注入给 LLM 的核心指令 _MEMORY_INSTRUCTIONS 描述了三步策略:提取并上下文化、对比并更新(去重、压缩、置信度标注)、综合并推理,目标是最大化信噪比(SNR)并保持记忆内部一致性。

工具层:manage / search Memory Tool

为了让 LangGraph 智能体(特别是 create_react_agent)直接调用记忆能力,tools.py 提供了 create_manage_memory_toolcreate_search_memory_tool 两个 StructuredTool(src/langmem/knowledge/tools.py)。它们的实现细节包含:

  • _get_store:优先使用调用者传入的 BaseStore,否则回退到 LangGraph 上下文中的 get_store(),并在 RuntimeError 时转换为 errors.ConfigurationError
  • _ensure_json_serializable:对原生类型直接放行,对具备 model_dump(mode="json") 的 Pydantic 模型调用序列化方法,否则降级为 str(),确保存储的 value 是 JSON 兼容的。
  • _ToolWithRequired:继承 StructuredTool 并覆写 tool_call_schema,强制把生成的 JSON Schema 注入 "required": [],避免工具描述中因缺字段导致 LLM 调用失败。
  • 搜索工具的描述description 模板固定以 "Search your long-term memories for information relevant to your current context." 开头,并把 instructions 拼到尾部,使 LLM 看到一段清晰的调用目的说明。

一个完整的预构建 ReAct 集成示例展示了:先在 prompt 节点用 get_store().search 把相关记忆塞入 system prompt,再把 create_manage_memory_tool 注册为 tools 列表的一员(src/langmem/knowledge/tools.py 中的 docstring 案例)。这使得智能体既能"读"记忆,也能"写"记忆。

架构与数据流

下图概括了从原始对话到持久化记忆的完整路径:提取器、存储管理器和工具层围绕 BaseStore 形成可组合的管线。

flowchart LR
    A[MessagesState] --> B[create_thread_extractor]
    B --> C[Structured Summary]
    A --> D[MemoryStoreManager]
    D --> E[phase: 提取/更新]
    E --> F[BaseStore]
    A --> G[manage_memory_tool]
    A --> H[search_memory_tool]
    H --> F
    G --> F
    F --> I[(namespace: memories/user_id)]

失败模式与最佳实践

  • 存储未配置:当 _get_store 在没有 LangGraph 运行上下文且未显式传参时,会抛出 ConfigurationError;解决办法是在编译图时显式传入 store=BaseStore(...)
  • Schema 不可序列化:当 manage_memory_tool 写入的 Pydantic 模型缺少 model_dump 或不支持 JSON 模式时,_ensure_json_serializable 会记录错误并以字符串形式存储,影响后续检索——建议为自定义 Schema 提供稳定的 JSON 编码器。
  • 阶段控制:若不希望自动删除或覆盖旧记忆,可通过 phases 显式关闭 enable_deletes,避免误删关键事实。

See Also

  • src/langmem/short_term/summarization.py:短期消息摘要(上下文窗口压缩),可与本模块的长期记忆串联使用。
  • src/langmem/prompts/optimization.py:提示词优化器,可在长期记忆抽取策略上进一步迭代。

来源:https://github.com/langchain-ai/langmem / 项目说明书

提示词优化与反思系统

langmem 的提示词优化与反思系统提供了一套自动化机制,用于基于历史对话轨迹和反馈信号持续改进代理或助手的提示词(Prompt)。该系统的核心入口是 createpromptoptimizer 工厂函数,支持三种优化策略:gradient、promptmemory 与 metaprompt,每种策略在复杂度、可解释性与运行成本之间提供不同权衡。资料来源:[src/lan...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Gradient 优化器

继续阅读本节完整说明和来源证据。

章节 Metaprompt 优化器

继续阅读本节完整说明和来源证据。

章节 Prompt Memory 优化器

继续阅读本节完整说明和来源证据。

概述

langmem 的提示词优化与反思系统提供了一套自动化机制,用于基于历史对话轨迹和反馈信号持续改进代理或助手的提示词(Prompt)。该系统的核心入口是 create_prompt_optimizer 工厂函数,支持三种优化策略:gradientprompt_memorymetaprompt,每种策略在复杂度、可解释性与运行成本之间提供不同权衡。资料来源:src/langmem/prompts/optimization.py

flowchart LR
    A[历史对话轨迹] --> B[create_prompt_optimizer]
    C[更新指令] --> B
    D[当前 Prompt] --> B
    B --> E{优化策略}
    E --> F[gradient]
    E --> G[metaprompt]
    E --> H[prompt_memory]
    F --> I[改进后的 Prompt]
    G --> I
    H --> I

优化策略

Gradient 优化器

gradient 策略将"识别问题"与"提出修改建议"两个步骤分离:先用评分 Prompt 找出失败模式,再使用 Meta-Prompt 给出最小侵入的修改。DEFAULT_GRADIENT_PROMPT 指示模型评估助手的有效性、识别偏差并聚焦具体失败模式(如风格不匹配、推理缺陷或幻觉);只有当确实存在性能下降证据时才建议更新,否则直接输出原始 Prompt。DEFAULT_GRADIENT_METAPROMPT 则给出明确的修改指引,避免泛化修改。资料来源:src/langmem/prompts/gradient.py

Metaprompt 优化器

metaprompt 策略在单次 LLM 调用内执行多步骤反思。MetapromptOptimizerConfig(TypedDict)提供三个字段:metaprompt(元提示模板)、max_reflection_steps(默认 5)与 min_reflection_steps(默认 1),用于控制反思深度。DEFAULT_METAPROMPT 强制要求保留原始 Prompt 中的 f-string 变量(如 {variable_name}),从而避免优化过程中破坏模板结构。资料来源:src/langmem/prompts/metaprompt.py

Prompt Memory 优化器

prompt_memory 是最简单的单次元提示(metaprompt)策略,不需要额外配置即可从对话历史中提取成功模式并应用到新提示。它适合快速原型或低风险场景。资料来源:src/langmem/prompts/optimization.py

反思机制

MetapromptOptimizer__init__ 中通过 create_extractor(model, tools=[self.think, self.critique], tool_choice="any") 初始化反思链(reflect_chain),并要求模型在每次反思中至少调用一次 thinkcritique 工具。两个工具的返回值均为空字符串,仅作"思考锚点"驱动结构化推理。ainvokeinvoke 方法使用 langsmith.trace 记录调用,标签为 kind: metaprompt,便于事后审计与回放。资料来源:src/langmem/prompts/metaprompt.py

类型与数据模型

  • Prompt(TypedDict,必填 nameprompt,可选 update_instructionswhen_to_update):表示待优化的提示词及优化元信息。资料来源:src/langmem/prompts/types.py
  • AnnotatedTrajectory(NamedTuple):封装对话历史(消息列表)与可选反馈,是优化器的输入单元。
  • GradientOptimizerConfigMetapromptOptimizerConfig:分别用于控制两种策略的子配置。
  • MemoryPhase / MemoryStoreManager:在知识抽取场景下协调更新阶段(详见 src/langmem/knowledge/extraction.py),与提示词优化系统配合使用。

变量保留机制

get_prompt_extraction_schema 会扫描原始 Prompt 中所有的 f-string 变量(如 {variable}),生成带有 OptimizedPromptOutput Pydantic 模型的输出 schema,并在 validate_input_variables 模型验证器中通过 get_var_healer 自动恢复被模型无意删除或修改的占位符,从而确保输出始终保留原始输入变量。该机制与 metaprompt 策略中的变量保护要求相辅相成。资料来源:src/langmem/prompts/utils.py

使用示例

最常见的调用形式为:

from langmem import create_prompt_optimizer

optimizer = create_prompt_optimizer("anthropic:claude-3-5-sonnet-latest")

trajectories = [(conversation, feedback)]
better_prompt = await optimizer.ainvoke(
    {"trajectories": trajectories, "prompt": "You are an astronomy expert"}
)

若选择 metaprompt 策略并需要限定反思步数,可使用:

optimizer = create_prompt_optimizer(
    model, kind="metaprompt",
    config={"max_reflection_steps": 3, "min_reflection_steps": 1},
)

create_prompt_optimizer 通过 @typing.overload 装饰器为不同策略提供精确的返回类型推导:在默认情况下返回 Runnable[OptimizerInput, str],调用方既可同步 invoke 也可异步 ainvoke。资料来源:src/langmem/prompts/optimization.py

失败模式与注意事项

  • 当 Prompt 中包含 f-string 变量时,需确认优化器能够保留全部变量;否则模板将无法正常渲染。
  • metaprompt 策略的反思步数若设过小,可能导致模型跳过对失败模式的深度分析;若设过大,则会增加 LLM 调用成本。
  • 短期记忆压缩(src/langmem/short_term/summarization.py)与知识抽取(src/langmem/knowledge/extraction.py)虽属于相邻模块,但在与提示词优化系统协同时,应避免混淆"消息摘要"与"提示词更新"两类输出。

See Also

  • 短期消息摘要:src/langmem/short_term/summarization.py
  • 知识抽取与存储管理:src/langmem/knowledge/extraction.py

来源:https://github.com/langchain-ai/langmem / 项目说明书

LangGraph 集成、部署与短期记忆

LangMem 在 LangGraph 生态中承担两层职责:一是提供与 LangGraph 存储层(BaseStore)深度集成的长期记忆工具,二是为 LangGraph 工作流提供短期上下文压缩能力。本页聚焦 LangGraph 集成入口、部署形态,以及短期记忆模块的运行机制。LangMem 的核心 API 在 src/langmem/init.py 顶层汇总,涵盖 cr...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 工具层集成

继续阅读本节完整说明和来源证据。

章节 存储与有状态图

继续阅读本节完整说明和来源证据。

章节 图节点入口

继续阅读本节完整说明和来源证据。

概述

LangMem 在 LangGraph 生态中承担两层职责:一是提供与 LangGraph 存储层(BaseStore)深度集成的长期记忆工具,二是为 LangGraph 工作流提供短期上下文压缩能力。本页聚焦 LangGraph 集成入口、部署形态,以及短期记忆模块的运行机制。LangMem 的核心 API 在 src/langmem/__init__.py 顶层汇总,涵盖 create_memory_managercreate_manage_memory_toolcreate_search_memory_toolSummarizationNodecreate_prompt_optimizer 等关键符号。README 明确指出 LangMem 提供「functional primitives you can use with any storage system and native integration with LangGraph's storage layer」的双轨设计,资料来源:README.md:1-15。

LangGraph 集成形态

LangMem 与 LangGraph 的耦合主要体现在三类入口:工具(Tools)、存储(Store)、图节点(Graph Nodes)。

工具层集成

src/langmem/knowledge/tools.py 中的 create_manage_memory_toolcreate_search_memory_tool 直接消费 LangGraph 的 BaseStore 抽象。_get_store 工具函数优先使用调用方注入的 initial_store,否则通过 langgraph.utils.config.get_store() 从运行时上下文获取存储实例(资料来源:src/langmem/knowledge/tools.py)。当 get_store() 在 LangGraph 上下文外调用时,会抛出 errors.ConfigurationError("Could not get store"),这是 LangGraph 上下文依赖的明确边界。命名空间(namespace)支持 ("memories", "{langgraph_user_id}") 形式的模板占位符,运行时会从 config["configurable"] 替换变量,便于在 LangGraph Platform 上做多租户隔离。

存储与有状态图

长期记忆写入通过 create_memory_store_manager 把提取出的记忆直接落到 BaseStore;状态化的提示词优化走 src/langmem/prompts/stateful.py 中的 general_reflection_graph,该图以 StateGraph(ReflectionState) 构造,节点 update_generalSTARTEND 之间执行,对存储中的当前提示执行反思写回。资料来源:src/langmem/prompts/stateful.py。

图节点入口

src/langmem/graphs/prompts.py 把优化逻辑封装为可部署的图节点 optimize:通过 StateGraphadd_nodeadd_edge 串接 START -> optimize -> END,并在 configurable 中读取 modelkindgradient/metaprompt 等),便于 LangGraph Platform 直接按图部署。资料来源:src/langmem/graphs/prompts.py。

短期记忆模块

短期记忆由 src/langmem/short_term/summarization.py 实现,核心数据结构与对外符号如下。

符号类型作用
summarize_messages同步函数在消息累计超出阈值时压缩历史
asummarize_messages异步函数同上,提供 await 入口
SummarizationNodeLangGraph 节点可直接挂到 StateGraph
RunningSummary状态结构携带累积摘要,供下一轮使用
SummarizationResult结果结构汇总返回的新消息与摘要片段

SummarizationNode 通过配置 max_tokensmax_tokens_before_summarymax_summary_tokens 三档阈值控制触发时机:当输入消息累计 token 数达到 max_tokens_before_summary(默认等于 max_tokens)即触发摘要。资料来源:src/langmem/short_term/summarization.py。

需要注意的细节:当最后一条消息是带有工具调用的 AI 消息时,其对应的工具结果也会被纳入摘要范围,避免悬空引用;当待摘要的 token 数超过 max_tokens 时,仅取末尾 max_tokens 个 token 进入摘要模型,以避免上下文溢出。max_summary_tokens 仅用于预算估算,并不会作为参数透传给模型;如需硬性限制,需要在传入前用 model.bind(max_tokens=max_summary_tokens) 自行绑定。token_counter 默认采用近似计数,生产环境建议替换为 model.get_num_tokens_from_messages。资料来源:src/langmem/short_term/summarization.py。

部署形态与运行时配置

LangMem 既可作为独立 Python 库调用,也可作为 LangGraph 图部署到 LangGraph Platform。README 强调「Native integration with LangGraph's Long-term Memory Store, available by default in all LangGraph Platform deployments」(资料来源:README.md:13-15)。在 Platform 上部署时,需要通过 langgraph.jsonlangmem.graphs.prompts.optimize 这类节点注册为可路由图。

短期记忆的部署用法是把 SummarizationNode 嵌入到现有 StateGraph:节点读写 RunningSummary 状态字段,上游节点写入消息,下游节点读取经过压缩的 messages 与持久化的 summary。这样组合既能在 Platform 上保留长会话能力,又能把单次 LLM 调用的上下文控制在预算内。

flowchart LR
    A[用户消息] --> B[Agent 节点]
    B --> C[SummarizationNode]
    C -->|压缩后消息| D[下游 LLM 调用]
    C -->|RunningSummary| E[BaseStore]
    E -.->|下一轮读取| C

常见失败模式

  1. 存储上下文缺失:在 LangGraph 外直接调用 create_manage_memory_tool_get_store 会触发 RuntimeError,被包装为 ConfigurationError。修复方式:在 LangGraph entrypoint 内调用,或显式传入 store= 参数。
  2. 命名空间变量未注入namespace=("memories", "{langgraph_user_id}") 在运行时依赖 config["configurable"]["langgraph_user_id"];缺失该键会导致模板替换失败。
  3. 短期记忆触发器配置错位:若 max_tokens_before_summary 远大于 max_tokens,可能导致摘要模型上下文溢出;若太小,则频繁摘要带来额外 LLM 成本。
  4. 工具调用残留:当 AI 消息附带工具调用时,必须确保摘要逻辑能同时覆盖工具消息,否则压缩后会出现孤立的工具调用记录。资料来源:src/langmem/short_term/summarization.py。

参见

  • README.md — 项目总览与安装
  • src/langmem/knowledge/extraction.py — 记忆提取与搜索管线
  • src/langmem/prompts/optimization.py — 提示词优化器(gradient、metaprompt、memory)

来源:https://github.com/langchain-ai/langmem / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:Persistence?

可能增加新用户试用和生产接入成本。

high 来源证据:Enhance error message when summarization fails due to missing HumanMessage in trimmed window

可能影响授权、密钥配置或安全边界。

medium 可能修改宿主 AI 配置

安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

Pitfall Log / 踩坑日志

项目:langchain-ai/langmem

摘要:发现 10 个潜在踩坑项,其中 2 个为 high/blocking;最高优先级:安装坑 - 来源证据:Persistence?。

1. 安装坑 · 来源证据:Persistence?

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Persistence?
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/langchain-ai/langmem/issues/154 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

2. 安全/权限坑 · 来源证据:Enhance error message when summarization fails due to missing HumanMessage in trimmed window

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Enhance error message when summarization fails due to missing HumanMessage in trimmed window
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 证据:community_evidence:github | https://github.com/langchain-ai/langmem/issues/156 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 配置坑 · 可能修改宿主 AI 配置

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主,或安装命令涉及用户配置目录。
  • 对用户的影响:安装可能改变本机 AI 工具行为,用户需要知道写入位置和回滚方法。
  • 证据:capability.host_targets | github_repo:920242883 | https://github.com/langchain-ai/langmem | host_targets=claude, chatgpt

4. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | github_repo:920242883 | https://github.com/langchain-ai/langmem | README/documentation is current enough for a first validation pass.

5. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | github_repo:920242883 | https://github.com/langchain-ai/langmem | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | github_repo:920242883 | https://github.com/langchain-ai/langmem | no_demo; severity=medium

7. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | github_repo:920242883 | https://github.com/langchain-ai/langmem | no_demo; severity=medium

8. 安全/权限坑 · 来源证据:Security: OWASP Agent Memory Guard for memory poisoning defense (ASI06)

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:Security: OWASP Agent Memory Guard for memory poisoning defense (ASI06)
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/langchain-ai/langmem/issues/164 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

9. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | github_repo:920242883 | https://github.com/langchain-ai/langmem | issue_or_pr_quality=unknown

10. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | github_repo:920242883 | https://github.com/langchain-ai/langmem | release_recency=unknown

来源:Doramagic 发现、验证与编译记录