SuperLocalMemory V3: Information-Geometric Foundations for Zero-LLM Enterprise Agent Memory

Paper: arXiv:2603.14588 Code: qualixar/superlocalmemory Code reference: main @ 308404ba (2026-05-24)

1. Motivation (研究动机)

当前 agent memory 的三个结构性短板

这篇论文的核心问题不是“再做一个记忆库”,而是指出当前 agent memory 的底层机制过于工程化:检索几乎统一依赖 embedding cosine similarity,记忆衰减依赖固定 TTL、指数衰减或访问次数阈值,跨项目/跨会话的矛盾检测通常没有形式化机制。作者认为这会在企业场景里变成可靠性瓶颈:一个长期运行的 agent 会积累大量 facts、用户、项目和上下文,如果相似度、生命周期和一致性都靠 heuristic,系统规模变大时无法说明它为什么还应该正确。

第一类问题是 uncertainty-blind retrieval。Cosine similarity 把每个 embedding 维度当成同等可信,但实际表示空间的不同维度有不同统计稳定性:有的维度承载稳定语义,有的维度接近噪声或分布尾部。论文希望用 Fisher information / Fisher-Rao metric 把“维度可信度”纳入检索分数,让低方差、高置信的语义维度对排名贡献更大。

第二类问题是 unprincipled lifecycle dynamics。现有 memory 系统通常把“遗忘”写成固定衰减函数,例如距离上次访问多久、访问次数多少、TTL 是否过期。论文认为这类规则不能随 memory manifold 的统计结构自适应,也没有稳定分布或收敛保证。作者因此把 memory lifecycle 建模为 Poincaré ball 上的 Riemannian Langevin dynamics,让活跃、高重要性的记忆靠近原点,长期未用的记忆自然漂向边界。

第三类问题是 cross-context contradiction。企业 agent 会跨项目、跨会话、跨用户记录事实,例如同一个 API 在一个项目里被记为 REST,在另一个上下文里被记为 GraphQL。单纯向量检索很难判断“两个相关事实是否不能同时成立”。论文把 memory context graph 视为 sheaf,使用 coboundary norm / first cohomology 的语言识别不可调和的局部不一致,并在存储阶段写入 supersedes 等图边。

论文要解决的具体目标

SLM-V3 的目标是在 zero-LLM / local-first 约束下,为 agent memory 建立一套可以解释、可扩展、可合规的数学基础:检索用信息几何替代单一 cosine,生命周期用随机动力学替代手写衰减,一致性用 sheaf cohomology 替代临时字符串/LLM 判定。这个目标特别面向企业 agent:数据不能随便出本地或租户边界,记忆需要跨长时间尺度运行,系统还要能解释为什么某条旧记忆被保留、降权或替换。

为什么值得研究

一旦 agent memory 有形式化检索和一致性基础,系统可以更自然地支持百万级 memories、多租户 profile isolation、合规审计和长期任务连续性。论文强调 Mode A 的 zero-cloud 设计在架构上满足 EU AI Act / data sovereignty 的方向:检索、重排、存储、矛盾检测都在本地 CPU 上完成;Mode B/C 只把 LLM 作为 answer synthesis / sufficiency verification 的增强,而不是检索本身的必要条件。

2. Idea (核心思想)

核心 insight:agent memory 不是普通向量数据库,而是带不确定性、生命周期和上下文一致性约束的统计-拓扑对象。因此,检索分数应该来自统计 manifold 上的 precision-weighted distance,记忆保留/遗忘应该来自带平稳分布的动力学过程,矛盾检测应该来自 context graph 上局部 sections 是否能拼成全局一致 section。

关键创新可以压缩成三层:第一,给每条 memory 的 embedding 附加 per-dimension variance,把 memory 表示为 diagonal Gaussian ,再用 Fisher-information-weighted score 替代纯 cosine;第二,把记忆状态 放在 Poincaré ball 内,用 Riemannian Langevin SDE 生成 lifecycle weight;第三,把上下文图建成 sheaf,用 coboundary norm 在 store time 找 contradictions 并写入图结构。

