【RFC】OpenViking工作记忆设计v1 #1481
Mijamind719
started this conversation in
RFC
Replies: 1 comment
-
|
可以,挺清晰的。现在有一些数据集能对比overview优化前后的效果吗 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
OpenViking 工作记忆设计 v1
文档目标
这份文档只讨论 OpenViking 的工作记忆设计,不讨论长期记忆。
本文重点回答 4 个问题:
archive提升成工作记忆对象本文是第一版设计文档,目标是帮助后续理解和迭代,不追求一次性定稿。
工作记忆设计原则
OpenViking 里的工作记忆不应被设计成 archive 旁边的一份外挂摘要,而应由
commit/archive这条主链路直接生成。它的核心作用不是“记住所有历史”,而是:
一句话概括:
working memory = messages.jsonl 之上的、由 archive 生成并服务于 assemble/compact 的结构化工作摘要层从设计上看,它依赖几个关键原则:
messages.jsonl永远是真相源,working summary 只是派生出的工作摘要afterTurn()负责判断触发时机,真正的工作记忆生成由commit/archive承担工作记忆与原始历史必须分开理解
OpenViking 里最容易混淆的是两层东西。
1. 原始历史
原始历史是真相源。
messages.jsonlhistory/archive_x/messages.jsonl对应文档和代码位置:
OpenViking/docs/zh/api/05-sessions.md:776OpenViking/docs/zh/api/05-sessions.md:784OpenViking/openviking/session/session.py:192OpenViking/openviking/session/session.py:4442. 工作记忆
工作记忆是 archive 产出的结构化工作对象。
assemble()、compact()和后续续接工作记忆的真实定位
从设计上看,OpenViking 的工作记忆不应该被当成新的主历史,而应该被当成:
assemble()的主输入之一compact()的主要返回结果所以它不是:
它更像一份由 archive 正式生成、持续服务于会话续接的工作对象。
OpenViking 当前已经做到什么
这部分调研基于 OpenViking 仓库当前
main分支下的examples/openclaw-plugin实现。从当前 README 和代码看,这个插件已经不是一个单纯的 memory lookup 插件,而是一个围绕 OpenClaw 生命周期工作的集成层。源码和文档位置:
OpenViking/examples/openclaw-plugin/README_CN.md:19-24OpenViking/examples/openclaw-plugin/index.ts:1411-1561OpenViking/examples/openclaw-plugin/context-engine.ts:763-1125它当前已经具备 3 个非常重要的基础能力。
1.
assemble()已经在消费 archive 产物当前
assemble()会调用getSessionContext(),然后把 OpenViking 返回的 session context 重新组装成 OpenClaw 可消费的消息:latest_archive_overview->[Session History Summary]pre_archive_abstracts->[Archive Index]toolUse/toolResult对应实现:
OpenViking/examples/openclaw-plugin/context-engine.ts:705-740OpenViking/examples/openclaw-plugin/context-engine.ts:763-852它还会附带一段
systemPromptAddition,显式告诉模型:[Session History Summary]是有损的[Archive Index]ov_archive_expand对应实现:
OpenViking/examples/openclaw-plugin/context-engine.ts:438-476这说明 OpenViking 当前已经在用 archive 产物参与工作上下文组装。只是今天这个 archive 产物还比较薄,更多是“summary + index”,还没有进化成更强的 working memory object。
2.
afterTurn()已经在做原始消息的无损落盘和异步 commit当前
afterTurn()会:prePromptMessageCount切出本轮新增消息pending_tokens >= commitTokenThreshold时,触发commit(wait=false)对应实现:
OpenViking/examples/openclaw-plugin/context-engine.ts:867-1037这说明 OpenViking 当前已经有了工作记忆系统所需的事实底座和后台异步 commit 触发点。
3.
compact()已经在做同步 commit 和 summary 回读当前
compact()会:commit(wait=true)getSessionContext()latest_archive_overview作为 compact summarytokensBefore / tokensAfter / latest archive id / summary对应实现:
OpenViking/examples/openclaw-plugin/context-engine.ts:1039-1125OpenViking/examples/openclaw-plugin/context-engine.ts:1185-1293所以,如果只从“有没有 compact 同步边界”和“有没有历史压缩后再回读”这两个角度看,OpenViking 当前已经有了工作记忆的基本骨架。
当前真正缺的是什么
OpenViking 现在差的不是“能不能压缩历史”,而是“archive 产物能不能直接充当工作记忆”。按这个标准看,当前实现还缺 4 个关键能力。
缺口 1:archive 产物还不够“工作态”
当前
latest_archive_overview更像归档概述,不像工作交接文档。它至少还缺:Current StateNext ActionsErrors & CorrectionsImportant Files / Functions缺口 2:archive 缺少明确的覆盖边界
工作记忆对象必须明确表达两件事:
没有这个边界,archive 就只能提供“可读摘要”,不能安全接管 working context。
缺口 3:archive 缺少 recent tail 的保留语义
当前
assemble()拿到的是:但 archive 本体没有显式描述“为什么这些 recent raw messages 还要保留”,例如:
headTurnIdtailTurnIdtailTokenEstimatewhy kept这会让
assemble()更像是在拼“摘要 + 活跃消息”,而不是消费一份已经定义好边界的 working memory。缺口 4:assemble 消费的是 archive 摘要结果,不是 archive-working-memory object
当前主输入仍然是:
而不是:
archive-produced working summaryrecent raw messagesarchive expansion hints所以 OpenViking 现在已经是一个
archive-aware context engine,但还没有把 archive 提升成“工作记忆的正式输出物”。技术方案:Archive 本体就是 Working Memory Object
把 archive 升级成 working memory object:
messages.jsonl仍然是真相源archive则成为“当前 session 的工作记忆生成器和承载对象”本章以下内容按选定方案描述。
1. 存储模型
archive 结果对象扩展为:
兼容现有返回形态时,第一阶段不改 archive 主表结构,而是让
commit()/getSessionContext()额外返回一个working_memory字段;但语义上它仍然是 archive 产物,而不是平行 sidecar。2. 摘要模板
workingSummary.markdown使用固定 section,至少包含:Session TitleCurrent StateUser Goal & ConstraintsImportant Files / Modules / ResourcesDecisions & WhyErrors / Failed Paths / User CorrectionsWorkflow / Commands / ToolsNext ActionsKey ResultsWorklog其中最关键的是:
Current StateErrors / Failed Paths / User CorrectionsNext Actionscompact 后还能不能连续工作,基本就看这三块。
3. 生成提示词
archive-working-memory 生成 prompt 定义为:
这个 prompt 的目标只有两个:一是让 archive 产物具备工作记忆语义,二是同时产出 coverage 和 preserved tail 元数据。
4. 生命周期映射
afterTurn()afterTurn()保留当前的原始消息落盘逻辑,并在达到阈值时直接通过commit(wait=false)异步触发 archive working memory 生成:commit(wait=false)异步触发下一次 archive 生成触发信号为:
这里不要阻塞主链路。
afterTurn()负责判断时机,真正的 working memory 生成由commit/archive承担。assemble()assemble()直接消费 archive working memory,组装顺序为:workingSummaryrecent raw messagesarchive indexarchive overview也就是把当前的:
archive overview + archive index + active messages收敛成:
workingSummary + preserved recent raw messages + archive hintscompact()compact()的职责是同步生成并返回最新的 archive working memory。commit(wait=true)workingSummary + preservedTail + expansion hintsarchiveId / tokensBefore / tokensAftercompact 的结果不应该再只是
latest_archive_overview,而应该优先返回真正可继续工作的workingSummary + preservedTail + expansion hints。5. 续接与回溯
续接
OpenViking 不需要在客户端重接消息链,因为它的 session context 是服务端现组装的。它真正需要的是 archive object 上的边界字段:
sourceTurnRange.endTurnIdpreservedTail.headTurnIdpreservedTail.tailTurnId然后由
getSessionContext()或增强版 working-context API 在服务端直接物化出:workingSummaryrecent raw messagesarchive hints所以 OpenViking 的续接本质上是服务端重建 working context。
回溯旧历史
OpenViking 已经有现成入口
ov_archive_expand。回溯链路定义为:workingSummary + preservedTailov_archive_expand对应的运行时提示写成:
ov_archive_expand.”6. 这一章的边界
本文只讨论当前 session 内的 working memory,因此这里明确两层就够了:
archive as working memory object只管当前 session 的连续工作状态
messages.jsonl只管原始消息事实层;当前消息在 session 根目录下,归档后旧消息进入
history/archive_x/messages.jsonl这里最重要的边界是:
messages.jsonl是“最终事实源”MVP 与完整版
落地分两步。
MVP:把 archive 结果扩成 working memory object
第一版只做 5 件事:
commit()/getSessionContext()能返回workingSummary + sourceTurnRange + preservedTailafterTurn()继续无损落盘,并按阈值异步触发 archiveassemble()优先拼“最新 archive working memory object + recent raw messages”compact()同步等待 archive 完成,并返回 archive-working-memory-first 的结果ov_archive_expand做到这一步,就已经能把当前任务状态从
archive overview提升到真正的 working memory。完整版:服务端原生 archive-working-memory API
第二版再把这层完全收进 OpenViking 服务端:
session.commit()直接产出标准 working memory objectgetSessionContext()或新 API 直接返回 archive-working-memory 视图sourceTurnRange和preservedTailassemble()只消费 archive-working-memory 视图,不自己拼装做到这一步,OpenViking-openclaw plugin 才算真正拥有了一个以 archive 为核心的 working memory 子系统。
最终建议
如果只保留一句最重要的话,这份设计的结论是:
OpenViking 当前
openclaw-plugin已经有了 session 真相源、archive summary 和 archive expand。下一步不该是在 archive 旁边再造一份 working memory sidecar,而应该直接把 archive 提升成 working memory object,让commit/archive成为正式的工作记忆生成边界,让assemble()和compact()统一消费 archive 产出的workingSummary + preservedTail + expansion hints。Beta Was this translation helpful? Give feedback.
All reactions