engine-consolidation.zh.md
docs/i18n/engine-consolidation.zh.md
自动合并 — 引擎的睡眠周期
<!-- translations:start -->
English · 한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch
<!-- translations:end -->
大脑在休息时会整合记忆。当你睡觉时,一天的原始经验会被重新组织、压缩和集成——最近的、嘈杂的东西会被折叠成持久的结构。Tesserae的引擎也做同样的事情。当一个项目变得空闲时,始终运行的守护进程停止等待下一次编辑,并花费安静的时间重新组织它已经知道的东西:它压缩并遗忘最近的嘈杂记忆,让没有人检索过的知识因不使用而褪色,以及发现生存下来的东西之间的新连接。
到目前为止,该通道仅在你要求时运行——在内存压力下使用tesserae refresh,或显式tesserae distill。引擎在每个文件和会话事件上重新编译,但从不自动合并。睡眠周期关闭了这个间隙:让tesserae engine继续运行,合并会在休息期间发生,没有需要记住的命令。
像分层记忆系统中的所有东西一样,这是除非你选择加入,否则无操作 ——守护进程在空闲时合并,但其下的蒸馏仅在设置TESSERAE_AGENT_DISTILL时才起作用。
何时触发
专用合并线程在固定检查间隔(默认30秒)醒来,并根据单调活动时钟评估两个独立触发器:
- 空闲触发器。 项目在至少
--consolidate-idle秒内没有看到触发事件或管道运行(默认300s = 5分钟)。这是"休息时合并"的情况——引擎注意到你停止了工作,并利用了暂停。自上次合并以来的下限可防止抖动,因此刚刚变得安静的繁忙项目不会在敏感的触发器上合并。 - 上限触发器。 自上次合并以来无论活动如何至少已经过了
--consolidate-every秒(默认21600s = 6h)。这保证了持续繁忙的项目仍会定期合并,而不是永远没有安静的时刻。将其设置为0会禁用上限——那么空闲是唯一的触发器。
每次编辑、会话轮次或重新编译都会增加活动时钟,所以空闲窗口仅在真正的休息期间经过。两个时钟都是单调的,永不壁钟,也永不持久化为任何工件——合并计时永远无法扰乱字节确定性图。
运行内容——三个操作
每次触发都会从.tesserae/graph.json加载编译的图(如果文件不存在,跳过通道),并按顺序运行三个合并操作。总的来说,它们反映了休息的大脑所做的事情:压缩最近的嘈杂东西,让从未重新访问过的东西褪色,并在生存下来的东西之间进行新的关联。
1. 压缩/遗忘——蒸馏
调用tesserae refresh用来重新组织、压缩和安全遗忘每个代理记忆的相同maybe_distill_on_refresh入口点。该函数在内部是三重门控的,永远不会因每个代理的失败而上升:
- 选择加入门 ——
TESSERAE_AGENT_DISTILL=1(或config.json中的{"agent_distill": {"enabled": true}})。默认关闭;整个周期是安全的无操作,直到你设置它。 - 每个代理的水位标记 ——自上次蒸馏以来发现没有改变的代理会被跳过。
- 每个代理的内存压力 ——仅当未蒸馏的发现不再适合上下文读取的一半时,代理才会被合并(MemGPT风格的触发)。
所以即使合并在计划上触发,它也仅对选择加入并实际积累了足够新内存的代理有效。有关蒸馏产生的内容,请参见分层代理内存。
2. 因不使用而遗忘——检索上的LRU衰减,而非仅年龄
蒸馏的衰减不再仅由创建年龄驱动。每个读取表面都会记录对其返回的发现的访问——last_accessed_at和access_count——到node_memory侧车中,永不进入graph.json。在蒸馏通道计算衰减之前,它将该实时访问状态合并到其工作视图中,因此自创建以来未检索过的发现会衰减并有资格被吸收或降级,而最近读取的发现则保持新鲜,无论其年龄。这是检索最近性,这是应用于记忆的LRU(最近最少使用)直觉:你持续提取的知识保留;没有人请求的知识首先褪色。空的侧车完全准确地重现了旧的仅年龄的行为,因此完全向后兼容。
3. 关联——发现新连接
最终操作寻找生存者之间的*新*关系。它嵌入蒸馏的笔记并链接意义接近的对——嵌入门控,因此仅当配置了真实嵌入后端时才运行(哈希存根被跳过,永不产生噪声链接)。发现在项目内和跨代理运行,它找到的连接被铸造为携带federation_semantic标记的shares_concept_with边。
至关重要的是,这些发现的边被写入.tesserae下的侧车覆盖层,*永远不会*进入graph.json。覆盖层跨周期累积——每个关联通道对先前通道发现的内容进行去重并扩展。在读取时(查询、PPR扩展、联合视图),覆盖层仅在内存中合并到图中,完全像每个代理视图覆盖层一样——所以字节确定性graph.json永远不会被接触。整个操作被包装且永不上升到守护进程循环中。
安全性和确定性
- 在编译门下运行。 合并获取与重新编译相同的锁,因此与编译序列化且从不重叠。待处理的编译等待进行中的合并,反之亦然——图永远不会在写入中途被读取。
- 永不上升到守护进程循环。 整个通道都被包装;任何错误都被记录,线程继续循环。失败的合并永远不会使引擎关闭。
- 当门关闭时无操作。 未设置
TESSERAE_AGENT_DISTILL时,通道不加载任何昂贵的东西并立即返回,因此让睡眠周期保持开启本质上没有成本。 - 确定性工件,不变。 蒸馏的工件给定其输入时保持确定性;睡眠周期仅改变蒸馏何时运行,永远不改变它产生的内容。空闲时间永不泄露到
graph.json或任何蒸馏层。 graph.json保持字节幂等。 两个新操作都不会写入它。访问状态存在于node_memory侧车中,发现的连接在累积覆盖中——两者都在.tesserae下,两者都仅在读取时在内存中合并。权威图字节不受检索历史或发现链接的影响。- 干净关闭。 合并线程观察守护进程的停止事件,并在
Ctrl-C/关闭时迅速退出。它仅是长运行模式特性:tesserae engine ... --once永不启动它。
CLI标志
| 标志 | 默认值 | 效果 |
|---|---|---|
--consolidate / --no-consolidate | on | 完全启用或禁用睡眠周期。默认启用(如果未设置蒸馏门,则无操作)。 |
--consolidate-idle SECONDS | 300 | 休息窗口:在这许多秒无活动后合并。 |
--consolidate-every SECONDS | 21600 | 上限:无论活动如何,至少这么频繁地合并。0禁用上限。 |
--consolidate-check SECONDS | 30 | 合并线程唤醒以重新评估触发器的频率。 |
舰队行为(--all)
tesserae engine --all在一个进程中保持每个注册项目的最新状态。每个项目单元获得自己的合并线程,具有相同的旋钮,所有单元共享一个舰队范围的编译门——因此一个项目的合并与整个舰队的编译序列化,从不重叠任何一个。
完成的示例
打开蒸馏,然后使用更快的睡眠周期运行引擎以获得演示——在60秒空闲后合并,无论如何至少每30分钟:
export TESSERAE_AGENT_DISTILL=1
tesserae engine \
--consolidate-idle 60 \
--consolidate-every 1800 \
--consolidate-check 15
像往常一样在编辑器和代理中工作;引擎观察、防抖并重新编译每项更改。停止一分钟,空闲触发器触发:合并线程获取编译门并蒸馏任何内存压力下的代理——重新组织、压缩和安全遗忘——然后回到睡眠。继续工作超过半小时标记,无需暂停,上限也触发,因此无情的项目仍会合并。
要保持引擎运行但将合并留给手动tesserae distill运行,请传递--no-consolidate。要让它在空闲时运行但从不在固定计划上,请传递--consolidate-every 0。