与 Mem0、Zep、MemGPT 一类系统的根本差异在于:那些系统通常把 LLM summarization、embedding retrieval、heuristic decay 和 prompt engineering 组合起来;SLM-V3 把 cloud LLM 从检索核心里移出去,试图让“该召回什么、该保留什么、该替换什么”由本地可复现的数学层决定。它并不声称 Mode A 的最终回答质量超过 cloud-heavy 系统,而是声称检索质量与合规边界可以在 zero-LLM 条件下显著逼近主流系统。

3. Method (方法)

3.1 Overall framework:本地化 ingest + 多通道 retrieve + 三个数学层

Figure 1 解读:左侧是 store / ingestion pipeline:内容先被 embedding 成 ,再抽取 metadata、entities、semantic facts、emotions / beliefs,并构造 entity graph;随后 sheaf consistency checker 在图边上检测矛盾,必要时创建 supersedes edges;最后通过 entropy gate 过滤低信息内容并持久化到 SQLite。中间是 retrieval pipeline:query 先分类,再进入 Fisher semantic、BM25、entity graph、temporal reasoning 等信号源,之后用 WRRF 融合并重排。右侧是三层数学贡献:Fisher-Rao retrieval、sheaf consistency、Riemannian Langevin lifecycle。底部的 Mode A/B/C 说明系统从 fully local zero-LLM 到 cloud-augmented 的隐私-能力梯度。

论文中的 memory tuple 是: 直觉上, 是“记忆在哪里”, 是“这个位置在每个维度上有多可靠”,entities/facts 是可结构化检索和图传播的锚点,timestamps / access counts 则喂给 lifecycle dynamics。它不是把所有内容塞进一个 embedding,而是把一条 memory 拆成向量、图节点、时间事件、置信度和生命周期状态。

3.2 Ingestion pipeline:从原始文本到可检索 facts

论文描述的 store pipeline 有 11 步:embedding、metadata extraction、named entity extraction、semantic fact extraction、emotion/belief detection、entity graph construction、sheaf consistency checking、foresight prediction、observation construction、entropy gating、SQLite persistence。Released code 中 src/superlocalmemory/core/store_pipeline.pyrun_store / enrich_fact 与这个设计基本对应:enrich_fact 先调用 embedder 得到 embedding,再计算 Fisher parameters,解析 canonical entities 和 temporal metadata,初始化 8 维 Langevin position,并把 fact 写成 AtomicFact;随后 run_store 做 consolidation、ANN/vector-store upsert、context generation、graph edges、AutoLinker、sheaf check 和 temporal validation。

如果去掉 ingestion 的结构化步骤,后续检索会退化成普通 vector search:BM25 没有 token table,entity graph 没有边,sheaf 没有可检查的上下文连接,temporal channel 也只能从原始文本临时猜日期。这也是论文强调 SQLite schema / profile isolation 的原因:记忆系统的“可检索性”很大一部分是在写入时预计算出来的。

def store_memory(content, profile_id, db, embedder, extractors, graph, sheaf_checker):
    record = make_memory_record(content, profile_id)
    facts = extractors.fact_extractor.extract(content)
    if not facts:
        facts = [fallback_semantic_fact(content)]
 
    stored_ids = []
    for fact in facts:
        embedding = embedder.embed(fact.content)
        fisher_mean, fisher_variance = embedder.compute_fisher_params(embedding)
        canonical_entities = extractors.entity_resolver.resolve(fact.entities, profile_id)
        temporal = extractors.temporal_parser.extract_dates_from_text(fact.content)
        langevin_position = init_langevin_position(dim=8, radius=0.05)
 
        atomic = AtomicFact(
            content=fact.content,
            embedding=embedding,
            fisher_mean=fisher_mean,
            fisher_variance=fisher_variance,
            canonical_entities=list(canonical_entities.values()),
            referenced_date=temporal.get("referenced_date"),
            langevin_position=langevin_position,
        )
        db.store_fact(atomic)
        graph.build_edges(atomic, profile_id)
 
        if sheaf_checker and atomic.embedding and atomic.canonical_entities:
            for contradiction in sheaf_checker.check_consistency(atomic, profile_id):
                if contradiction.severity > 0.45:
                    db.store_edge(GraphEdge(
                        source_id=atomic.fact_id,
                        target_id=contradiction.fact_id_b,
                        edge_type="supersedes",
                        weight=contradiction.severity,
                    ))
        stored_ids.append(atomic.fact_id)
    return stored_ids

