IIWAB

ReAct 循环:为什么缓存读取量随轮数近似二次方($O(n^2)$)增长

IIWAB 3天前 ⋅ 24 阅读

先回顾标准 ReAct:Thought → Action → Observation 循环,每一轮 Agent 做决策时,把全部历史(之前所有 Thought、Action、Observation)拼到 Prompt 里一起喂给模型。

设:

  • = 循环轮次

  • 单轮产出(Thought+Action+Obs)平均 token 长度 = (近似常数)

  • 第1轮推理:读取历史长度 ≈

  • 第2轮推理:读取历史长度 ≈

  • 第3轮推理:读取历史长度 ≈ $3L$

  • …

  • 第 轮推理:读取历史长度 ≈

总累计读取量(所有轮次加起来)

👉 这就是二次方增长的根源:每一轮都重读全部过往历史。

注意区分两个概念:

  1. 单轮输入长度:(线性)
  2. 累计缓存读取量(每轮都读一遍历史,累加):(二次)

这是原生 ReAct 最经典的效率问题,和Loop Engineering 痛点直接对上:Loop 跨轮持续跑的时候,成本、延迟会快速失控。


补充:什么时候会偏离严格二次方?

  • 如果 Observation 非常长(比如工具返回大文档), 不再是常数,二次方会变成更糟;
  • 如果做了简单截断:到最大上下文窗口后丢弃最早记录,累计读取会变成有界的线性增长,但代价是丢失早期信息,Agent 容易失忆、违背前期约束。

如何降低这个增长(按流派分类,贴合 Agent Loop / Graph 工程视角)

核心思路只有一句话:打破“每一轮都重读全量历史”这个前提。下面从轻量改造到架构级方案依次列出:

1. 摘要压缩(Summary / Rolling Summary,最常用)

每经过 k 轮,把前面 k 轮历史压缩成一段摘要,不再保留原始 Thought/Obs 原文。

  • 策略:滑动窗口摘要、分层摘要、遇到关键节点(任务分支、审批点)才摘要
  • 复杂度变化: 原始 → 控制为 , 是摘要固定长度,变成线性
  • 缺点:摘要会丢失细节,容易引入摘要幻觉;关键信息丢失会导致任务失败。

Loop 工程里常用:在循环的“校验完成节点”触发摘要。

2. 检索式历史(RAG / 向量检索,按需读取,不预加载全部)

不再把全部历史塞进 Prompt,改成:本轮决策时,根据当前问题/目标,只检索相关历史片段。

  • 不再固定读取 1~n 全部历史;读取量和相关性挂钩,而不是和轮次绑定
  • 复杂度:理想情况下接近 , 是每次检索召回片段数量(常数)
  • 痛点:时序依赖、隐性约束很难被向量检索命中(比如“之前约定的审批规则”);适合信息检索型任务,不适合强时序依赖的长流程。

3. 状态机 / 显式结构化状态(Graph Engineering 的方案)

这是 Graph 工程的核心解法:把历史里的“有效状态”和“过程日志”拆开

  • 结构化状态(state):变量、标志位、依赖、中间结果、审批状态,用 JSON/Protobuf 持久化,固定大小
  • 过程日志:原始 Thought/Obs,存入外部存储,默认不读;只有异常回溯、人工排查时才读取
  • Agent 每一轮决策只传入【当前结构化状态 + 最近少量交互】,而不是全量日志
  • 复杂度:,且常数项很小;状态大小基本不随轮数膨胀

对比: ReAct 原生:历史 = 日志,决策必须读全部日志 Graph 编排:状态是一等公民,日志只是审计附件

4. 分层记忆 / 分离短期记忆 + 长期记忆

  • 短期记忆:最近几轮原始交互,直接放进 Prompt(小窗口)
  • 长期记忆:重要结论、约束、已完成子任务,写入独立记忆库;非相关轮次不加载
  • 典型:MemGPT 这类架构;本质是窗口截断 + 重要信息抽取写入长期记忆的组合。

5. 断点式、事件驱动的循环(改造 ReAct 循环本身)

原生 ReAct 是每一步都调用模型决策; 改成:只有事件发生(工具返回异常、分支切换、人工审批到达)才触发模型思考;普通确定性步骤直接走硬编码路由,不进入 ReAct 思考轮次。 👉 减少模型调用次数 n,从源头压低累计读取量;这也是 Graph 编排里“确定性节点不进Agent循环”的设计。

6. 增量式上下文、差分输入(Diff Prompt)

只向模型传递从上一轮到本轮发生变化的部分,不变的历史不再重复传入。

  • 适合状态变化很小的循环;缺点是模型需要理解差分,很多模型原生不友好;校验成本高。

7. 遗忘策略(选择性丢弃)

规则化丢弃:已经确认完成的子任务、失效的临时信息,标记为可丢弃,不再参与后续 Prompt。 适合有明确子任务边界的任务;风险是没有回溯能力,出错后无法复盘。


方案对比 & 选型(贴合 Loop / Graph 工程视角)

方案复杂度改善信息损失适合场景
原始 ReAct无短轮次 Demo
滚动摘要有(摘要丢失细节)长循环、创意类、分析类 Loop
向量检索按需加载接近 隐性时序约束容易丢信息查询、知识库类 Agent
显式结构化状态(Graph),常数极小日志和状态解耦,状态永不膨胀业务流程、审批、多Agent编排、持续自主Loop(优先推荐)

一句话总结架构视角: ReAct 的二次方开销,本质是把过程日志当成了状态; Graph Engineering 的解法就是把状态显式抽出来,日志降级为审计,从根源规避二次方。


延伸思考题

Loop 工程是持续自主运转,天然 n 很大;如果仍然用原生 ReAct,成本随轮数爆炸,所以 Graph 工程才会提出显式执行图、结构化状态持久化,本质就是为了解决这个 的读取开销问题。


全部评论: 0 条

    我有话说: