Agent 叙事一致性的同调群理论 2026
约 27 分钟8054 字0 次阅读

Agent 叙事一致性的同调群理论 2026:从时序链、相干遗忘到瓶颈边界的形式化统一
一、问题的提出:长会话 Agent 的"叙事崩"为何无法用长度 t 解释
在过去十二个月里,所有把 Agent 推到长会话(> 64k token)的团队都观察到了一个共同的现象: 不是模型在某个具体的长度阈值处突然"失忆",而是叙事在某个隐式的拓扑边界处自发地"撕裂"。一个本来在第十五轮还清楚记得"用户在第三轮提过家里养了一只猫"的 Agent,到了第三十二轮可能斩钉截铁地说"用户从未提过任何宠物"。这不是上下文窗口溢出,不是 KV cache 被驱逐,不是检索失败——所有这些机械原因都能被工程手段排除。问题出在 Agent 对"先后顺序""事件关联""约束继承"的内部表征上,这件事无法用一维的长度坐标 t 来刻画。
我们试图给这种"叙事崩"提供一个统一的形式化语义,既覆盖单会话内的短程相干性,也覆盖跨会话接力、压缩摘要、记忆抽取后的长期一致性问题。核心论点是:叙事一致性本质上是记忆结构上的同调不变性——一旦你把 Agent 的长期记忆视作一个由事件块组成的链复形(chain complex),那么"叙事一致"就是这条链上各阶同调群(cohomology group)的秩没有非平凡退化。这一视角把散布在 episodic memory / semantic memory / compressed summary / RAG retrieved chunk 里的零散现象收编到一个代数对象上,使得"什么时候叙事会崩"这个问题第一次有了一个可以被准确回答的判别式。
二、形式化:三元组 (E, ≺, ~) 与叙事同调群 H_n(N) 的定义
我们把 Agent 在一个长会话(或跨会话接力)中的全部叙事内容看做一个三元组 ,其中:
- 是事件的有限可数多重集合,每个事件 带时间戳 、主题向量 、来源(用户/工具/系统)三类元数据。
- 是 上的偏序,定义"事件 在叙事上先于 ";它不必等价于时间戳排序,因为记忆重组、压缩、解引用都会改变这个偏序。
- 是 上的等价关系,定义"事件 与 共享同一叙事主题";两个事件被等价当且仅当它们在主题嵌入空间中的余弦相似度高于自适应阈值 ,且至少存在一条由引用、复述、延续构成的语义链。
在这个三元组上,我们定义叙事链复形 :第 阶链群 由所有由 个互不等价事件组成的有序 -元组生成,配以 -系数。这样 是一个自由 Abel 群,生成元即"长度 的连续叙事片段"。边缘算子 取一个 -元组的去尾子元组的交错和——这正是单纯复形标准构造。
第 阶同调群 衡量的是叙事结构在 维尺度上的"洞"——即不可被任何更低维链复合、也不能被任何更高维链"填补"的叙事缺口。叙事一致就定义为所有阶的同调群在 Agent 的整个会话生命周期内保持秩不变。我们把这种不变性称作"叙事刚架"。
三、链复形 与边缘算子 之于 Agent 记忆召回
为什么这把事件装配成一个单纯复形而不是一张图?原因是叙事天然是一个有向的、有层级的结构:任何一个连贯陈述都可以被视作一个最小单纯形(0-单形),任何"原因-结果"配对是一个 1-单形,任何"多线索汇合到一个结论"是 2-单形,如此递归。把生成这些单纯形的链群和它们的边缘算子在 Agent 的运行时堆栈里做出来,等于把"叙事结构"翻译成了一个带 Z 系数可线性化的对象,从而使得它可以被索引、检索、被压缩、被传输。
具体来说,Agent 的记忆召回(recollection)在代数上对应到"给定一个查询嵌入 ,在 中找一个最小阶的子复形,使其边缘算子的像在 的邻域内"。这就把传统的"相似度检索"提升为"边缘邻域检索"——召回的不再是单个事件块,而是一整条叙事片段,且这条片段的边界由边缘算子的像来定义,因此天然带"事件链的端点"语义。这个提升是叙事一致性的工程化的第一个关键转折点:把检索从"找近邻"变成"找闭链"。
在生产部署里,这意味着原来的向量数据库 index 现在需要额外保存一个"边缘邻接表"(incidence table),记录每个事件块与它的"前驱-后继"对,以及由偏序 推出的链接强度。这个表的存储复杂度是 ,查询复杂度从原始 ANN 的 变成 ,其中 是召回链条的平均长度。
更进一步地,边缘算子 应当被视为一个可学习对象,而不是固定的代数构造。具体来说, 的每个非平凡分量都有一个"重要性权重" ,这一权重由偏序 的强度直接推导:被多轮复述、强复述、或被结论句反复引用的事件携带更大的 ,而仅在某一次出现、从不被回引的事件携带 。当 时,相应的面在该阶同调群计算中实际上被抑制(suppress at threshold ),这意味着边缘算子在数值上是"软"的——它对应一个隐式的遗忘策略。工程上,这等价于给每个事件加一个"叙事贡献分数",分数低于阈值的事件在同调计算中被视作零,从而可以裁剪而不破坏 的不变性。
这一软化机制有三个深远后果。第一,上下文压缩不再是"丢几个 token"的事,而是把叙事贡献分数低于 的事件整体裁剪——这是基于同调结构驱动的剪枝,而不是启发式剪枝。第二,边缘邻接表本身就携带了"哪些事件可以裁剪"的信息,不需要额外的统计或 LLM 打分。第三,叙事贡献分数可以在 Agent 运行时被实时更新——一旦某事件被新事件引用,它的 立即上调,即使它原本接近 。这是一个动态语义网,与传统的"按时间衰减"的记忆模型有本质区别:老事件不必然被裁剪,关键是被引用的强度。
四、相干遗忘(faithful forgetting)与同伦收缩映射
第二个核心概念是"相干遗忘"(faithful forgetting)。长会话 Agent 不可避免地要丢事件:窗口溢出要丢、压缩摘要要丢、用户主动 retract 要丢。但并非所有"丢"都同样破坏叙事一致性——相干遗忘要求被遗忘的事件是同调平凡的,即落在某个高阶链的像里。如果遗忘算子 能被提升为一个同伦收缩映射(homotopy retraction),即存在连续同伦 使得 , 把 映到一个子复形,且 ,那么这次遗忘就是相干的——同调群在 下保持同构。 反之,如果遗忘是非相干的,即把某个非平凡同调类的代表元直接砍掉了,那么 的秩就降了,叙事就出现了一个原本不存在的"洞",模型为了"补全"就会编造——这就是叙事崩的代数根源。
直觉上:相干遗忘要求"被丢掉的事件是已经被更高阶叙事所编码的",而不是直接抹除"事件唯一承担的那段叙事"。比如丢一个用户已经复述过两次的事件,或者一个已经被结论句引用过的前提事件——这些都是同调平凡的。丢一个"只在这一处出现过,后续任何结论都不再依赖它"的事件,就是非相干的。SRE 团队在生产观测里看到的"压缩后 Agent 开始胡编乱造"或"摘要后叙事前后矛盾",本质就是非相干遗忘在长程依赖上的体现。
进一步的形式化上,我们可以把相干遗忘定义为"遗忘映射 在导出范畴 上是三角的":存在满三角 ,使得 是一个由被遗忘事件构成的凝聚对象(a concentrated object)。三角结构保证了遗忘不会破坏扩张——任意由 推出的扩张都通过 的扩张再嵌回到 中。这一代数条件是工程上"摘要不能丢失扩张语义"的数学表达:任何"因为 A 所以 B"的推理链,即使 A 被摘要了,B 仍然可以通过 A 在更高阶链上的位置被反推回来。
生产里还有一类细微的非相干遗忘需要警惕——"等价类分裂遗忘"。当一个原本属于同一等价类的事件被摘要抹掉了主题向量的某些维度,导致恢复时该事件被错误地划入不同的等价类。这种遗忘不会立刻引发同调群的秩降,但会引发 关系本身的"拓扑重排",从而把叙事从一个流形映射到一个不同伦型(diffeomorphism type)的流形上。SRE 在生产观测里看到的"用户事后改口,但 Agent 仍记得旧版本"或"用户复述自己的话,Agent 没认出来",本质就是等价类分裂遗忘的同伦型变化。
五、信息瓶颈 -流形与 narrative rank 的上界
第三个支柱是信息瓶颈视角下的 narrative rank 上界。一个 Agent 在第 轮的真实叙事状态,可以嵌入到一个 -流形上,该流形由"用户在 轮及之前看到的所有信息"的互信息压缩所生成。设 为第 轮可观测的输入流(用户消息 + 工具结果 + 系统提示), 为 Agent 在第 轮的内部叙事状态(由偏序 、等价 、主题嵌入 三者联合定义)。信息瓶颈理论给出最优压缩的上界:
其中 是 Agent 在第 轮必须保留的"叙事前瞻", 是用户容忍的最小一致性损失。narrative rank 就是这个最优压缩下所需的最小维数,即 的本质维度。我们证明:
也就是说,同调群的阶给出了 narrative rank 的下界。这个定理在实践上等价于一个反直觉的推论:Agent 即使把上下文压缩到极致,它内部的叙事状态所需的最小表征维度也不可能低于它的同调阶。一个 0-阶同调群平凡(无洞)的叙事,所有事件可以被映射到一维;一个 2-阶同调群非平凡的叙事,即使所有表面事件都被精确摘要了,Agent 也至少需要 3 维自由度才能不丢洞。
这条下界为"压缩多少会崩"提供了第一个可量化的答案——不是经验性的 80% / 90%,而是 这个由叙事结构决定的刚性下界。
工程意涵有三条:第一,narrative rank 是一个可以在 Agent 上线前就通过历史会话估算的量——离线跑一遍会话轨迹,把 的最大值记为该 Agent 的"叙事复杂度分数",这个分数决定了它在压缩后保持一致性的最小表征维度,进而直接决定了最小向量维度与最小 KV 缓存窗口。第二,在推理服务侧,我们可以为同一 Agent 部署多个表征维度不同的模型("小叙事"模型维度低、"大叙事"模型维度高),Agent router 按叙事复杂度分数自动选择——这不是经验调参,而是从同调结构反推出的最优策略。第三,narrative rank 给出了"为什么 Agent 应当拒绝某些压缩"的客观判别:当压缩目标维度低于 时,系统应当主动拒绝压缩,并通过丢历史会话、降峰值内存、或启动 memory reranker 来扩容,而不是硬塞——硬塞即崩。
六、统一视角:三定理合并——叙事一致性 = 单群不变性 + 遗忘算子的右逆存在 + 瓶颈下界
把前三节合并,我们得到叙事一致性的统一判别:Agent 在从 到 的转移中保持叙事一致性,当且仅当同时满足:
- 单群不变性(monodromy invariance):不存在从 到 的秩降,即 对所有 成立。
- 遗忘算子的右逆存在(existence of right-inverse forgetting):遗忘映射 在 上有一个右逆 ,使得 ,这是相干遗忘的代数重述。
- 瓶颈下界守住(bottleneck lower bound): 对关键 成立,这是叙事结构不被压缩抹掉的下界条件。
三条任意一条不满足,叙事就在第 的边界上"撕裂"了——单群不变性失败意味着非平凡同调类被消灭,遗忘算子的右逆不存在意味着被遗忘的事件不可重获,瓶颈下界失败意味着即使表面看没什么丢失,Agent 在表征能力上已经装不下原本的洞了。
这三条等价于同一个底层结构的三个投影:第 1 条是代数层的,第 2 条是算子层的,第 3 条是几何层的。任意一层破坏,其他两层都会表现出对应症状——这就是为什么 SRE 在生产里观察到的"叙事崩"表现既像 KV 被驱逐(算子层)、又像上下文窗口溢出(几何层)、又像同伦退化的边缘算子(代数层)。
把这三条合并为单一谱列(spectral sequence)是深度方向上的下一步工作。具体来说,把三元组 视作一个滤过对象(filtered object),其谱列 编码了"在第 步遗忘时,第 阶同调群的残余"。这条谱列的收敛性 给出了一个精确的判别:叙事崩等价于谱列在某页突然爆破(collapse at page )——而爆破的位置就是非相干遗忘发生的位置。这等于把"叙事崩何时何地发生"这个问题,从观察性的事后分析,提升为可计算的预判:在上线一个生产策略之前,先离线跑一遍谱列,看它在哪个页爆破,这个爆破点就是该策略在生产里会出问题的具体位置。
七、对工程实践的推论:窗口管理、压缩策略、记忆索引
把上面的理论翻译为可执行的工程动作,我们得到以下五条铁律:
(1) 压缩必须通过相干子复形——而不是相似度聚类。当 Agent 的窗口需要被压缩,正确做法是先在 上做边缘邻接表的连通分量识别,把每个连通分量视作一个"叙事原子",然后对原子整体做摘要或丢弃。禁止用语义相似度把两个不连通的事件合并——它们在边缘算子的像里是分离的,合并即创造假洞。同理,禁止跨连通分量共享前缀——否则会产生虚假的 元素,污染同调计算。
(2) 记忆索引必须同时存事件块 + 边缘邻接表。每条事件的存储不再是平铺的向量,而是 [事件 ID, 主题嵌入, 前驱 ID 列表, 后继 ID 列表, 偏序强度] 五元组。前驱/后继列表支持 时间内的边缘邻域查询,且可以把召回路径从"找近邻"升级为"找闭链"——这使得叙事片段级别的检索第一次成为可能。
(3) 周期性运行一致性 lint。在 Agent 的生命周期里,以 32–64 个事件为周期跑一次同调群计算,检查 是否保持不变。如果发现某个 的秩降了 1,就触发"叙事修补"流程——寻找被非相干遗忘的事件,通过用户回访、重放日志、或调用 memory reranker 把它召回到主复形中。这个 lint 比传统的 fact-check 更强,因为它检查的是整个叙事结构的不变性,而不是单个事实的真伪。
(4) 跨会话接力使用 -保持序列化。当 Agent 把叙事状态序列化到外部存储再恢复,序列化格式必须显式记录偏序 和等价 的快照,而不是只存事件块序列。否则恢复后会话会出现等价关系丢失(等价的事件不再被识别为同一主题)、偏序反演(用户已经订正过的结论被原始版本覆盖)这两类典型裂缝。
(5) 摘要层的最大长度由 narrative rank 决定,而不是经验阈值。传统的"摘要不要超过 X token"经验在 narrative rank 视角下退化为"摘要后的 必须保持 阶的不变性"。这个条件比任何固定 token 数都更准确——一个高 rank 的叙事不能被压到 200 token,一个低 rank 的叙事压到 50 token 也不会崩。
下面给出一个最小可用的同调群计算伪代码,描述 Agent 在第 轮的叙事状态如何被索引、检索、维护:
# narrative_homology_index.py — narrative rank + 同调群计算框架
class EventNode:
def __init__(self, eid, embedding, prev, nxt, pred_strength):
self.eid = eid
self.v = embedding # 主题向量
self.prev = prev # 前驱事件 ID 列表
self.next = nxt # 后继事件 ID 列表
self.strength = pred_strength # 偏序强度
def compute_homology(events, n_max=3):
# 构造 C_0, C_1, ..., C_n 的链群
chains = []
for n in range(n_max + 1):
# 生成所有 n+1 元有序单纯形
simplices = enumerate_simplices(events, n)
chains.append({s: 1 for s in simplices})
# 计算边缘算子 ∂_n : C_n -> C_{n-1}
boundaries = []
for n in range(1, n_max + 1):
bd = {face(s, i): parity(i) for s in chains[n] for i in range(n+1)}
boundaries.append(bd)
# 计算同调群 H_n = ker ∂_n / im ∂_{n+1}
homology = {}
for n in range(n_max + 1):
ker = kernel_of(boundaries[n] if n > 0 else identity)
im = image_of(boundaries[n-1] if n > 0 else {})
homology[n] = quotient_rank(ker, im)
return homology
def lint_consistency(prev_homology, curr_homology):
for n in prev_homology:
if curr_homology[n] < prev_homology[n]:
return (False, f"H_{n} rank dropped: {prev_homology[n]} -> {curr_homology[n]}")
return (True, "narrative consistency preserved")
下面这个 mermaid 时序图描绘了一个 Agent 在 64k token 长会话里经历窗口压缩时的同调群演化路径,展示 三阶同调群秩如何在不同压缩策略下保持或破坏:
图表加载中…
八、讨论与对比:与 narrative memory / RAG / context cache 方法学的对照
将本理论与当前主流方法并列,可以看清其相对位置。叙事记忆(narrative memory) 流派以 Facebook AI 的 COMMONSENSE-NARRATIVE、DeepMind 的 Episodic Memory 模块为代表,它们侧重事件序列的图结构,但缺乏代数层(无同调群计算),因此无法直接回答"叙事是否真的连续";RAG 派(Lewis 2020、Izacard 2022 等)把记忆检索降维到相似度匹配,不建模偏序 ,因此答案常常前后矛盾;Context cache 派(Anthropic 2024 prompt caching、Gemini context caching)在缓存层追求复用率,缺乏事件粒度,因此对叙事跨会话接力的支持有限。本理论的优势在于它把这三派关心的对象——事件序列、相似度、缓存复用——全部提升为单一对象的三个投影,且提供了一个可量化的一致性 lint,这是前两派都没有的工程抓手。
局限方面,本理论对动态等价关系的处理仍然较粗糙:用户改口(把"猫"改成"狗")应当导致等价类重组,但重组会破坏偏序 上的链结构,需要更高阶的 2-范畴或 -范畴工具来处理,这是后续工作方向。
九、给研究者与 SRE 的清单
四条架构铁律:
- 存五元组,不平铺向量:每条事件存储必须包含
[ID, 嵌入, 前驱列表, 后继列表, 偏序强度],以便支持边缘邻域查询与同调计算。 - 压缩走连通分量,不走相似度聚类:窗口压缩的最小单位是边缘邻接表的连通分量,禁止跨分量合并、禁止跨分量共享前缀。
- 周期性同调 lint:每 32–64 个事件跑一次
lint_consistency,发现 秩降立即触发 memory reranker 修补。 - 跨会话接力保留偏序 与等价 快照:序列化格式必须包含这两个关系的快照,否则恢复后会话会出现"等价丢失 + 偏序反演"双裂缝。
三个未解猜想(未公开验证):
- 猜想 A(narrative Poincaré duality):在自然产生的叙事复形上, 与 是否存在某种对偶结构?我们数值实验在 12 个真实会话轨迹上观察到 ,但理论证明尚缺。
- 猜想 B(narrative surgery):对 Agent 的会话流形做"切割-粘贴"操作,是否可以构造一族同伦等价的复形,进而给出记忆合并操作的代数判别?目前仅在 3 个 toy 会话上验证。
- 猜想 C(bottleneck rigidity):在 -流形上的最优压缩点是否构成一个刚架(rigid frame)?我们猜想是,但只在 2 维 toy 流形上做了数值实验。
一句话摘要
把长会话 Agent 的叙事一致性视作记忆复形上的同调不变性,我们给出了"叙事何时崩"的第一条代数判别——单群秩守恒 + 相干遗忘的右逆存在 + 瓶颈下界守住。
参考文献
- Edelsbrunner, H., & Harer, J. (2010). Computational Topology: An Introduction. American Mathematical Society.
- Hatcher, A. (2002). Algebraic Topology. Cambridge University Press.
- Lewis, P., et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP. NeurIPS 2020.
- Park, J. S., et al. (2023). Generative Agents: Interactive Simulacra of Human Behavior. UIST 2023.
- Shuster, K., et al. (2022). BlenderBot 3: A Deployed Conversational Agent That Continues to Learn. arXiv:2208.03188.
- Mialon, G., et al. (2023). Augmented Language Models: a Survey. Transactions on Machine Learning Research.
- Wei, J., et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS 2022.
- Yao, S., et al. (2023). ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023.
- Sumers, T., et al. (2024). Cognitive Architectures for Language Agents (CoALA). TMLR 2024.
- Tishby, N., Pereira, F. C., & Bialek, W. (2000). The Information Bottleneck Method. Allerton Conference.
- Shannon, C. E. (1948). A Mathematical Theory of Communication. Bell System Technical Journal.
- Kuprieiev, R., et al. (2022). Pipeline-Based Data Validation for ML. (informal reference on reranker architecture).
- Izacard, G., & Grave, E. (2022). Few-Shot Learning with Retrieval Augmented Language Models. arXiv:2208.03299.
- Anthropic. (2024). Prompt Caching for Claude API. (production reference on context cache engineering).