3.3 Information-geometric retrieval:用 variance-weighted score 替代纯 cosine

论文把每条 memory 的 embedding 扩展成 diagonal Gaussian。给定 embedding ,先归一化 ,再用维度信号强度估计方差: 然后为了避免新写入 memory 的 variance 估计太不稳定,系统在前 10 次 access 内从 cosine 平滑过渡到 Fisher score: 核心检索分数是: 直觉:如果两个 memory 与 query 的 cosine 一样近,但其中一个在关键维度上方差更小,Fisher score 会更偏向它,因为它代表更“确定”的语义证据。这样做在 复杂度下保留了向量检索的效率,却把局部统计精度纳入了排序。

def fisher_semantic_score(query_embedding, fact_embedding, fact_variance, temperature=15.0):
    # Mirrors released default: simplified Mahalanobis-like Fisher-Rao scoring.
    q = torch.tensor(query_embedding, dtype=torch.float32)
    f = torch.tensor(fact_embedding, dtype=torch.float32)
    var = torch.clamp(torch.tensor(fact_variance, dtype=torch.float32), min=1e-6)
    distance = torch.sum((q - f) ** 2 / var)
    return torch.exp(-distance / temperature).item()
 
 
def compute_fisher_params(embedding):
    e = torch.tensor(embedding, dtype=torch.float64)
    norm = torch.linalg.vector_norm(e)
    if norm < 1e-10:
        return torch.zeros_like(e), torch.ones_like(e)
    mean = e / norm
    signal = torch.abs(mean) / (torch.max(torch.abs(mean)) + 1e-10)
    variance = VAR_MAX - (VAR_MAX - VAR_MIN) * signal
    return mean, torch.clamp(variance, VAR_MIN, VAR_MAX)

论文公式与 released code 实现差异:论文写 ,但 src/superlocalmemory/core/embeddings.py::compute_fisher_params 返回的是 normalized mean;论文呈现的是 Fisher-information-weighted score,released code 的默认 fisher_mode="simplified"src/superlocalmemory/retrieval/semantic_channel.py::_compute_fisher_sim 使用 fact variance 的 Mahalanobis-like score,完整 Atkinson-Mitchell geodesic 只在 fisher_mode="full" 且 query/fact variance 都存在时启用。

3.4 Four/six-channel retrieval and WRRF fusion

论文主体把检索写成四个核心通道:Fisher semantic、BM25 keyword、entity graph、temporal reasoning;另外有 profile lookup、scene expansion、bridge discovery 三个补充 stage。WRRF 公式为: 其中 是 memory 在第 个通道里的 rank,不出现则贡献 0。Query strategy classifier 会按 single-hop、multi-hop、temporal、aggregation/open-domain 调整 channel weights;multi-hop 更偏 entity graph,temporal query 更偏 temporal channel。

Released code 中 src/superlocalmemory/retrieval/engine.py::recall 的实际流程是:query classification → profile shortcut → active channels → weighted_rrf → multi-hop cross-channel intersection boost → bridge discovery → scene expansion → entity graph post-RRF boost → cross-encoder rerank → load top facts。BM25 使用 rank_bm25.BM25Plus(k1=1.2, b=0.75) 并给 exact phrase 1.5× bonus;temporal channel 同时做 entity-temporal search 和 date proximity;entity graph 在新版本中既保留 standalone search,又在 engine 中以 score_candidates 形式作为 post-RRF booster。

