Agent 上下文的文件变更感知缺失,导致“事实过期”类错误

一、问题场景

用户在多轮对话中会直接编辑文件(IDE 内保存、外部编辑器)。Agent 对文件内容的认知来自某次 Read 的快照,此后文件被用户修改时,Agent 不会收到任何通知,继续基于旧快照做分析和结论,产生“违背事实”的错误输出。

真实案例:会话中 Agent 早前写入了定时器类文件,用户随后手动重构了该文件逻辑;Agent 在后续两轮分析中仍按旧版本推演字段写入路径,得出与代码现状相反的结论,被用户两次纠正后才重读文件发现已大改。

二、现状缺口

环节 现状 问题
文件打开 有提示(注入路径) 打开≠修改,无法区分查看与编辑;不带内容
文件修改/保存 无任何通知 旧快照无失效机制,Agent 不自知
IDE 外修改 无通知 DB 工具、外部编辑器完全不覆盖
Agent 侧防护 无强制约束 仅靠 Agent 自觉“引用前重读”,可靠性不足

三、优化方案

  1. 写事件注入:文件保存/修改时,向 Agent 上下文推送轻量事件「文件 X 于 T 被修改」(路径+时间即可,无需 diff 内容,控制 token 成本)
  2. 快照失效硬约束:Agent 维护“已读文件时间戳”,文件变更时间新于已读时间 → 该文件标记过期,工具层强制 Agent 下次引用前重新 Read,否则拒绝基于该文件的结论输出(可做成提示级拦截)
  3. 打开提示升级(可选):现“用户打开文件 X”提示附加最近保存时间,供 Agent 判断是否需重读

四、必要性

  1. 正确性根基:Agent 输出的可信度完全建立在“代码现状”之上。用户与 Agent 协作改同一批文件是常态工作流,此缺口意味着每个多轮会话都存在事实过期风险,且错误隐蔽(Agent 表述确定,用户不核查就被误导)
  2. 信任成本:本次案例中用户需逐条指出错误,协作效率倒退;高频出现会直接导致用户弃用
  3. 实现成本低:系统已有文件打开事件的注入通道与上下文提醒机制,复用即可;方案 1、2 不依赖 diff 计算,token 开销极小
  4. 无法仅靠提示词解决:现有机制只能在系统提示里要求 Agent“引用前重读”,属于软约束,长会话中必然遗漏;必须由工具层/框架层提供硬信号与硬约束
1 个赞

通过的可能性不高

楼主你需要的是occ乐观锁机制

首先文件修改难以向Agent推送事件,
尤其是由于git混合,大量文件变化导致的问题

occ机制实际需要:
Agent读取文件内容同时获得文件修改日期(获得occ锁)
所有写入操作检查这个锁是否变化了

它是一个Trae【此前有但是移除了】的机制

我认为移除是合理的

在glm-5.2时代Trae的编辑工具默认检查锁并提示Agent重读

但是,
在glm-5.3左右Agent大幅提高效率,并出现2个事件

其一,grep尤其是rg工具代替了read,Agent不再实际读取单个文件,而是一次性搜索一批文件片段,此处没有带每个文件修改日期。
这条不是特别致命,仍然能逐个根据文件名确认日期

其二,更聪明的Agent开始工具并行调用。在每轮会话调用2个,或者更多工具,
可能对同一个文件的不同位置同时调用5个Edit,且执行顺序不固定(结果幂等)。
这直接导致occ锁不能用了。

在现代编辑容忍上述并行编辑冲突,以确保Agent高效并行编辑是合理做法,
毕竟大多数编辑是不冲突的

必须串行编辑重要文件,认为AGENTS.md已经是合理方案
如果是非常重要文件,认为可以执行提供MCP,通过skill或者其他约束指定agent必须使用此MCP写入

1 个赞

这个实现并不复杂,按照文件最后修改时间做一下比对就行,如果通过MCP工具也能实现,但会增加额外,包括准确性成本和时间成本。或者再简单一点,只需搜索出对话后,是否存在人工修改的文件就行,不用精确到具体文件,充分利用现有的文件读取机制即可。
这样改进后,会很大程度提高Trae agent的准确率。

1 个赞