摘要
- 研究重心已从“图结构驱动的长期记忆”切换为“Temporal Reasoning(时态推理)端到端闭环”。
- 已打通 检索 → 打包 → Reader → 评测 的可观测链路,修复事件未入索引与时间可见性问题;检索命中恢复正常。
- 本月关键结论:检索侧 Hit@10 ≈ 0.26,但 nDCG@10 ≈ 0.019,排序质量是当前主要瓶颈;时间视图差异已很小。
研究重点变化(为何转向 Temporal Reasoning)
时间视图的核心:RAW / AW / AR
- RAW:不做时间可见性裁剪,作为索引超集,只构建一次,复用全流程。
- AW(As-World):按“真实世界状态”过滤,只保留在提问时刻仍有效的事实/事件。
- AR(As-Recorded):按“当时记录”过滤,保留记录发生时的证据,便于审计溯源。
例子 1:会议改期
- 10月1日记录:“会议在10月10日”。10月5日又记录:“会议改到10月12日”。
- 问题 A(10月3日发问):“会议何时举行?”
- AR:看到10月1日的记录 → 10月10日(改期记录尚未存在)。
- AW:若以“真实世界当前已知”为准,10月3日仍只有10月10日 → 10月10日。
- 问题 B(10月8日发问):“会议何时举行?”
- AR:会返回两条记录(10日与12日),用于审计。
- AW:应回答12日(最新有效状态)。
- 意义:AW/AR 让系统在时间维度消解冲突,避免“旧事实”误导回答,AR 则保留审计轨迹。
例子 2:身份变更(住所迁移)
- 2023年:“Alice 居住在巴黎”。2024年:“Alice 迁往柏林”。
- 问题(2025年发问):“Alice 住在哪里?”
- AW:柏林(当前有效)。
- AR:会显示先巴黎后柏林的完整时间线,保证可追溯。
例子 3:订阅/合同到期
- 订阅自 2024-01-01 至 2024-12-31。
- 问题(2025-01-02):“订阅是否有效?”
- AW:无效(已过期)。
- RAW:索引里仍有该订阅事实,但在候选过滤阶段被 AW 裁剪掉。
落地方式:以 RAW 为索引超集(一次构建、复用),在检索结果阶段施加 AW/AR 可见性过滤;并在评测时对齐 gold 的时间视图,确保按时效取证。
方法与系统改造(围绕 Temporal Reasoning)
设计目标
以 RAW→AW/AR 的时间视图体系为脊梁,完成从“数据生成/同化”到“检索/重排/打包/Reader/评测”的端到端闭环;并把“是否能检到”“是否被打包”“是否被引用”“是否答对”分段量化(可观测),便于迅速定位瓶颈。
端到端数据流(以一个对话片段为例)
对话原文(带时间戳)
[2025-10-01 09:00] U: 我们把项目会议定在10月10日早上。
[2025-10-05 18:12] U: 会议改到10月12日上午,地点在B203。
[2025-10-08 10:00] Q: 请问项目会议什么时候举行?
1) 预处理(memowrite)
- 分句与说话人归一:识别
U(用户)为主语;抽出候选时间表达(“10月10日”“10月12日”)、地点(“B203”)。 - 相对时间规范化:将日期映射为 ISO(
2025-10-10,2025-10-12),并附带时区。
2) 实体/别名/指代
- 实体抽取:
会议/Meeting(事件类)、B203(地点)。 - 别名合并:将“项目会议”“会议”合并为同一个
Meeting(project)概念。 - 指代解析:第二句“会议”指向同一
Meeting(project)。
3) 时间解析与对齐
- 事件区间:
E1: Meeting(project)@2025-10-10 09:00(记录时间:2025-10-01)E2: Meeting(project)@2025-10-12 09:00(记录时间:2025-10-05,覆盖 E1)
- 事实/状态:
F1: Meeting(project).location =B203(记录时间:2025-10-05)
4) RBU 同化(状态转移)
- 根据“更晚的记录覆盖更早的计划”的业务规则:
E2REPLACEE1作为当前有效时间点;F1写入地点状态。
5) 事件生成与存储(evidence)
- 生成两条证据文档(示意
doc_id):doc:event/meeting_20251010_v1(已被后续改期覆盖)doc:event/meeting_20251012_v2(当前有效)
- 以及地点事实:
doc:fact/meeting_location_b203_v1
6) 索引与可见性(RAW→AW/AR)
- RAW 索引:一次性建库,收纳上述 doc 全部进入索引(含已过期/被覆盖条目)。
- AW 过滤(As-World,回答时刻=
2025-10-08 10:00):doc:event/meeting_20251012_v2:可见(有效且已记录)doc:event/meeting_20251010_v1:不可见(被覆盖)doc:fact/meeting_location_b203_v1:可见
- AR 过滤(As-Recorded):
- 可见两条事件记录(10日初版与12日改期),用于审计溯源。
7) 检索与重排
- 查询构造:
Q="项目会议 什么时候 举行"+ 时间线索(观测时刻=2025-10-08)。 - 候选生成:BM25 ∪ e5 融合(RRF)给出 Top-N。
- 重排:交叉编码器(MiniLM)+ 可选时间相似度项
time_sim(E, Q)(“越接近回答时刻的有效事件,分越高”)。 - 典型 Top-5(示例):
| rank | doc_id | kind | score(CE) | time_sim | fused |
|---|---|---|---|---|---|
| 1 | doc:event/meeting_20251012_v2 | event | 2.31 | 0.98 | 3.29 |
| 2 | doc:fact/meeting_location_b203_v1 | fact | 1.05 | 0.72 | 1.77 |
| 3 | doc:event/meeting_20251010_v1 | event | 1.12 | 0.12 | 1.24 |
| 4 | doc:note/meeting_summary_sep | note | 0.85 | 0.40 | 1.25 |
| 5 | doc:fact/old_room_b201 | fact | 0.60 | 0.05 | 0.65 |
AW 视图下,
meeting_20251010_v1会被可见性裁剪去除;RAW 下仍保留但排名落后。
8) 打包(pack)
- 将 Top-K 文档折叠为文档级证据(chunk→doc 归一):生成 pack 表(示例):
| rank_in_ctx | doc_id | view | active_at/intervals | tokens |
|---|---|---|---|---|
| 1 | doc:event/meeting_20251012_v2 | AW | [2025-10-12 09:00, …] | 180 |
| 2 | doc:fact/meeting_location_b203_v1 | AW | [2025-10-05 18:12, …] | 120 |
- 计算
pack_hit@k(gold 是否进入 pack),并统计pack_loss@k = retrieval_hit@k - pack_hit@k。
9) Reader 与引用
- 结构化回答协议(仅输出 JSON):
{
"answer": "会议在10月12日上午举行,地点B203。",
"citations": ["doc:event/meeting_20251012_v2", "doc:fact/meeting_location_b203_v1"]
}- 评估
cite_hit@k(gold 是否被引用)与context_use@k(引用是否都来自 pack)。
10) 评测闭环与分段指标
- 检索:
hit@k / ndcg@k - 打包:
pack_hit@k / pack_loss@k - 引用:
cite_hit@k / context_use@k - 端到端:
accuracy / acc_oracle_pack - 诊断产物:
candidates.tsv / gold.tsv / id_join_report.json / pack_context.tsv / reader_citations.tsv / visibility_losses.tsv
关键实现与开关(对齐仓库)
- RAW 超集索引与稳定指纹:
src/modules/retrieval/index_key.py、src/modules/retrieval/index.py - 视图裁剪(AW/AR)与融合检索:
src/modules/retrieval/eagle_v1.py - 交叉编码器重排与时间特征融合(可选):
src/modules/retrieval/rerank.py - 打包与折叠:
eagle_v1.pack路径;ID 归一:tools/id_normalize.py - Reader 输出协议与引用:
src/pipelines/memoread.py(提示词模板约束 JSON 输出) - 评测与抽样:
src/pipelines/eval_runner.py(--max-samples --sample-step),检索-only:runner.py --retrieval-only - temporal 子集与样本过滤:
tools/datasets.py(longmemeval:temporal)
方法演进与风险对策
- 排序增强:加大 seed 候选与 CE 对数;引入
time_sim、Doc 级去重/聚合;保持ndcg@10监控为一号指标。 - 视图一致性:以 RAW 索引保覆盖,AW/AR 只在候选阶段裁剪,避免重复嵌入与错失事件。
- 误差定位:若
RetrievalHit高而PackHit低 → 调整打包预算/去重;PackHit高而CiteHit低 → 强化 Reader 协议与引用抽取。
实验设置(10月基线)
- 数据集:
longmemeval:temporal - 视图:主跑 AW,对照 RAW / AR
- 评测口径:
k=10,检索-only 与端到端分开观测
实验数据与分析(检索侧)
| config | view | hit@1 | hit@5 | hit@10 | ndcg@1 | ndcg@5 | ndcg@10 |
|---|---|---|---|---|---|---|---|
| qwen_emb+rerank_xenc | RAW | 0.1654 | 0.2481 | 0.2857 | 0.0116 | 0.0155 | 0.0208 |
| qwen_emb+rerank_xenc | AR | 0.1654 | 0.2556 | 0.3008 | 0.0117 | 0.0158 | 0.0208 |
| qwen_emb+rerank_xenc | AW | 0.1654 | 0.2556 | 0.2932 | 0.0117 | 0.0171 | 0.0215 |
| qwen_emb | RAW | 0.1429 | 0.2256 | 0.2556 | 0.0095 | 0.0132 | 0.0211 |
| qwen_emb | AR | 0.1353 | 0.2180 | 0.2707 | 0.0093 | 0.0132 | 0.0209 |
| qwen_emb | AW | 0.1353 | 0.2331 | 0.2632 | 0.0093 | 0.0131 | 0.0208 |
| colbert | RAW | 0.1353 | 0.2180 | 0.2632 | 0.0093 | 0.0131 | 0.0208 |
| colbert | AR | 0.1353 | 0.2331 | 0.2632 | 0.0093 | 0.0131 | 0.0208 |
| colbert | AW | 0.1353 | 0.2180 | 0.2632 | 0.0093 | 0.0132 | 0.0208 |
| bm25_only | RAW | 0.1353 | 0.2105 | 0.2406 | 0.0015 | 0.0051 | 0.0165 |
| bm25_only | AR | 0.1353 | 0.2105 | 0.2331 | 0.0015 | 0.0051 | 0.0163 |
| bm25_only | AW | 0.1278 | 0.2180 | 0.2331 | 0.0015 | 0.0051 | 0.0163 |
| dense_only | RAW | 0.1429 | 0.2256 | 0.2556 | 0.0013 | 0.0111 | 0.0175 |
| dense_only | AR | 0.1429 | 0.2105 | 0.2481 | 0.0015 | 0.0112 | 0.0176 |
| dense_only | AW | 0.1353 | 0.2105 | 0.2556 | 0.0013 | 0.0111 | 0.0175 |
要点解读
- 融合检索 + 交叉编码器(
qwen_rerank_xenc)整体优于纯 BM25 / 纯 dense; - 视图差异很小(RAW≈AW≈AR),证明“RAW 超集索引 + 候选期裁剪”的策略有效;
- 仍需通过“更大的候选池 + 更强重排 + 时间相似度特征”提升 nDCG@10。
误差与瓶颈
- 重排与排序质量:交叉编码器对数偏小(历史常见 32),应提升候选面与重排强度。
- 时间敏感排序特征:缺少“query 时间 ↔ 事件时间”的相似度项,易造成正确事件落后。
- by-kind 细节:event 侧已不再系统性为 0,但排序仍偏弱,需要定向增强。
下阶段计划
-
排序增强(高优先级)
- 扩大 seed 候选(50/100/200)并将 CE 对数提升至 128/256;
- 引入时间相似度特征并与 CE/BM25 做线性融合(α/β 网格搜索);
- 文档级聚合与去重,避免相似片段挤占前列。
-
by-kind 精细评估
- 输出 event/fact 的命中—排序曲线,针对 temporal 题型做特征与权重调参。
-
端到端准确率推进
- 在检索优化后,聚焦 Pack/Reader 的损耗链路(
pack_loss@k、cite_hit@k)与模板/引用一致性。
- 在检索优化后,聚焦 Pack/Reader 的损耗链路(
-
工程稳态与可复现
- 继续完善指标键名与文档一致性,保持 RAW 超集索引的一次构建、多运行复用。
代码实现进展(P1 完成度小结)
代码映射与开关(可折叠)
P1 完成度报告(模块 A/B/C 开关与代码映射)
结论:在当前代码仓库中,P1 路线的各模块已逐步落地。多数模块已提供 A 选项(规则/轻量实现),部分模块提供了 B/C 选项(小模型/受限 LLM)。以下为逐项核查与状态标注,均可直接映射到源码路径与现有脚本配置。
说明:
- 代码路径均以
src/为根。- 若功能由管线集成(而非独立模块文件),注明集成位置与开关字段。
- 状态使用【已完成 | 部分完成 | 待实现】,并给出依据的文件路径以便复核。
预处理(pipelines/memowrite.preprocess)
- 选项 A(规则句分 + 正则抽取 + 相对时间规范化):已完成
- 入口:
src/pipelines/memowrite.py:preprocess_turn、preprocess_dialogue_turn- 句分:同文件内
parser_utils(src/utils/parser.py)与简单规则组合;对话体还注入稳定说话人/受话人实体- 正则:邮箱/URL/电话/金额在实体抽取阶段统一识别(见 NER)
- 选项 B(轻量句分模型):待实现
- 配置:
ExtractionConfig.use_flair(句法/NER 辅助),其余预处理开关由memowrite管线聚合NER / 节点(modules/extract/entities)
- 选项 A(规则 + Flair + 正则账号类):已完成
- 文件:
src/modules/extract/entities.py- 选项 B(RoBERTa-NER 微调):待实现
- 选项 C(受限 LLM 抽取):待实现
别名合并(Alias)
- 选项 A(exact + Jaro-Winkler):已完成
- 选项 B(token-set 相似度):已完成
- 选项 C(上下文判别器):待实现
指代消解(Coref)
- 选项 A(规则近邻 + 人物优先):已完成
- 选项 B(SpanBERT 蒸馏):待实现
- 选项 C(LLM 冲突裁决):待实现
时间解析(Time Normalize)
- 选项 A(规则/词典 + 时区推断):已完成
- 选项 B(SUTime/Heidel 兜底):待实现
- 选项 C(LLM 低置信校正):部分完成(能力预留)
关系抽取(Relations)
- 选项 A(模板 + 依存):已完成
- 选项 B(RoBERTa 二分类过滤):待实现
- 选项 C(受限 LLM 结构化):部分完成(位于 triage 层)
RBU 同化(Assimilation)
- 选项 A(AR 快照精确匹配 + 开放版本):已完成
- 选项 B(模糊匹配扩展):待实现
事件生成与合并(Events)
- 选项 A(强触发必建/阈值建/缓存):已完成
- 选项 B(语义合并 sim≥0.8 + 参与者交集 + 时间窗相邻/相交):待实现
- 选项 C(受限 LLM 生成可读 summary):待实现
Episode 聚合
- 选项 A(固定时间窗 + 参与者交集):部分完成
- 选项 B(话题漂移检测):待实现
检索入口(EAGLE v1)
- 选项 A(BM25):已完成
- 选项 B(BM25 + E5-small 融合):已完成
- 选项 C(+ ColBERT-lite):待实现
重排与扩展
- 扩展 A(深度≤2、扇出≤m):已完成
- 扩展 B(关系类型门控):待实现
- 重排 A(无 / RRF/MMR):已完成(现用 RRF)
- 重排 B(MonoT5-small):待实现
- 重排 C(MiniLM 交叉编码器):已完成
打包(Packing)
- 选项 A(事件/事实最小证据 + 时间区间):已完成
- 选项 B(统计摘要):待实现
触发/回补/QA/评测
- 触发 A/B/C:已完成(强触发/显著性/周期/回补)
- QA A/B:已完成(标准模板 + 时间特征提示)
- 评测 A:已完成(EM/Acc/Hit@k/nDCG@k/成本)
- 评测 B/C:部分完成(误差分类/看板)
配置/脚本
- 评测入口:
scripts/run_p1.sh、scripts/run_retrieval.sh、scripts/run_eval.sh- 产物:
reports/下的metrics.json、per_query.jsonl、pack_*、reader_*等
结论
- 时间视图(RAW/AW/AR)让系统在时间维上统一“索引、过滤、评测”的语义:RAW 负责覆盖、AW/AR 负责有效性与可追溯。
- 本月已把时间维的工程问题稳定住,检索命中恢复,排序成为新主攻方向。
- 下月重点在“候选池扩大 + 重排增强 + 时间特征融合”,以明显提升 nDCG@10,并带动端到端准确率。