def recall(query, profile_id, strategy, channels, config, db, reranker=None):
    # Released implementation: strategy -> channels -> RRF -> expansion/boost -> rerank.
    weights = strategy.classify(query).weights
    channel_results = {}
 
    query_embedding = embed_once_if_needed(query)
    if "semantic" not in config.disabled_channels:
        channel_results["semantic"] = channels.semantic.search(query_embedding, profile_id, top_k=50)
    if "bm25" not in config.disabled_channels:
        channel_results["bm25"] = channels.bm25.search(query, profile_id, top_k=50)
    if "temporal" not in config.disabled_channels:
        channel_results["temporal"] = channels.temporal.search(query, profile_id, top_k=50)
    if channels.hopfield is not None:
        channel_results["hopfield"] = channels.hopfield.search(query_embedding, profile_id)
    if channels.spreading_activation is not None:
        channel_results["spreading_activation"] = channels.spreading_activation.search(query_embedding, profile_id)
 
    fused = weighted_rrf(channel_results, weights, k=config.rrf_k)
    fused = bridge_discover_and_scene_expand(fused, db, profile_id)
 
    candidate_ids = [x.fact_id for x in fused[:100]]
    graph_scores = channels.entity_graph.score_candidates(query, candidate_ids, profile_id)
    fused = boost_by_entity_graph(fused, graph_scores, weight=weights.get("entity_graph", 1.0))
 
    if reranker is not None:
        fused = reranker.blend_cross_encoder_and_rrf(query, fused, alpha=strategy.alpha)
    return load_top_facts(fused, db, limit=config.top_k)

论文公式与 released code 实现差异:论文叙述是 four-channel retrieval 且 WRRF ;released code 的 src/superlocalmemory/core/engine_wiring.py::init_retrieval 会注册 semantic、BM25、entity_graph、temporal,并可加入 spreading_activationhopfield 作为第 5/6 通道;src/superlocalmemory/retrieval/engine.py::_run_channels 还注释说明 entity graph 现在主要作为 post-RRF signal enhancer,而不是独立通道;src/superlocalmemory/core/config.py::RetrievalConfig 默认 rrf_k=15,不是论文中的 60。

3.5 Sheaf-theoretic consistency:在 store time 检测跨上下文矛盾

Memory sheaf 把 context graph 中的每个顶点 视为一个上下文,每个 stalk 是该上下文内 memory embeddings 的空间;边 上的 restriction map 表示从一个上下文到另一个上下文时共享事实应如何投影。Coboundary operator 是: 如果 ,说明局部 facts 能拼成全局一致 section;如果 discrepancy 很大,则表示存在跨上下文冲突。论文进一步把 contradiction score 写成: Released code 的 src/superlocalmemory/math/sheaf.py::check_consistency 实际在新增 fact 的图边邻居上计算 edge-type-specific restriction map 和 coboundary norm;若 severity 超过 threshold,就返回 contradiction,并在 store_pipeline.py 中写入 EdgeType.SUPERSEDES。因此它不是 retrieval-time LLM judge,而是写入阶段的图一致性维护。

def check_sheaf_consistency(new_fact, db, threshold=0.45):
    if new_fact.embedding is None or not new_fact.canonical_entities:
        return []
    contradictions = []
    x = torch.tensor(new_fact.embedding, dtype=torch.float64)
 
    for edge in db.get_edges_for_node(new_fact.fact_id, new_fact.profile_id):
        if edge.edge_type in {"contradiction", "supersedes"}:
            continue
        other = db.get_fact_embedding(edge.other_endpoint(new_fact.fact_id))
        if other is None:
            continue
        y = torch.tensor(other, dtype=torch.float64)
        restriction = restriction_for_edge_type(edge.edge_type, x, y)
        severity = torch.linalg.vector_norm(restriction @ x - y).pow(2) / (torch.linalg.vector_norm(x).pow(2) + 1e-8)
        if severity.item() > threshold:
            contradictions.append((edge.other_endpoint(new_fact.fact_id), min(severity.item(), 1.0)))
    return contradictions

3.6 Riemannian Langevin lifecycle:用几何位置生成 retrieval weight

