Chronos: Temporal-Aware Conversational Agents with Structured Event Retrieval for Long-Term Memory

"Event calendar + turn calendar + dynamic prompting for long-term temporal memory"

Posted by zwt on March 18, 2026

0. 论文信息

  • 标题:Chronos: Temporal-Aware Conversational Agents with Structured Event Retrieval for Long-Term Memory
  • 链接:https://arxiv.org/abs/2603.16862(v1, 2026-03-17)
  • 论文类型:arXiv preprint(cs.CL)
  • 关键词:Long-term conversational memory / temporal reasoning / event extraction / agentic retrieval

1. 这篇在解决什么问题?

长时跨度(跨周/月)的对话记忆里,用户问题经常不是“我说过什么”,而是:

  • 时间约束:上个月/最近/那次旅行后一周
  • 更新追踪:偏好/事实被多次修改,需要选“最新的值”
  • 跨会话聚合:某类事件在某段时间出现了多少次
  • 多跳:先找到事件 A 的时间点,再围绕它二次检索

作者认为:

  • 仅 turn-level retrieval(检索原始对话 turns)缺少可执行的时间结构;
  • 纯 KG/全量事实抽取太重,且容易引入与当前问题无关的“context entropy”。

2. 核心思路(一句话)

双索引(turn calendar + event calendar):把对话里“能落到时间轴上的事情”抽成结构化事件用于时间过滤与聚合,同时保留原始 turns 作为语义上下文;查询时再用 dynamic prompting 给 agent 生成检索策略,让它通过工具调用循环完成多跳检索。

3. 方法(可复现视角)

下面按“要自己复现一个 Chronos”来写:数据结构、索引流程、查询流程、关键超参。

3.1 两个日历(两个索引)

A) Turn Calendar(原始对话索引)

存储单位:conversation exchange/turn。

建议最小字段(复现可用):

1
2
3
4
5
6
7
{
  "session_id": "...",
  "turn_id": "...",
  "t_conv": "2025-01-02T10:03:00+08:00",
  "speaker": "user|assistant",
  "text": "...原始文本..."
}

向量索引用 embedding(text)。

B) Event Calendar(结构化事件索引)

事件抽取条件:必须有 <subject, verb, object> 三元组。

建议最小字段:

1
2
3
4
5
6
7
8
9
10
{
  "session_id": "...",
  "source_turn_ids": ["..."],
  "event_id": "...",
  "svo": {"subj": "...", "verb": "...", "obj": "..."},
  "start_datetime": "...ISO8601...",
  "end_datetime": "...ISO8601...",
  "aliases": ["...", "..."],
  "raw_evidence": "可选:触发该事件的原句"
}

论文要点(原文表述概括):

  • “the extractor identifies events if they have all of the following: ⟨subject, verb, object⟩.”
  • “Each event receives both start datetime and end datetime fields…”(datetime range)
  • “the system generates 2-4 lexical aliases…”(2–4 个别名,尽量不同词汇)

注:论文未给出严格的时间窗映射规则表(例如“recently”=几天)。复现时需要你自己给一套可解释规则或再去看作者代码(若公开)。

3.2 Indexing:事件抽取与入库

Step 1:分 chunk

  • 每个 session:最多 25 turns 一批
  • 批与批之间 5-turn overlap

Step 2:对每个 chunk 调用 LLM 做 event extraction

输入:一段 turns + 每个 turn 的 t_conv。 输出:事件列表(每个事件带 SVO + datetime range + aliases)。

关键实现点(来自论文描述):

  • 多分辨率时间归一:“preserves explicit dates exactly, calculates relative references from conversation timestamps, and resolves ambiguous temporal expressions to appropriate time ranges.”
  • 对模糊表达(recently/last month):基于 t_conv 计算相对/居中的时间窗。

Step 3:分别入库

  • Turn Calendar:embed turn text → vector index
  • Event Calendar:embed(建议将 svo + aliases + 时间字段串起来)→ vector index

论文报告的 embedding:text-embedding-3-large

3.3 Query-time:dynamic prompting + initial retrieval + agent loop

Chronos 的查询是“三段式”:先给 agent 一个比较强的 turn 种子上下文,再让 agent 工具调用在两条索引里补证据。

3.3.1 Dynamic Prompting(每题生成“检索计划”)

输入:用户问题 q。 输出:1–5 条 bullet,告诉 agent:

  • 要找哪些实体/属性
  • 时间范围/过滤条件
  • 是否需要多跳

