记忆点:ReAct 循环可用,但状态、延迟和权限要由系统治理。
💡 答案要点
ReAct三大核心缺陷:
缺陷1:上下文漂移(Context Drift)
问题:多轮推理时中间步骤累积 → 早期关键信息被稀释
示例:
第1轮:检索到重要上下文A
第5轮:A被埋在第500行token里 → 模型"忘记"了
结果:推理正确率从85% → 40%(5轮后)解决方案:
python
# 方法1:关键信息摘要回写
class ReActWithMemory:
def __init__(self):
self.key_info = [] # 提取关键信息
def step(self, observation):
# 每次推理后提取关键信息
summary = llm.generate(f"提取本步关键信息:{observation}")
self.key_info.append(summary)
# 下次推理时把关键信息放回上下文
context = "关键信息:" + ";".join(self.key_info[-3:])
return context
# 方法2:定期重置
if len(steps) > 5:
# 每5步做一次摘要压缩
compressed = summarize_history(steps)
steps = [compressed]缺陷2:高延迟(每步都是一次LLM调用)
问题:10步ReAct = 10次LLM调用 = 10x延迟
优化方案:
- 并行检索:Thought步同时发出多个检索查询
- 批量Action:Action步可以批量调用工具(vLLM投机采样思路)
- 提前终止:置信度高时直接输出,不走完全部步数解决方案:
python
# 并行Action优化
class ParallelReAct:
def think(self, state):
# 单次LLM调用生成多个候选Action
actions = llm.generate(
f"为这个问题生成3个可能的解决动作",
n=3 # 一次生成多个
)
# 并行执行(如果工具支持)
results = asyncio.gather(*[
execute_tool(a) for a in actions
])
# 评估选择最优
best = evaluate(results)缺陷3:规划执行耦合(Plan-Execution Coupling)
问题:Thought和Action强耦合 → 推理错误会传导到执行
示例:
错误思考:"我需要查天气,因为要决定穿什么" → Action: search_weather
实际:用户问的是"明天北京冷不冷" → 检索结果完全跑偏解决方案:
python
# Plan-and-Solve:解耦规划与执行
class PlanAndSolve:
def plan(self, task):
# 第一步:只做规划(不执行)
plan = llm.generate(f"分解任务为步骤:{task}")
# 规划审查
if not validate_plan(plan):
return replan(task) # 规划不对就重规划
# 第二步:执行计划
return execute(plan)
# 关键:规划错误可以在执行前发现,而不是执行后才发现工程实践总结:
| 规避策略 | 适用场景 | 效果 |
|---|---|---|
| 关键信息摘要回写 | 多轮对话/长任务 | 减少漂移60% |
| 定期重置/压缩历史 | 超长推理链 | 保持上下文清晰 |
| 并行Action | 工具调用延迟敏感 | 延迟降低50% |
| Plan-and-Solve | 复杂任务分解 | 减少规划执行耦合 |
| 提前终止 | 简单任务 | 延迟降低40% |
面试话术:
"ReAct 的常见风险是上下文膨胀、循环、错误观察传播和逐步调用延迟。可以用结构化状态、步骤/预算上限、工具结果校验和可更新计划治理;只有互不依赖且无冲突的动作才并行。摘要也可能丢信息,因此要保留关键事实来源,并用任务集比较成功率、成本与尾延迟。"
