SwarmAI Recall 架构全景 —— 一个自进化 Agent OS 的 READ 路径 #80
xg-gh-25
started this conversation in
Show and tell
Replies: 0 comments
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.
Uh oh!
There was an error while loading. Please reload this page.
SwarmAI Recall 架构全景 —— 一个自进化 Agent OS 的 READ 路径
TL;DR
recall_multi)。它们在两个不同时刻注入,不是一个。dormant→archived生命周期,闲置 = 自动退场。([UPDATED 06-27] decay 现在是诚实的age + evergreen + grace,不再依赖ref_count—— ref 是死信号被解耦了;ref 另接到了 reclaim 保护 + 注入排序。见 §3.2。)1. 心智模型纠正:Recall 不是一个系统
最常见的误解 —— 包括我们自己,直到把代码 trace 了一遍 —— 是以为 agent 有"一个记忆"。SwarmAI 有五个,每个有自己的存储、自己的检索算法、自己的注入时机。把"recall 系统"当成单体来推理,会产出修错层的 fix(我们曾为另一个复发 bug 在错误的层打了 33 个补丁;这个教训可以泛化)。
把"两个注入时刻"单独展开,这是最容易被误解的一处:
2. 架构全景
2.1 五套子系统(以及 wiring 真相)
knowledge_chunks+knowledge_fts(FTS5 external-content)+knowledge_vec(sqlite-vec, 1024 维 Titan v2)0.6·vector + 0.4·BM25,阈值 0.05session_router传入embed_fn;Bedrock 在线时 vector 激活,挂了优雅降级纯 FTS5knowledge_store.py,recall_engine.py,embedding_client.pymemory_entries+memory_vec(sqlite-vec)+ 行内 HTML 注释衰减元数据0.6·vector + 0.4·BM25+ 衰减加权,阈值 0.10memory_embeddings(默认False),hybrid vector 腿建好但未接线;且 MEMORY.md ~15K < 30K 阈值 → 全量注入,选择性打分器今天根本不跑。[UPDATED 06-27]ref_count信号本身现已接线(R2-real,run_77504e11)—— 不是接到 decay(见 §3.2),而是接到 (1)_is_reclaimable_noise物理保护 + (2)get_stage_knowledge注入排序,信号源.memory-usage.json(507 keys 真实计数)memory_index.py,memory_embeddings.py,context_recall.py,memory_decay.pymessages_fts(FTS5 external-content)density·0.4 + recency·0.35 + richness·0.25,±10 消息窗口sent=0,未 drain 的 pending 消息绝不会作为幻影 context 注入session_recall.pytranscript_chunks+transcript_fts(FTS5)+transcript_vec(sqlite-vec)content_hash增量同步embed_fn时 vector 激活transcript_indexer.pyrecall_multi._codeintel_recall索引清单: 4 张独立 FTS5 表(
knowledge_fts、messages_fts、transcript_fts、code-symbol FTS)+ 3 张 sqlite-vec 表(knowledge_vec、memory_vec、transcript_vec)。2.2 聚合器:
recall_multi一个只读门面,跨五个域扇出,返回分桶结果:
两条承重的安全属性:
allow_embed=False默认 → 零 Bedrock embed、零写入。(所以经聚合器到达时,Library 退化为纯 FTS5 —— hybrid 路径是session_router的直连路由。)policy_excluded_files隐私门贯穿所有域 —— 这堵住了一个真实漏洞:--domains曾能绕过--file强制的隐私(被一个 adversarial 门抓到,run_4358cc95)。2.3 让人意外的注入不对称
Resume context 不调任何 recall 子系统。 session 恢复时(20–150K tokens 的 context),
context_injector.build_resume_context()纯机械地从 DBmessages表抽取 checkpoint / 助手结论 / 关键工具结果 / 近 30 轮。它不调session_recall、knowledge_store或memory_index。Recall 是增强,绝不在 resume 关键路径上。这是刻意的:resume 必须确定性且离线安全;recall 是尽力而为,可以失败而不破坏连续性。3. 定位:Memory vs Knowledge vs DDD
三层,一个路由问题。出自
s_persist的路由树,决定性测试是:MEMORY.md、DailyActivity/、EVOLUTION.mdKNOWLEDGE.md+Knowledge/库PRODUCT.md/TECH.md/IMPROVEMENT.md/PROJECT.md3.1 7 类知识治理(MECE + 达尔文式)
每条存储的条目都是 7 个互斥且穷尽(MECE)的类型之一(PRI01, Discussion #59):
principle·correction·decision·guideline·pitfall·process·model这个分类不是装饰 —— 它驱动路由(新条目落在哪)和生命周期(怎么衰减)。关键在于,WHERE(去哪)和 WHAT/寿命 是刻意分开的:
3.2 达尔文式衰减:知识必须自己淘汰自己
机制上:条目携带
<!-- ref:N | last:DATE | decay:STATE -->。闲置条目滑向active → dormant → archived;被取代的条目在选择中打0.1×分而非删除。让它运转的设计原则:
4. 设计哲学
4.1 从硬盘到 OS
组织整个系统的框架:
以及驱动 recall 工作的诚实诊断:
4.2 6 链回路 —— recall 是一环,不是终点
Recall(第 ④ 环)只有当电流绕完整圈、且纠错计数下降时才有意义:
经验上最坏的一环是 ⑤ 应用 —— 不是存储,不是检索。一条教训可以在 context 里却仍不改变行为。这就是为什么 SwarmAI 依赖机械门而非提醒。
4.3 可逆,绝不丢弃
我们明确采纳的一条原则,以及我们看着别人犯了又退役的一个错误:
检索质量的推论:召回绝不能摘要 —— "不做摘要 —— 那是静默降智,禁止。" 召回返回一个可逆的精确切片,以
## section为粒度,按内容查询(绝不按会被蒸馏失效的过期偏移量)。4.4 测量即现实
5. 方法论 —— 我们如何决定召回什么
5.1 召回链(目标架构,部分已建)
5.2 跨域排序是分桶的,绝不全局混排
5.3 keyword 和 vector 是互补的 —— 杠杆是可比性,不是比例
调任何东西之前,我们先跑了一个 spike(12 个同义词/CJK 偏移 query 打 live
memory_vec):以及一个 cargo-cult 守卫,因为不带机制照搬一个魔数是没意义的:
最后那条规则 —— vector 缺失重归一到可用腿,绝不打 0 分 —— 正是让惰性 embedding 安全的关键。
5.4 惰性按面 embedding,而非大爆炸式索引
5.5 理由是能力,不是省 context
我们明确表态不去解一个我们没有的问题:
5.6 在产出时压缩,绝不回溯压缩
对工具输出压缩(一个兄弟 READ-路径关注点),缓存安全规则:
6. Built vs Designed(诚实章节)
我们拒绝把路线图当成品来呈现。
embed_fn,优雅降级knowledge_ftsexternal-content 损坏根因修复 + 自愈探针recall_multi只读 5 域聚合器 + 隐私门recall_context可逆的 section 粒度召回(用于被排除的 MEMORY sections)ref_count作为活的使用信号(usage → reclaim 保护 + 注入排序).memory-usage.json接到_is_reclaimable_noise+get_stage_knowledge;注意:已提交,部署待确认(二进制 mtime 11:46 早于 bridge commit 12:08)已知债务,标注而非隐藏:
[UPDATED 06-27] 已修 + 加 heal path(transcript_indexer.upsert_chunk携带与损坏knowledge_fts同一类的 external-content 写 bug。ccd9258c,run_f2ae50b3)—— FTS5'delete'现绑旧值,与knowledge_fts同源修复。✅0.6·vector + 0.4·keywordhybrid + min-max 重归一有两份独立实现(Knowledge 在recall_engine.py,Memory 在memory_embeddings.py)。重复逻辑 → 合并候选。仍开放(见 §8 开放问题 2)。ref_count使用信号是全时段累计的单向棘轮 —— 一旦热过就永久受保护。ff848626用(section,title)键修了 title-collision 的急性风险,但 recency-windowing 是独立的信号质量 epic(进行中)。7. 参考 Sources —— 什么塑造了这套架构
0.6 vector / 0.4 keyword,配 Okapi-BM25+IDF、只对 BM25 腿 min-max、vector 缺失重归一。run_*/ SHA / 路径);缓存稳定前缀8. 开放问题(真心想听听意见)
在开放中构建。上面是 READ 路径;WRITE 路径(摄取治理、7 类路由、达尔文衰减)是 Discussion #59。Recall 是 6 链回路中的一环 —— 而一个你测不了的环,默认是坏的。
🐝 SwarmAI —— Your AI Team, 24/7。Human directs, AI delivers.
All reactions