SLM-V3 把每条 memory 的生命周期状态放在 Poincaré ball 中。论文的连续动力学是: $ d\xi = -\lambda_{\xi}^{-2}\nabla_E U(\xi)dt

  • \sqrt{2T}\lambda_{\xi}^{-1}dW
  • \frac{1}{2}T(d-2)\lambda_{\xi}^{-1}\xi dt, \quad \lambda_\xi=\frac{2}{1-|\xi|^2}. U(\xi)=\alpha|\xi|^2-\beta\cdot n_{\text{access}}(\xi)-\gamma\cdot r(\xi,c). \xi_{t+1}=\xi_t-\lambda_{\xi_t}^{-2}\nabla_EU(\xi_t)\Delta t +\frac{1}{2}T(d-2)\lambda_{\xi_t}^{-1}\xi_t\Delta t +\sqrt{2T\Delta t}\lambda_{\xi_t}^{-1}\eta_t. $ Released code 的 src/superlocalmemory/math/langevin.py 还额外加入 Ebbinghaus-style outward forgetting drift:access 和 importance 越高,memory strength 越高,向边界漂移越弱;最终 retrieval weight 按 radius 从原点到边界线性衰减。生命周期状态阈值为 Active <0.3、Warm <0.55、Cold <0.8、Archived >=0.8
def langevin_step(position, access_count, age_days, importance, dt=0.005, temperature=0.3):
    xi = torch.tensor(position, dtype=torch.float64)
    radius_sq = torch.clamp(torch.dot(xi, xi), max=0.99 ** 2)
    lam = 2.0 / (1.0 - radius_sq + 1e-8)
    lam_inv = 1.0 / lam
 
    grad_u = potential_gradient(xi, access_count, age_days, importance)
    drift = -(lam_inv ** 2) * grad_u * dt
 
    strength = max(0.5, 0.3 * math.log1p(access_count) + 0.4 * importance)
    forget_rate = 1.0 / strength
    outward = xi / (torch.linalg.vector_norm(xi) + 1e-8)
    forgetting_drift = forget_rate * outward * dt * 0.1
 
    correction = 0.5 * temperature * (len(xi) - 2) * lam_inv * xi * dt
    diffusion = math.sqrt(2.0 * temperature * dt) * lam_inv * torch.randn_like(xi)
    new_xi = project_to_open_unit_ball(xi + drift + forgetting_drift + correction + diffusion)
    weight = 1.0 - torch.linalg.vector_norm(new_xi).item() / 0.99
    return new_xi.tolist(), max(0.0, min(1.0, weight))

3.7 Code-to-paper mapping

Code reference: main @ 308404ba (2026-05-24) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
Store / ingestion pipelinesrc/superlocalmemory/core/store_pipeline.pyrun_store, enrich_fact
Fisher parameter constructionsrc/superlocalmemory/core/embeddings.pycompute_fisher_params
Fisher semantic retrievalsrc/superlocalmemory/retrieval/semantic_channel.pySemanticChannel.search, _compute_fisher_sim
BM25 channelsrc/superlocalmemory/retrieval/bm25_channel.pyBM25Channel.search
Entity graph retrieval / boostersrc/superlocalmemory/retrieval/entity_channel.pyEntityGraphChannel.search, score_candidates
Temporal retrievalsrc/superlocalmemory/retrieval/temporal_channel.pyTemporalChannel.search
WRRF fusionsrc/superlocalmemory/retrieval/fusion.pyweighted_rrf
Retrieval orchestrationsrc/superlocalmemory/retrieval/engine.pyRetrievalEngine.recall, _run_channels, _apply_reranker
Channel wiring and reranker configsrc/superlocalmemory/core/engine_wiring.pyinit_retrieval
Sheaf contradiction detectionsrc/superlocalmemory/math/sheaf.pySheafConsistencyChecker.check_consistency
Langevin lifecycle dynamicssrc/superlocalmemory/math/langevin.pyLangevinDynamics.step, compute_lifecycle_weight
Runtime config / ablation knobssrc/superlocalmemory/core/config.pyRetrievalConfig, MathConfig, mode factory