论文说明模板生成用一个小模型:Gemini 3 Flash

论文没有给出 meta-prompt 的逐字文本;只说明“它要求抽取 targets(entities/attributes/temporal constraints/operations),并输出 1–5 条检索指导”,并给了一个示例输出。

3.3.2 Initial Retrieval(先从 Turn Calendar 预取上下文)

论文固定 pipeline:

  1. Turn Calendar dense retrieval:top 100(cosine similarity)
  2. Cross-encoder rerank:Cohere Rerank v3 对这 100 重排
  3. 取 top 15 turns
  4. context expansion:对每条 turn 加上同 session 中的前 1 条 + 后 1 条
  5. 按 session date 分组格式化

3.3.3 Chronos Agent(工具调用循环)

agent 以 ReAct 的“思考—调用—观察”循环工作。

工具(论文明确写了名字):

  • Vector search:search_turns, search_events
  • Grep search:grep_turns, grep_events

论文里的实现细节:

  • tool call “execute asynchronously with automatic retry logic”
  • dense retrieval:agent 可选 top-k;并对 k=100 rerank
  • rerank “applied to the original question rather than the agent’s query”
  • agent 可以“iteratively constrain retrieval by datetime range”

4. 实验(把能复现的数字写全)

4.1 Benchmark:LongMemEvalS

  • 总题数:500
  • 6 类任务:KU / MS / SSA / SSP / SSU / TR

4.2 实验设置(论文写死的配置)

  • Embedding:text-embedding-3-large
  • Temperature:0(所有 generation calls)
  • Rerank:Cohere Rerank v3

两种系统配置:

  • Chronos Low:generation model = GPT-4o
  • Chronos High:generation model = Claude Opus 4.6

4.3 结果(整体 + 分类型准确率)

Chronos Low:92.60%

  • KU 96.15
  • MS 91.73
  • SSA 100.00
  • SSP 80.00
  • SSU 94.29
  • TR 90.23

Chronos High:95.60%

  • KU 100.00
  • MS 88.72
  • SSA 100.00
  • SSP 100.00
  • SSU 98.57
  • TR 95.50

5. Tables(逐字抄表,便于复现对比)

Table 1: Chronos Low 与 SOTA 系统对比(LongMemEval)

| Method | Overall | KU | MS | SSA | SSP | SSU | TR | |—|—:|—:|—:|—:|—:|—:|—:| | Chronos Low (Ours) | 92.60 | 96.15 | 91.73 | 100.00 | 80.00 | 94.29 | 90.23 | | Honcho † | 90.40 | 94.87 | 84.96 | 96.43 | 90.00 | 94.29 | 88.72 | | EmergenceMem Internal | 86.00 | 83.33 | 81.20 | 100.00 | 60.00 | 98.57 | 85.71 | | Mastra | 84.80 | 85.90 | 79.70 | 82.14 | 73.33 | 98.57 | 85.71 | | Supermemory | 81.60 | 88.50 | 71.40 | 96.40 | 70.00 | 97.10 | 76.70 | | Hindsight ‡ | 83.60 | 84.60 | 79.70 | 94.60 | 66.70 | 95.70 | 79.70 | | Zep | 71.20 | 83.30 | 57.90 | 80.40 | 56.70 | 92.90 | 62.40 | | Full-context | 60.20 | 78.20 | 44.30 | 94.60 | 20.00 | 81.40 | 45.10 |

† Honcho evaluated on Claude Haiku 4.5, not GPT-4o, so results are not directly comparable.

‡ Hindsight evaluated with OSS-20B actor + OSS-120B judge; not directly comparable.

Table 2: 更强 LLM 配置下的系统对比

| Method | Overall | KU | MS | SSA | SSP | SSU | TR | |—|—:|—:|—:|—:|—:|—:|—:| | Chronos High (Ours) | 95.60 | 100.00 | 88.72 | 100.00 | 100.00 | 98.57 | 95.50 | | Honcho † | 92.60 | - | - | - | - | - | - | | Mastra | 92.80 | 94.90 | 87.20 | 96.40 | 90.00 | 97.10 | 94.00 | | Supermemory | 85.20 | 89.70 | 76.70 | 98.20 | 70.00 | 98.60 | 82.00 | | Hindsight ‡ | 91.40 | 94.90 | 87.20 | 96.40 | 80.00 | 97.10 | 91.00 |

