ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

oh-my-pi 记忆整合系统提示词深度解析:从 memory-consolidation-system 到 Mnemopi 后台管线

oh-my-pi 记忆整合系统提示词深度解析:从 memory-consolidation-system 到 Mnemopi 后台管线 oh-my-pi 记忆整合系统提示词深度解析从 memory-consolidation-system 到 Mnemopi 后台管线【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi记忆是 Agent 跨会话复用知识的基础而把散乱的工作记忆压缩成可长期保存的摘要这一步正是记忆系统中最考验质量与一致性的环节。本文以 oh-my-picoding-agent的记忆后端提示词 memory-consolidation-system.md 为骨架结合 Mnemopi 记忆后端 与 consolidate.ts 的源码实现逐条拆解整合提示词的设计约束、模板渲染机制与后台落库流程。读完本文你将理解该提示词如何在项目中被加载、如何与{memories}占位符交互、如何驱动sleep会话级整合与分层降级并能基于源码证据评估或定制自己的记忆整合提示词。一、提示词全文一份保真优先、去重从严的整合配方该文档全文是一条面向 LLM 的 system prompt模板位于 memory-consolidation-system.md完整内容如下Summarize memories in 1-3 concise sentences. Preserve every fact, name, number, version, date, and decision exactly. Merge duplicate/near-duplicate points; NEVER repeat a point. Conflicts: state only the most recent as current. NEVER invent, infer, or add content absent from memories. Output only summary sentences. Memories: {memories} Summary:别看它只有 8 行其中包含了整合consolidation任务必须遵守的六类核心约束是后续一切工程实现的行为基线约束类别原文要求工程含义输出形态Summarize memories in 1-3 concise sentences长度受控整合结果必须是 13 句精炼摘要防止 episodic 记忆无限膨胀保真原则Preserve every fact, name, number, version, date, and decision exactly事实无损名称、数值、版本、日期、决策必须逐字保留这是摘要而非改写去重原则Merge duplicate/near-duplicate points; NEVER repeat a point合并近似重复点、绝不重复对应源码中的去重与冲突处理逻辑冲突裁决Conflicts: state only the most recent as current冲突时只以最新为准与被纠正的值只输出最新值的提取哲学一脉相承禁止幻觉NEVER invent, infer, or add content absent from memories严禁发明、推断、添加记忆之外的内容保证记忆库的证据边界格式纪律Output only summary sentences只输出摘要句子本身不允许解释、编号、标签或额外评论该提示词与同目录下的 memory-extraction-system.md 构成提取 → 整合两条互补的提示词管线提取阶段负责从用户消息中抽出持久性事实一行一条、NO_FACTS表示无事实整合阶段则负责把一批工作记忆压缩为最终摘要。两者共享保真、不推断、以最新为准的同一套价值约束。二、提示词的调用链它如何进入记忆后端要理解这份提示词的分量需要先看它被谁消费。在 backend.ts 中它以文本资源的形式被直接导入import memoryConsolidationPrompt from ../prompts/system/memory-consolidation-system.md with { type: text };随后在解析 Mnemopi 运行时配置时同文件 resolveMnemopiProviderOptions当用户把providers.memoryModel配置为一个本地 tiny 记忆模型而非远端模型时整合提示词被注入 LLM 选项if (memoryModel ! ONLINE_MEMORY_MODEL_KEY isTinyMemoryLocalModelKey(memoryModel)) { return { ...base, llm: { complete: (prompt, opts) { const request resolveMemoryCompletionInput(prompt, opts); return tinyModelClient.complete(memoryModel, request.prompt, { maxTokens: opts?.maxTokens, systemPrompt: request.systemPrompt, }); }, // No extractionPrompt: resolveMemoryCompletionInput supplies the // instructions as a system turn for every extraction call... consolidationPrompt: memoryConsolidationPrompt, }, }; }从源码可以读出三条关键事实提示词走 system turnresolveMemoryCompletionInputbackend.ts对memory-extraction任务会把提示词作为 systemPrompt 传入其余任务直接透传 prompt。也就是说整合提示词是注入上下文而非追加到用户消息末尾模型从一开始就受其纪律约束。整合与提取共用同一 LLM 通道consolidationPrompt与extractionPrompt平级存在说明一次记忆写入背后LLM 既可能做事实提取也可能做工作记忆整合。远端/无 LLM 模式同样可用当llmMode为none时不启用 LLM为remote时使用llmBaseUrl/llmApiKey/llmModel指向远端补全服务为smol时经resolveRoleSelection([tiny, smol], ...)解析本地小模型并通过completeSimple调用带retryTransientCompletion重试。提示词文件只是这条多模式通道上本地 tiny 模型分支的默认模板。三、模板渲染机制{memories}之外还有哪些占位符整合提示词中的{memories}并非魔术字符串它由记忆核心库在渲染时替换。在 local-llm.ts 中formatSleepPrompt展示了完整的渲染协议function formatSleepPrompt(memories: readonly string[], source ): string | null { const override getMnemopiRuntimeOptions()?.llm?.consolidationPrompt; const template override ! undefined override ! ? override : sleepPrompt(); if (template ) { return null; } let rendered template; rendered rendered.split({source}).join(source); rendered rendered.split({memories}).join(memoryLines(memories)); rendered rendered.split({memory_count}).join(String(memories.filter(Boolean).length)); return rendered; }这里有三点值得注意模板可被运行时选项覆盖getMnemopiRuntimeOptions()?.llm?.consolidationPrompt优先于默认模板这与 runtime-options.ts 中声明的consolidationPrompt?: string字段呼应——上层coding-agent注入的正是本文主题的提示词文件。占位符共三个{memories}由每条记忆以- memory的列表形式渲染见memoryLines、{source}记忆来源标识、{memory_count}记忆条数。编写自定义整合提示词时同样可以使用这三个占位符。未配置时的内置兜底如果既无运行时覆盖、MNEMOPI_SLEEP_PROMPT环境变量也为空buildPrompt会退回一段内置文案Summarize the following memories into 1-3 concise sentences. Preserve facts, names, preferences, and decisions. Discard fluff.并以前缀/no_think及Summary:结尾组装最终请求。可以看到提示词文件的措辞正是这段兜底逻辑的精炼升级版。环境变量MNEMOPI_SLEEP_PROMPT的存在意味着即使不修改仓库代码也可以通过设置该变量整体替换整合提示词模板支持同样的三个占位符。四、整合流程的源码级原理从 working 到 episodic 的沉降提示词最终服务的动作是睡眠整合sleep consolidation。在 consolidate.ts 中可以完整还原这条管线4.1 候选筛选只整合够老的工作记忆sleep()consolidate.ts首先通过eligibleWorkingRows查询working_memory表中满足条件的行会话匹配当前session_idtimestamp早于workingMemoryTtlHours / 2小时前的截止线默认 TTL 24 小时即只处理 12 小时前的记忆cutoffIso(Math.floor(ttl / 2), 60 * 60 * 1000)consolidated_at IS NULL尚未被整合避免重复处理单批上限MNEMOPI_SLEEP_BATCH默认 5000 条。随后用UPDATE ... SET consolidated_at ? WHERE id IN (...) AND consolidated_at IS NULL加认领标记通过条件更新加二次查询来防止并发 sleep 重复整合同一批记录——这正是consolidate-fact-concurrency系列测试要守护的语义见 consolidate-fact-concurrency.test.ts。4.2 分组与分块控制单次输入的 token 预算候选行按source分组如conversation、coding-agent-memory-command等来源各自成组再由splitSleepItems按maxEpisodeChars默认DEFAULT_MAX_EPISODE_CHARS 100_000字符切成多个 chunk并用 | 连接各条记忆内容。超长 chunk 会以[... sleep_consolidation episode truncated ...]标记截断。4.3 生成摘要并落库对每个 chunkbuildSleepSummary用aaakEncode对拼接内容做压缩编码该方法名与aaak.ts对应并携带截断信息consolidateToEpisodicconsolidate.ts将摘要写入episodic_memory表summary_of字段记录被合并的sourceWmIds同时写入veracity由各来源 veracity 聚合而来、scope若任一来源是 global 则升级为 global、valid_until取各来源最早过期时间随后触发事实下沉extractAndStoreFacts用确定性正则从摘要中抽取 metric\d 单位、ISO 日期、版本号、实体三元组等分别写入memoria_facts/memoria_timelines/memoria_kg/memoria_instructions/memoria_preferences摘要同时被送入 episodic 图ingestIntoEpisodicGraph与向量索引scheduleEmbedding为后续 recall 的graph语音与向量检索铺路每次整合写入consolidation_log并发出MEMORY_CONSOLIDATED事件可被插件系统订阅见beam.pluginManager?.emit。值得注意的是consolidateToEpisodic中veracity聚合用的是多数表决 低置信优先策略aggregateEpisodicVeracity见 consolidate.ts各来源 veracity 权重排序为true/stated unknown inferred imported tool false在票数相同时取权重更低更不可信的值从而让下游 recall 对低置信记忆保持警惕。4.4 分层降级episodic 记忆的老化机制整合之后degradeEpisodicconsolidate.ts按时间对 episodic 记忆做三级降级层级触发条件默认处理方式tier 1 → tier 2创建超过MNEMOPI_TIER2_DAYS默认 30 天内容截断到前 800 字符tier 2 → tier 3创建超过MNEMOPI_TIER3_DAYS默认 180 天用extractKeySignal做关键词加权句子抽取限制在MNEMOPI_TIER3_MAX_CHARS默认 300 字符内降级过程使用 SAVEPOINT 保证原子性一旦压缩内容发生变化就会作废对应向量invalidateEpisodicVectors避免向量索引的还是旧长文本造成检索失真。整合的健康状态则由health()consolidate.ts基于consolidation_log评估超过 24 小时无成功整合即报告stale并建议执行sleepAllSessions()。4.5 多会话批量整合sleepAllSessionsconsolidate.ts对所有有候选记忆的会话依次调用sleep按最早记忆时间升序处理返回每个会话的整合统计items_consolidated、summaries_created、degradation等并支持dryRun预演。五、与提取提示词的分工一句话理解整条记忆流水线把两份提示词放在一起看整条流水线非常清晰用户在会话中说话记忆后端mnemopi按 memory-extraction-system.md 的要求把稳定事实路径、端口、版本、偏好、截止日期等逐行提取为工作记忆working memory当工作记忆足够老超过 TTL 一半或会话收尾触发consolidate({ full: true, retain: true })见 backend.ts 的enqueue实现时进入 sleep 流程本文主题的 memory-consolidation-system.md 指示模型把一批工作记忆压缩成 13 句、保真去重、只认最新的摘要摘要写入 episodic_memory同时下沉事实、入图、入向量索引并在 30/180 天后按层级降级压缩。至此提取保真入库→ 整合压缩去重→ 降级随年龄衰减三段式记忆生命周期闭环形成提示词文件正是其中整合环节的质量闸门。六、如何验证与定制这份提示词仓库为整合逻辑提供了充足的验证抓手单元测试beam-consolidate-unit.test.ts 覆盖 sleep 整合的主干行为beam-e3-e4-e6.test.ts、consolidate-fact-id-collision.test.ts、consolidate-fact-concurrency.test.ts 分别守护事实 ID 稳定与并发安全veracity-consolidation.test.ts 守护 veracity 聚合规则fts-superseded.test.ts 验证被取代记忆在全文检索中的处理。运行观察mnemopi 后端提供stats按 bank 展示 working/episodic/triples 计数与diagnose数据库完整性检查与关键发现相关渲染逻辑同样位于 backend.ts。如果你要定制自己的整合提示词仓库给出了两条不改代码的路径设置MNEMOPI_SLEEP_PROMPT环境变量支持{memories}、{source}、{memory_count}三个占位符或通过运行时选项llm.consolidationPrompt注入自定义模板——coding-agent 正是通过后者把本文分析的提示词文件喂给本地记忆模型的。定制时务必守住原文的六条约束底线长度受控、事实保真、合并去重、冲突取新、禁止幻觉、只出摘要否则下游的事实下沉与向量检索都会跟着失真。结语一份仅 8 行的提示词在 oh-my-pi 的记忆体系中扮演着整合质量守门人的角色它约束 LLM 把多条工作记忆无损压缩为 13 句摘要而后台 consolidate.ts 负责分块、落库、事实下沉、图与向量索引以及分层降级backend.ts 则完成提示词的注入与 LLM 通道调度。理解这条链路你就掌握了 Agent 长期记忆中最关键的一环如何让记忆在压缩与保真之间取得平衡并让每一次整合都可审计、可验证。【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表