4. Experimental Setup (实验设置)

Dataset and scale

主要数据集是 LoCoMo conversational memory benchmark。论文说明 LoCoMo 包含 10 个 multi-session conversations,总计 1,986 个问题,覆盖 single-hop、multi-hop、temporal、open-domain 四类。实际报告里有多种 scoring subset:Mode A Raw appendix 表给出 10 个 conversations 中 1,276 个已评分问题;Fisher-vs-cosine 数学贡献实验覆盖 6 个 conversations、832 个问题;Mode C 详细结果只在 conv-30 的 81 个问题上报告。

Baselines

主表比较了 EverMemOS、Hindsight、Zep v3、MemOS v2、Mem0,以及 SLM-V3 的 Mode A Raw、Mode A Retrieval、Mode C。这里的对比要注意部署形态:EverMemOS / Hindsight / Zep / MemOS / Mem0 多依赖 cloud LLM 或 cloud embedding;SLM-V3 Mode A Raw 是 zero-LLM answer construction,Mode A Retrieval 用外部 LLM 只做 answer synthesis 以隔离 retrieval quality,Mode C 则使用 cloud embedding 和 cloud LLM。

Metrics

论文采用 LLM-as-Judge scoring:judge model 是 gpt-4.1-mini,每个回答按 1–5 Likert scale 评分,rating 记为 correct,再转成 accuracy。主表按 single/multi/temporal/open-domain 分类别报告 accuracy,并给 aggregate。Ablation 还报告相对 full system 的 percentage-point delta;统计分析中对 conv-30 full system 用 1,000 次 bootstrap 给出 95% CI [53.4, 74.0]

Implementation / training config

这不是传统训练论文,主要是系统配置和评测配置。论文实验在 Azure Container Instances 上运行:每个 container 分配 2 vCPUs / 4 GB RAM,Python 3.12 + PyTorch 2.10 CPU-only,本地 SQLite 数据库;111 个 containers 分布在 3 个 Azure subscriptions、eastus2swedencentral,每个处理一个 (conversation, configuration) pair;完整评测包含 10 个 LoCoMo conversations 和 8 个 ablation configurations;总估算成本 $9–15 USD。

论文配置:Mode A Raw 使用 nomic-embed-text-v1.5 768-d embedding 和 bge-reranker-v2-m3 cross-encoder,所有模型 baked into container;Mode A Retrieval 检索同 Mode A Raw,但用 gpt-4.1-mini 生成答案;Mode C 使用 text-embedding-3-large 3072-d embeddings,并用 gpt-4.1-mini 做 answer generation 和 judge。代码配置需要单独记录:src/superlocalmemory/core/config.py 当前 default RetrievalConfig.rrf_k=15semantic_top_k=50bm25_top_k=50use_cross_encoder=Truecross_encoder_model="cross-encoder/ms-marco-MiniLM-L-12-v2"MathConfig 当前 default fisher_temperature=15.0langevin_dt=0.005langevin_temperature=0.3、Mode A sheaf threshold 0.45、Mode C sheaf threshold 0.65。这些数字来自 released code config,而不是论文表格的默认叙述。

5. Experimental Results (实验结果)

Main LoCoMo results

SystemSingleMultiTemporalOpenAggregate
EverMemOS96.191.189.770.892.3
Hindsight86.270.895.183.889.6
Zep v390.881.977.375.085.2
SLM-V3 Mode C64.0100.086.087.7
MemOS v285.479.475.164.680.8
SLM-V3 Mode A Retrieval72.070.380.085.074.8
Mem069.061.758.350.064.2
SLM-V3 Mode A Raw57.543.063.072.060.4

这个表的关键信息是:SLM-V3 Mode A Raw 的最终回答准确率不如 LLM-heavy 系统,但 Mode A Retrieval 的 74.8% 说明本地多通道检索已经能召回相当多可用证据;Mode A Retrieval 在 open-domain 上达到 85.0%,是表中最高值。Mode C 在 conv-30 的 81 个问题上 aggregate 87.7%,接近 Zep v3 的 85.2% 和 Hindsight 的 89.6%,但它不是完整 10 conversations 的同规模结果。

