ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Open Interpreter 记忆系统深度解析:Phase 1 提取与 Phase 2 巩固的两阶段记忆管线

Open Interpreter 记忆系统深度解析:Phase 1 提取与 Phase 2 巩固的两阶段记忆管线 Open Interpreter 记忆系统深度解析Phase 1 提取与 Phase 2 巩固的两阶段记忆管线【免费下载链接】openinterpreterA coding agent for open models like Kimi K3 and GLM 5.3项目地址: https://gitcode.com/GitHub_Trending/op/openinterpreterOpen Interpreter面向 Kimi K3、GLM 5.3 等开放模型的编码智能体内置了一套让 Agent 跨会话“记住”用户与项目信息的记忆系统Memories。本文以 codex-rs/memories/README.md 为主体逐节展开这套管线的设计与实现读完你将掌握记忆管线何时触发、Phase 1 如何从历史会话rollout中并行提取结构化记忆、Phase 2 如何加全局锁把阶段产物巩固成磁盘上的记忆工作区以及每个关键配置项在源码中的默认值与语义。记忆系统的目录结构与 Crate 分工codex-rs/memories/目录承载了可复用的记忆 Crate 与管线文档。从 README 与当前源码结构看职责划分为codex-rs/memories/readCrate 名codex-memories-read——读路径负责记忆开发者指令developer-instruction注入、记忆引用citation解析以及“读使用”遥测分类。对应源码见 citations.rs、usage.rs、metrics.rs。codex-rs/memories/writeCrate 名codex-memories-write——写路径负责 Phase 1 / Phase 2 的提示词渲染、文件系统产物辅助函数、工作区 diff 辅助与扩展资源清理。核心模块包括 phase1.rs、phase2.rs、prompts.rs、storage.rs、workspace.rs。README 中提到 Phase 1/2 的运行时编排历史上位于codex-corecodex-rs/core/src/memories/而在当前仓库中编排入口已经落在写路径 Crate 内启动任务函数start_memories_startup_task定义于 start.rs并在codex-core的会话启动代码路径中被调用codex-rs/core/src/session/中可见对 memories 模块的引用。提示词模板的位置规则记忆提示词模板遵循“模板跟着使用它的 Crate 走”的原则且无日期后缀的模板文件才是运行时使用的正式版本读路径模板read/templates/memories/read_path.md。注意在当前代码中该模板实际由 codex-rs/ext/memories/src/prompts.rs 通过include_str!引入指向../templates/memories/read_path.md即 codex-rs/ext/memories/templates/memories/read_path.md供memories扩展在会话启动时注入记忆读取指令。写路径模板均为无日期版随 write/templates 目录 原地维护stage_one_system.md —— Phase 1 系统提示词被 phase1.rs 以include_str!编译期内联见 lib.rs 中的PROMPT常量stage_one_input.md —— Phase 1 单条 rollout 的输入消息模板consolidation.md —— Phase 2 巩固 Agent 的提示词模板。README 特别说明带日期快照副本的工作流用于另一个独立的openai/project/agent_memory/write测试框架仓库不在本仓库使用——在本仓库中直接原地编辑无日期模板即可。管线何时触发四个前置条件与启动顺序管线的触发时机是根会话root session启动时且必须同时满足四个条件否则静默跳过。这一逻辑直接实现在 start.rs 中if config.ephemeral || !config.features.enabled(Feature::MemoryTool) || source.is_non_root_agent() { return; } // ... if context.state_db().is_none() { warn!(state db unavailable for memories startup pipeline; skipping); return; }对应 README 描述的四条规则会话不是临时的ephemeral为 false记忆功能开关已启用Feature::MemoryToolfeature flag会话不是 sub-agent 会话source.is_non_root_agent()状态数据库state DB可用否则打一条 warn 日志后放弃。通过检查后任务通过tokio::spawn异步执行在后台按严格顺序推进见 start.rs创建记忆根目录codex_home/memoriesmemory_root函数lib.rs播种记忆扩展指令seed_extension_instructionsPhase 1 之前的清理phase1::prune删除过期的 stage-1 输出行注释明确“这不消耗 token所以可以放在配额检查之前”速率限制/配额检查guard::rate_limits_ok不通过则记录skipped_rate_limit计数器并返回执行 Phase 1phase1::run执行 Phase 2phase2::run串行在 Phase 1 之后。Phase 1逐会话的 Rollout 提取Phase 1 的目标是把近期符合条件的 rollout一次完整会话的执行记录逐条转换成结构化记忆记录。整体流程由 phase1.rs 的run函数以严格步骤执行认领任务 → 构建请求上下文 → 并行抽取 → 指标与日志。哪些 rollout 有资格被处理启动时的认领规则claim_startup_jobsphase1.rs从状态库中筛选 rollout仅当满足以下条件才会进入处理队列来自允许的交互式会话来源INTERACTIVE_SESSION_SOURCES来自codex-rolloutCrate处于配置的时间窗内max_age_days已闲置足够久min_rollout_idle_hours避免对仍在活跃/刚结束的会话做摘要未被其他正在运行的 Phase 1 工作者持有租约在本次启动的扫描/认领上限之内限制单次启动的工作量。这些参数经由Stage1StartupClaimParams传给状态库的claim_stage1_jobs_for_startup具体取值含默认值见下文配置小节。结构化输出与秘密脱敏每个被认领的 rollout 会经过内容过滤只保留与记忆相关的 response item过滤函数为should_persist_response_item_for_memories然后发送给模型做抽取。模型输出被 phase1.rs 中定义的 JSON Schema 约束必填字段为raw_memory该 rollout 的详细 Markdown 原始记忆rollout_summary紧凑摘要用于路由与索引rollout_slug可选 slug用于推导 rollout 摘要产物文件名。反序列化结构StageOneOutput使用了deny_unknown_fields即模型若输出多余字段会直接判为失败。生成结果还会经过codex_secrets::redact_secrets对记忆字段做秘密脱敏成功的输出写回状态库成为stage-1 输出。并发、租约与重试从 lib.rs 的常量定义可以看到 Phase 1 的协调参数常量值含义CONCURRENCY_LIMIT8单次启动内并行抽取任务的并发上限JOB_LEASE_SECONDS3600每个任务在 DB 中的租约时长防止跨 worker/跨启动重复处理JOB_RETRY_DELAY_SECONDS3600失败任务的退避重试延迟避免热循环THREAD_SCAN_LIMIT5000启动扫描的线程数上限有界工作PRUNE_BATCH_SIZE200过期 stage-1 输出的清理批大小REASONING_EFFORTLowPhase 1 抽取使用的推理档位DEFAULT_ROLLOUT_TOKEN_LIMIT150,000模型元数据缺失上下文窗口时的输入截断回退值CONTEXT_WINDOW_PERCENT70%stage-1 输入占用模型有效输入窗口的比例为系统指令与输出留余量任务的最终结局只有三种JobOutcome枚举SucceededWithOutput产出记忆、SucceededNoOutput运行正常但无可用产出、Failed带重试退避与租约处理。Phase 1 的职责边界即到此为止——把单个 rollout 变成 DB 支撑的记忆记录。Phase 2全局巩固Phase 2 把最新的 stage-1 输出巩固为文件系统上的记忆产物并运行一个专门的巩固 Agent。其设计目标README 总结在安全、一致的前提下刷新磁盘记忆工作区并产出/更新更高层的巩固记忆输出。全局锁与选择规则Phase 2 在触碰记忆根目录前先认领单一全局 Phase 2 锁保证同一时刻只有一个巩固流程可以检查或修改工作区。随后按以下规则从状态库加载有界的 stage-1 输入集phase2.rs忽略last_usage落在配置的max_unused_days窗口之外的记忆没有last_usage的记忆回退到generated_at保证新近生成但从未被使用的记忆也能入选排名先按usage_count使用次数再按最近的last_usage/generated_at。工作区产物同步获得锁后Phase 2 在记忆根下同步本地记忆产物raw_memories.md合并后的原始记忆按thread-id 升序稳定排序渲染避免使用次数排名波动导致文件抖动rollout_summaries/每个入选 rollout 一个摘要文件子目录常量见 lib.rs。工作区本身被当作一个git 基线目录维护由codex-git-utils在~/.codex/memories/.git下初始化。后续操作包括清理不再被选中的过期 rollout 摘要文件清理超过扩展保留窗口RETENTION_DAYS 7天lib.rs的记忆扩展资源文件使清理动作也体现在工作区 diff 中在记忆根写入phase2_workspace_diff.md——从上一次成功的 Phase 2 基线到当前工作区的 git 风格 diff。该文件有 4 MiB 的上限workspace_diff::MAX_BYTESlib.rs若产物同步与清理后工作区没有任何变化直接标记任务成功并退出不启动 Agent。巩固 Agent 的运行约束一旦工作区有变化Phase 2 会启动一个内部巩固 sub-agent用 Phase 2 提示词模板构建提示build_consolidation_prompt提示词中带上生成的工作区 diff 路径并显式指向phase2_workspace_diff.md提供详细 diff 上下文运行约束为无审批no approvals、无网络no network、仅本地写权限对该 Agent禁用 collab防止递归委派运行期间监视 Agent 状态并持续心跳刷新全局任务租约心跳间隔JOB_HEARTBEAT_SECONDS 90秒lib.rsAgent 成功后重置记忆 git 基线——diff 文件会在重置前被删除这样被删除的内容不会残留在提示词产物或不可达的 git 对象中Agent 结束时在状态库中把 Phase 2 任务标记为成功/失败。选择标记、水印与“谁决定有没有活干”README 对 Phase 2 的记账语义做了重要澄清值得原样继承成功的 Phase 2 会把它消费的确切 stage-1 快照标记为selected_for_phase2 1并持久化对应的selected_for_phase2_source_updated_atPhase 1 的 upsert 会保留旧的selected_for_phase2基线直到下一次成功的 Phase 2 改写Phase 2 只加载当前 top-N 的入选 stage-1 输入直接按该选择同步rollout_summaries/当入选集合为空时移除过期的rollout_summaries/文件并把raw_memories.md重写为空输入占位符而MEMORY.md、memory_summary.md、skills/这类巩固输出由 Agent 自行更新管线不代劳水印行为全局 Phase 2 锁不依赖 DB 水印做脏检查——是否要运行 Agent由git 工作区是否 dirty决定。Phase 2 任务行仍记录一个输入水印作为记账信息认领时已知的最新 DB 输入时间戳成功时写入的完成水印取“认领时的水印”与“实际加载的 stage-1 输入中最新source_updated_at”的较大值。这避免了完成水印被向前移动即回退但它不决定 Phase 2 是否有工作可做。为什么要拆成两个阶段README 给出的设计理由非常清晰也是理解整个架构的钥匙Phase 1 面向横向扩展它可以并行处理大量 rollout8 并发上限 DB 租约把非结构化的会话记录归一化为 DB 中的 per-rollout 记忆记录Phase 2 面向串行化全局共享的记忆产物raw_memories.md、git 基线工作区必须在单一串行上下文中安全、一致地更新因此用全局锁 工作区 dirty 检查 受限沙箱 Agent 的组合来保证不产生竞争写入。配置参数一览含源码默认值MemoriesConfig定义于 codex-rs/config/src/types.rs各字段均可在配置中覆盖默认值常量在同文件 L46-L51配置项类型默认值作用max_unused_daysi6430超过该天数未被使用的 stage-1 记忆会被 Phase 1 的prune与 Phase 2 的选择规则剔除max_rollout_age_daysi6410Phase 1 启动认领时rollout 的最大年龄窗口max_rollouts_per_startupusize2每次启动最多认领的 rollout 抽取任务数有界工作min_rollout_idle_hoursi646rollout 必须闲置满该小时数才会被抽取避免摘要仍活跃的会话extract_modelOptionStringNone指定 Phase 1 抽取使用的模型缺省时回退到 provider 的memory_extraction_preferred_model见 phase1.rs 的build_request_context从源码结构看运行时的固定常量并发 8、租约 1 小时、扫描上限 5000、保留 7 天等目前以常量形式硬编码在 lib.rs 中未暴露为配置项只有上表中的memories段字段可通过配置文件调整。记忆工作区产物清单在~/.codex/memories/记忆根下目录布局常量见 lib.rs管线维护以下产物可直接在磁盘上检查产物生成者说明raw_memories.mdPhase 2 同步合并原始记忆thread-id 升序稳定排序rollout_summaries/slug.mdPhase 2 同步每个入选 rollout 一个摘要文件phase2_workspace_diff.mdPhase 2 生成相对上次成功基线的 git 风格 diff≤4 MiBAgent 完成后、基线重置前被删除extensions/name/instructions.md扩展播种/维护来源专属的记忆解释指引超过 7 天保留期会被清理.git/codex-git-utils初始化记忆工作区的 git 基线MEMORY.md、memory_summary.md、skills/巩固 Agent高层巩固输出由 Phase 2 Agent 自行决定更新延伸阅读仓库内关键路径管线总览文档codex-rs/memories/README.md启动编排codex-rs/memories/write/src/start.rsPhase 1 实现与任务认领codex-rs/memories/write/src/phase1.rsPhase 2 实现与全局锁codex-rs/memories/write/src/phase2.rs提示词渲染codex-rs/memories/write/src/prompts.rs产物存储与同步codex-rs/memories/write/src/storage.rs、workspace.rs常量与模板内联codex-rs/memories/write/src/lib.rs配置类型与默认值codex-rs/config/src/types.rs读路径引用解析/遥测分类codex-rs/memories/read/src/lib.rs、citations.rs、usage.rs用户侧文档docs/memories.md、docs/zh/memories.md【免费下载链接】openinterpreterA coding agent for open models like Kimi K3 and GLM 5.3项目地址: https://gitcode.com/GitHub_Trending/op/openinterpreter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表