† Category-level accuracy not reported.

‡ Evaluated with an OSS-120B judge model; not directly comparable.

Table 3: 消融实验(116 题样本)

| Model | Ablation | Overall | KU | MS | SSA | SSP | SSU | TR | |—|—|—:|—:|—:|—:|—:|—:|—:| | Chronos High | Chronos | 94.8 | 100.0 | 90.3 | 100.0 | 100.0 | 93.8 | 93.5 | | Chronos High | No Initial Retrieval | 91.4 | 100.0 | 80.6 | 100.0 | 85.7 | 93.8 | 93.5 | | Chronos High | No Dynamic Prompting | 94.8 | 100.0 | 87.1 | 100.0 | 100.0 | 93.8 | 96.8 | | Chronos High | No Rerank | 92.2 | 100.0 | 87.1 | 100.0 | 85.7 | 87.5 | 93.5 | | Chronos High | No Date Filter | 92.2 | 94.4 | 83.9 | 100.0 | 85.7 | 93.8 | 96.8 | | Chronos High | Grep Only (no vector) | 87.1 | 94.4 | 83.9 | 61.5 | 100.0 | 93.8 | 90.3 | | Chronos High | Vector Only (no grep) | 83.6 | 100.0 | 80.6 | 100.0 | 85.7 | 62.5 | 80.6 | | Chronos High | Turns Only (no events) | 92.2 | 94.4 | 87.1 | 100.0 | 85.7 | 87.5 | 96.8 | | Chronos Low | Chronos | 93.1 | 94.4 | 90.3 | 100.0 | 85.7 | 87.5 | 96.8 | | Chronos Low | No Initial Retrieval | 76.7 | 83.3 | 64.5 | 100.0 | 71.4 | 81.2 | 74.2 | | Chronos Low | No Dynamic Prompting | 78.4 | 83.3 | 77.4 | 100.0 | 42.9 | 93.8 | 67.7 | | Chronos Low | No Rerank | 81.0 | 77.8 | 74.2 | 100.0 | 85.7 | 87.5 | 77.4 | | Chronos Low | No Date Filter | 78.4 | 88.9 | 71.0 | 100.0 | 57.1 | 68.8 | 80.6 | | Chronos Low | Grep Only (no vector) | 77.6 | 100.0 | 64.5 | 53.8 | 100.0 | 87.5 | 77.4 | | Chronos Low | Vector Only (no grep) | 80.2 | 94.4 | 80.6 | 100.0 | 85.7 | 62.5 | 71.0 | | Chronos Low | Turns Only (no events) | 58.6 | 55.6 | 51.6 | 100.0 | 42.9 | 43.8 | 61.3 |

6. 评估/判分(LongMemEval Judge)

Chronos 的评估严格沿用 LongMemEval:

  • agent 输出 hypothesis
  • LLM judge 对比 hypothesis vs ground truth
  • 按问题类别路由到不同 judge prompt(论文未给出逐字 judge prompt)

论文也提醒:LLM-as-judge 有波动,并给出若干 benchmark ground truth/ rubric 的问题样例。

7. 复现仍缺的一块:Prompt + 时间窗规则

论文里缺的(或至少没逐字公开的)关键材料: 1) dynamic prompting 的 meta-prompt 2) event extraction 的 prompt 3) temporal normalization 的“词 → 时间窗”规则表(recently/last month 等)

如果你要自己复现,我建议下一步补三件事:

  • 定义一套可审计时间窗规则(我可以在后续一版里给出一套默认规则表 + 可配策略)。
  • 写出可跑的 event extraction prompt(schema + few-shot + 去重约束)。
  • 写出 dynamic prompting meta-prompt(输出 bullets,强制包含:targets / time filter / multi-hop plan)。

8. Appendix A(Table 4)能看到什么?

PDF/HTML 能抽到 Appendix A 的部分模型清单(表格未完全展开到每个数字):

  • Claude Opus 4.6
  • GPT-5-mini
  • Claude Sonnet 4.5
  • Claude Haiku 4.5
  • GPT-5.2
  • GPT-4o
  • Claude Code Sonnet

一句话结论:Chronos 的核心不是“更强的 RAG”,而是把长期对话记忆里最难的部分(时间)做成可过滤的事件索引,再把检索策略做成每题自适应(dynamic prompting),最后用 agent loop 把多跳问题跑通;在 LongMemEvalS 上给出很硬的准确率支撑。