Figure 2 解读:这张图把 LoCoMo accuracy 和 cloud dependency 放在一起看。SLM-V3 的定位不是绝对最高分,而是用 local-first / zero-LLM retrieval 换取合规和可复现;Mode C 则展示如果允许 cloud embedding + LLM answer generation,SLM-V3 可以靠近主流 cloud-dependent memory systems。

Ablation results

ConfigurationLoCoMo (%)Δ (pp)
SLM-V3 full system60.4
− Fisher metric (fisher_off)49.6−10.8
− Sheaf consistency (sheaf_off)58.7−1.7
− All math layers (all_math_off)52.8−7.6
− BM25 channel (bm25_off)53.9−6.5
− Entity graph (entity_off)59.4−1.0
− Temporal channel (temporal_off)60.2−0.2
− Cross-encoder (cross_encoder_off)29.7−30.7

Figure 5 解读:最大贡献来自 cross-encoder reranking,移除后下降 30.7 pp(Δ = -30.7 pp);数学层中 Fisher metric 的单项贡献最大,下降 10.8 pp;BM25 下降 6.5 pp,说明 exact lexical evidence 仍是 agent memory 中不可替代的信号。Sheaf、entity、temporal 在 conv-30 单 conversation 上 delta 较小,论文也承认这些较小差异的置信区间可能重叠。

Figure 4 解读:分类型 ablation 显示 multi-hop 最敏感:cross-encoder removal 让 multi-hop 从 50% 掉到 15%,BM25 removal 掉到 23%,all-math-off 掉到 38%。这支持论文对多通道融合的解释:multi-hop 问题需要 entity graph、lexical anchor、semantic similarity 和 reranker 同时工作;open-domain 相对鲁棒,说明 broad semantic/BM25 证据足以覆盖一部分问题。

Fisher-Rao vs cosine / math layer contribution

ConversationWith Math (%)Without Math (%)Δ (pp)
conv-2678.571.2+7.3
conv-3077.566.7+10.8
conv-4260.847.3+13.5
conv-4364.358.3+6.0
conv-4464.244.3+19.9
conv-4984.765.9+18.8
Average71.758.9+12.7

Figure 3 解读:数学层平均带来 +12.7 pp,且在更难的 conversations 上收益更大,例如 conv-44 +19.9 pp、conv-49 +18.8 pp。论文把这解释为 sparse / dense mixed memory population 下 cosine neighborhood 更容易被噪声污染,而 Fisher-Rao 用 variance profile 打破 cosine tie,更能区分低方差、高置信的记忆。

Mode C and cross-encoder caveat

Mode C 在 conv-30 的 per-category 结果为:single-hop 64.0、multi-hop 100.0、open-domain 86.0、aggregate 87.7。附录还报告了一个反直觉现象:在 Mode C 中关闭 cross-encoder 后 aggregate 反而是 90.1(single-hop 55.0、multi-hop 100.0、open-domain 93.0),比开启时高 +2.4 pp。论文解释是 cloud embedding text-embedding-3-large 在该 conversation 上已经足够强,cross-encoder 有时会把 broad open-domain evidence 降权到较窄匹配后面。

Limitations

作者明确承认三点限制。第一,评测集中在 LoCoMo,两人长期对话不能完全代表企业 memory 的 multi-user / multi-project 场景;LongMemEval 和 MemoryAgentBench 仍是未来工作。第二,zero-LLM Mode A Raw 约 60% 的答案准确率低于 LLM-dependent systems,本文更强的结论是“数学检索缩小了 gap”,不是“无 LLM 已经全面超过 cloud system”。第三,sheaf consistency 在 LoCoMo 上贡献较小,因为 LoCoMo 没有高密度 cross-context contradictions;这层的价值更可能在企业知识库和长期 agent deployment 中显现。