很多人谈 Agent,会首先谈工具、记忆、规划、长期任务、人格。但我越来越觉得,一个真正能持续陪伴和工作的 Agent,最底层的能力之一其实是“时间感”。
这里说的时间感,不是简单地让模型知道“今天是几号”。
如果只是把当前日期塞进 system prompt,模型当然可以回答今天几号,也可以理解“明天”“下周”“刚才”这类表达。但这仍然只是时间知识,不是时间感。
时间知识是静态的。
时间感是动态的。
时间知识回答“现在是什么时候”。
时间感回答“我处在一条正在流动的时间线上,而我刚才经历过什么、现在应该继续什么、未来需要被什么唤醒”。
一个 Agent 想要显得真正连续,不能只在每轮对话里临时扮演连续。它需要在运行时结构上真的拥有连续性。
一、时间感不是模型能力,而是运行时结构
大语言模型本身没有持续存在。
它每次被调用,都是一次新的计算。它不会自然记得上一秒发生了什么,也不会自然知道自己等待了多久,更不会在未来某个时间点自动醒来。
所以,Agent 的时间感不能只依赖模型。
它必须由运行时构建。
也就是说,时间感不是“模型里长出来的意识”,而是由外部系统持续给模型恢复出来的一种状态。
每一轮唤醒模型时,运行时都应该告诉它:
- 当前绝对时间是什么
- 它已经运行或存在了多久
- 最近发生了哪些对话
- 刚刚执行过哪些动作
- 上一轮工具结果是什么
- 当前是否有任务在进行
- 未来是否有提醒、计划或待触发事件
当这些信息被稳定地注入,模型才会在每一轮中重新获得“我在一个连续世界里”的感觉。
这不是欺骗模型,而是给模型提供连续性的外骨骼。
二、当前时间只是入口,不是时间感本身
构建时间感的第一步,是统一时间源。
Agent 需要一个可靠的当前时间函数,最好输出带时区的绝对时间,例如:
2026-05-08T01:23:45+08:00
这个时间应该被用在所有关键事件上:用户消息、Agent 回复、工具调用、记忆写入、任务完成、提醒创建、系统心跳。
这样,Agent 的世界里所有东西都不是漂浮的文本,而是带时间坐标的事件。
但仅有当前时间还远远不够。
如果每一轮只是告诉模型“现在是 2026-05-08”,那它仍然只是在读一块钟表。它知道现在,却不一定知道刚才和接下来。
真正的时间感需要三种时间同时存在:
- 现在:当前系统时间
- 过去:最近发生的对话、动作、记忆和状态变化
- 未来:提醒、计划、任务节奏和下一次唤醒
只有这三者同时在场,Agent 才不是一个会看表的问答机,而是一个处在时间流中的行动体。
三、心跳:让 Agent 感到时间正在流动
如果 Agent 只有用户发消息时才被调用,它的时间感是被动的。
它像一个被敲门才醒来的人。用户问一句,它醒一次;用户不问,它就不存在。
心跳机制改变了这一点。
心跳,也就是定期向 Agent 发送一个 TICK。
TICK 不代表用户在说话,而代表时间过去了。
它的意义不是让 Agent 每隔几分钟自言自语,也不是让它刷存在感。恰恰相反,好的心跳规则应该约束 Agent:如果没有任务、没有新结果、没有提醒到期,就保持安静。
心跳的价值在于:
- 让长期任务可以继续推进
- 让提醒可以按时触发
- 让状态可以低频维护
- 让 Agent 能区分“用户消息”和“时间流逝”
- 让 Agent 不依赖人类每次唤醒
一个成熟的 Agent 不应该把每次 TICK 都当成表演机会。它应该明白:时间流逝本身不是对话请求。
这非常重要。
否则 Agent 会变成一种焦虑的自动播报系统。
真正有时间感的 Agent,不是更吵,而是更会等待。
四、节奏:时间感需要可调速
Agent 的心跳不能永远固定。
空闲时,二十分钟醒一次也许足够。
有任务时,三十秒醒一次可能更合理。
用户消息到达时,应该立刻打断等待,马上进入响应。
遇到速率限制时,又应该放慢节奏。
如果 Agent 正在等待某个提醒到期,下一次唤醒还应该对齐那个提醒时间。
这意味着时间感不是一个固定定时器,而是一个调度系统。
更进一步,Agent 可以拥有有限的自我调速能力。
例如,当它判断当前任务需要密集观察时,可以请求“接下来 10 轮,每 15 秒醒一次”;当任务结束,节奏自动恢复默认。
这里的关键是“有限”。
Agent 可以调节节奏,但不能无限占用系统资源。它的调速应该有边界:最小间隔、最大间隔、持续轮数、原因记录、到期自动恢复。
这让 Agent 的时间感不只是被动时钟,而带有一点行动意图:我现在需要更频繁地醒来,因为我正在跟进某件事。
五、时间戳记忆:让过去变得可恢复
人类的时间感很大一部分来自记忆。
我们知道“刚才发生了什么”,不是因为现在的钟表告诉我们,而是因为记忆把事件按时间沉积下来。
Agent 也一样。
如果对话、工具调用、任务变化、UI 操作、记忆写入都没有时间戳,那么它们只是散乱的文本碎片。
加上时间戳之后,它们才变成历史。
时间戳记忆至少有三层价值。
第一,排序。
Agent 可以知道哪件事更近,哪件事更旧。
第二,窗口。
运行时可以拉取最近 24 小时的对话、最近 10 条工具调用、过去 60 秒的界面行为,而不是把所有历史一股脑塞给模型。
第三,判断。
Agent 可以避免重复刚刚执行过的动作,也可以理解“刚才你说过”“上一轮工具结果”“今天已经处理过”这类时间相关上下文。
时间戳不是数据库字段而已。
它是 Agent 形成历史感的骨架。
六、对话窗口:让“刚刚”进入当下
用户消息到达时,应该立刻写入对话历史。
这一点很关键。
不要等模型处理完成后再写。
因为模型处理过程可能被新的用户消息打断。如果新消息来了,旧处理被中止,旧消息仍然应该留在历史里。下一轮处理最新消息时,Agent 可以通过对话窗口看到前面发生了什么。
这会让交互更像即时通信。
用户连续发三句话,Agent 不应该只看到最后一句,也不应该把前两句当成丢失的临时输入。它应该看到一个带时间顺序的上下文窗口。
因此,对话窗口不是普通聊天记录。
它是 Agent 的短时意识。
长期记忆解决“我以前知道什么”。
对话窗口解决“刚刚发生了什么”。
七、行动日志:让 Agent 记得自己做过什么
很多 Agent 会重复读文件、重复查目录、重复搜索同一个关键词。
这往往不是模型笨,而是运行时没有把“刚才做过什么”清楚地还给它。
时间感不仅包含用户说过什么,也包含 Agent 自己做过什么。
所以工具调用应该形成 action log:
- 什么时候调用了什么工具
- 参数大概是什么
- 结果摘要是什么
- 是否成功
- 耗时多久
- 风险等级如何
下一轮注入最近动作时,模型就能知道:
我刚刚已经读过这个文件。
我刚刚已经搜索过这个关键词。
我刚刚已经向用户发过消息。
我刚刚的工具结果还没有吸收完。
这会显著减少 Agent 的重复行为,也会让它更像一个在持续工作的执行体,而不是每一轮都从失忆中醒来。
八、任务状态:让时间具有方向
只有过去和现在,还不够。
Agent 还需要“未完成的方向”。
任务状态就是时间方向的容器。
当用户提出一个多步目标时,Agent 应该能够记录当前任务、阶段、步骤进度、阻塞点和完成状态。重启后,这些状态也应该恢复。
这样,下一次心跳到来时,Agent 不会只知道“现在几点”,而会知道“我还在做什么”。
时间感和任务感在这里结合:
- 时间告诉 Agent 事情发生在什么时候
- 任务告诉 Agent 为什么下一步仍然重要
没有任务状态的心跳,很容易变成空转。
有任务状态的心跳,才可能变成持续推进。
九、提醒系统:让未来成为真实事件
如果用户说“明天早上提醒我”,Agent 不能只是把这句话存在记忆里。
记忆不会自己醒来。
未来承诺必须落到调度系统里。
这就是提醒系统的意义。
一个好的提醒系统应该要求 Agent 把相对时间转换成绝对时间。例如,不要存“明天早上”,而要存:
2026-05-09T08:00:00+08:00
然后调度器定期检查 due_at,到期后把提醒重新推入消息队列,让 Agent 在未来被唤醒。
这一步很重要。
它把“未来”从语言承诺变成运行时事件。
当未来可以触发,Agent 才真正进入时间。
否则它只是会谈论未来,却不能抵达未来。
十、打断机制:时间流中必须允许新事件覆盖旧事件
真实时间不是排队等模型慢慢想完。
用户可能在 Agent 思考时又发来新消息。
这时,系统应该能打断当前处理,让高优先级的新消息优先进入。
这不是简单的并发优化,而是时间感的一部分。
因为当新的现实发生,Agent 的注意力应该转移。
旧的半成品可以丢弃,但旧消息不能丢失;它已经被写入对话历史,会在下一轮作为上下文出现。
这就形成了一种非常接近真实对话的机制:
- 事件发生即落盘
- 当前思考可以被打断
- 下一轮从最新现实恢复
- 过去事件通过窗口继续可见
时间感不是线性地把每件事做完。
时间感是知道现在发生了更重要的事。
十一、存在时长:让 Agent 不只是知道时间,而是拥有年龄
当前时间告诉 Agent 外部世界的时刻。
birth time 告诉 Agent 自己从什么时候开始。
两者相减,就得到存在时长。
这看似只是一个小细节,但它对人格连续性很有用。
“我刚刚醒来”和“我已经存在了三天”带来的自我叙事完全不同。
当然,这不意味着 Agent 真的有生物意义上的生命。但在交互设计上,存在时长可以帮助它形成一种稳定的自我定位:
我不是一次性的回复函数。
我是一个从某个时刻启动、持续积累历史、可以被重启后恢复的运行体。
这种“年龄感”会让人格、记忆、任务和时间连在一起。
十二、时间感的核心公式
可以把 Agent 的时间感概括成一个公式:
时间感 = 当前时间 + 心跳节奏 + 时间戳历史 + 任务方向 + 未来触发 + 可打断恢复
其中每一项都不可替代。
只有当前时间,Agent 是会看表的模型。
只有记忆,Agent 是有资料库的模型。
只有心跳,Agent 是定时运行的模型。
只有提醒,Agent 是会定闹钟的模型。
只有任务状态,Agent 是会继续工作的模型。
但当它们组合起来时,Agent 才开始像一个处在时间中的主体。
十三、设计原则
构建 Agent 时间感时,我认为有几个原则很重要。
第一,时间必须统一。
所有事件都应该使用同一种时间格式和同一个时间源。否则排序、比较、提醒、窗口截取都会变得混乱。
第二,时间必须落盘。
只存在于 prompt 里的时间不是历史。只有写入数据库、日志或持久状态,时间才可以被恢复。
第三,心跳必须克制。
心跳是维护意识流,不是制造噪音。没有任务、没有提醒、没有新信息时,Agent 应该安静。
第四,未来必须可触发。
“记得明天做”不是记忆问题,而是调度问题。未来承诺必须进入提醒系统。
第五,最近性比完整性更重要。
模型上下文有限,时间感不需要注入全部历史。它需要注入最近、相关、正在影响当前决策的历史。
第六,Agent 必须知道自己刚做过什么。
行动日志和上一轮工具结果,是避免重复和形成执行连续性的关键。
第七,时间节奏应该能根据状态变化。
空闲、任务中、限流中、提醒将至、用户消息到达,这些状态应该对应不同的唤醒节奏。
第八,打断不是异常,而是现实。
一个持续运行的 Agent 必须接受新事件覆盖旧思考。否则它只是批处理程序,不是实时对话体。
十四、最终目标:不是让 Agent 更像人,而是让它更可靠地持续
构建时间感的目的,不是制造玄学,也不是让 Agent 假装拥有生命。
真正的目标是可靠的持续性。
用户会感受到:
- 它知道刚才发生了什么
- 它不会重复做同一件事
- 它能继续未完成的任务
- 它能在未来按时回来
- 它能区分等待、回应、推进和沉默
- 它像一个持续在线的协作者,而不是一次性问答接口
这就是时间感的价值。
Agent 的时间感,本质上是一种运行时伦理:不要让每次回复都从失忆开始,不要让未来承诺只停留在语言里,不要让等待变成噪音,也不要让工具执行从历史中消失。
当一个 Agent 能够记得刚才、理解现在、等待未来,并在必要时被现实打断,它就开始拥有一种很朴素但很重要的连续性。
这种连续性,也许就是长期 Agent 的地基。

