ai-chatbot/docs/Agent真正变聪明-系统级整改清单-2026-03-16.md
Your Name 9ecd91376d
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: strengthen agent runtime boundaries
2026-03-16 11:45:00 +08:00

668 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Agent 真正变聪明:系统级整改清单(2026-03-16)
> 目标:不是继续给 Agent 打零散补丁,而是把它从“很多聪明 patch 的组合体”,升级成“统一、稳定、可解释、可扩展的对话智能系统”。
>
> 适用范围:
> - `app/(chat)/api/chat/route.ts`
> - `lib/ai/auto-agent-graph.ts`
> - `lib/ai/smart-analyzer.ts`
> - `lib/ai/conversation-state-protocol.ts`
> - `lib/ai/conversation-*`
> - `lib/ai/runtime/*`
> - `lib/video-agent/*`
> - 画布上下文、图片工作流、视频工作流
---
## 0. 先说结论
### 0.1 现在 Agent 为什么“看起来不聪明”
不是单纯模型不够强,而是系统层面还有 5 个根问题:
1. **任务边界不稳定**
- 新任务、继续任务、只聊天、只看图、只要提示词、直接执行,经常互相串。
2. **上下文污染严重**
- 当前输入、历史图片、画布图片、上一轮 workflow、长期记忆,经常一起灌给模型。
- 结果就是用户说一句“你好”,系统也可能把它理解成“继续上一轮修图”。
3. **理解层和执行层没完全解耦**
- 一部分逻辑已经进 protocol / subagent / runtime。
- 但还有不少判断仍然散在 `chat/route.ts`,导致行为不稳定、修改成本高。
4. **模型链路不够统一**
- planner、analyzer、最终回复、图片执行、视频执行并不是同一套稳定规则。
- 之前就出现过:Agent 默认模型是豆包,但最终对话回复走了别的供应商。
5. **超时退化不够“保正确”**
- 一旦 `runAutoAgentGraph`、图像总结、Provider 流式返回超时,系统容易退化成“还能跑,但不对题”。
### 0.2 我们这次整改的目标
这次不是“继续修 10 个 bug”,而是把 Agent 升级成:
- **先判断任务,再选择上下文**
- **先选正确路线,再决定模型和工具**
- **宁可简单,也不跑偏**
- **即使失败,也要明确告诉用户为什么失败**
---
## 1. 这次整改的总原则
### 1.1 一个原则:先判任务,再喂上下文
以后不能再用“把所有上下文先塞给模型,再让模型自己判断”的方式。
要改成:
1. 先判断这轮是:
- 新任务
- 连续任务
- 只分析
- 只要提示词
- 直接执行
- 聊天寒暄
2. 再按这个任务类型,裁剪要喂给模型的上下文
### 1.2 一个原则:执行型和对话型必须分开
以后要明确分两类:
- **对话型回合**
- 聊天
- 看图分析
- 提示词整理
- 澄清确认
- **执行型回合**
- 生图
- 修图
- 生视频
- 分镜确认执行
对话型回合不能轻易被旧工作流拖进执行型链路。
### 1.3 一个原则:失败也要“可解释”
以后不允许再出现这几种体验:
- 用户发了消息,看起来“没反应”
- 数据库里只存了 keepalive
- 模型报错了,但前端没显示
- 回退了,但用户不知道系统为什么回退
---
## 2. 总体架构目标
目标架构:
1. **Task Boundary Layer**
2. **Context Pruning Layer**
3. **Conversation State Protocol**
4. **Planner / Subagent Layer**
5. **Execution Gate Layer**
6. **Persistence / Event Layer**
7. **Frontend Projection Layer**
一句话解释:
- **边界层**决定“你这轮到底要干嘛”
- **裁剪层**决定“该给模型看哪些上下文”
- **协议层**负责统一状态读写
- **子代理层**负责专业领域判断
- **执行门控层**负责确认、取消、修改、超时回退
- **事件层**负责可追踪
- **前端层**负责把系统理解结果明确展示给用户
---
## 3. 五大整改块
---
## 3.1 任务理解层
### 3.1.1 目标
让 Agent 先稳定判断:
- 这是新任务还是继续任务
- 这是对话型还是执行型
- 这是只分析、只要提示词、还是直接执行
### 3.1.2 当前问题
当前系统虽然已经有:
- `conversation-action-resolver`
- `smart-analyzer`
- `skill-router`
- `auto-agent-graph`
但这几层对“任务边界”的定义还不完全统一。
典型问题:
1. “你好”被旧图片 workflow 拖成连续修图
2. “帮我写这张图的提示词”被拖成生图/修图流程
3. 用户只是问“这个图怎么写提示词”,系统却提前进入执行链
### 3.1.3 必做改造
#### A. 新增统一任务边界分类器
建议新增:
- `lib/ai/runtime/task-boundary-classifier.ts`
输出统一结构:
```ts
type TaskBoundaryDecision = {
taskType:
| "greeting"
| "chat"
| "analysis_only"
| "prompt_only"
| "execution_image"
| "execution_video"
| "workflow_followup";
taskMode: "new" | "continue" | "revise" | "confirm" | "cancel";
shouldUseCanvasContext: boolean;
shouldUseHistoryImages: boolean;
shouldUseWorkflowMemory: boolean;
shouldAllowExecution: boolean;
confidence: number;
reason: string;
};
```
#### B. 明确任务优先级规则
优先级必须写死在系统里,不能全靠模型猜:
1. `prompt_only` > `workflow_followup`
2. `analysis_only` > `execution_image`
3. `greeting` > 任意旧 workflow
4. `confirm/cancel/revise` > 普通分析
5. 当前上传图 > 历史图 > 画布背景图
#### C. 给“非执行任务”开快路径
以下场景应该直接走快路径:
- 纯打招呼
- 只要提示词
- 只看图分析
- 只问建议
这些回合不应该再先跑完整 `runAutoAgentGraph`。
### 3.1.4 落点文件
- `app/(chat)/api/chat/route.ts`
- `lib/ai/conversation-action-resolver.ts`
- `lib/ai/smart-analyzer.ts`
- `lib/ai/runtime/task-boundary-classifier.ts`(新增)
### 3.1.5 验收标准
- “你好”永远不被识别为连续修图/连续生图
- “帮我写这张图的提示词”永远不直接触发执行
- “按照刚才那个提示词,再生成 4 张”会稳定识别为连续生图执行
---
## 3.2 记忆层
### 3.2.1 目标
让 Agent 的记忆从“混在一起”变成“分层可控”。
### 3.2.2 当前问题
现在虽然已经有:
- `promptMemory`
- `imageWorkflowMemory`
- `storyboardPreferenceMemory`
- `threadState`
- `workingState`
但问题是:
1. 历史 workflow 容易污染当前回合
2. 画布上下文太大,容易把简单任务拖重
3. “当前相关记忆”和“长期偏好记忆”还没完全分层
### 3.2.3 必做改造
#### A. 拆成 4 层记忆
1. **Turn Memory**
- 当前回合输入
- 当前上传图片
- 当前画布选中
2. **Task Memory**
- 当前任务工作流状态
- 当前任务目标图
- 当前任务优化提示词
3. **Session Memory**
- 当前会话最近 3~5 个高相关任务摘要
4. **Preference Memory**
- 用户长期偏好
- 常用比例
- 常用宫格
- 常用确认习惯
#### B. 增加“记忆衰减/降权”机制
如果旧 workflow 满足任一条件,应自动降权:
- 超过 N 轮未继续
- 当前上传了新图
- 当前任务类型和旧任务类型冲突
- 用户显式说“重新来 / 新开一个 / 别按刚才那个”
#### C. 建立 relevance score
建议新增:
- `lib/ai/runtime/memory-relevance.ts`
对候选记忆打分:
- 当前上传图命中:+100
- 当前选中图命中:+90
- 显式引用“上一张 / 第三张 / 这个提示词”:+80
- 同类任务:+40
- 同会话最近 3 轮:+20
- 超过 10 轮未使用:-50
以后只把 top-k 记忆喂给 Planner。
### 3.2.4 落点文件
- `lib/ai/conversation-memory-composer.ts`
- `lib/ai/conversation-thread-state-builder.ts`
- `lib/ai/runtime/agent-thread-state.ts`
- `lib/ai/runtime/memory-relevance.ts`(新增)
### 3.2.5 验收标准
- 同一会话里,旧图不再轻易干扰新上传图任务
- 简单聊天不再带上大段无关画布上下文
- “继续上一个提示词”仍然能稳定命中
---
## 3.3 路由层
### 3.3.1 目标
让 Planner、Analyzer、最终回复模型、执行模型之间的职责彻底清晰。
### 3.3.2 当前问题
现在的问题不是“没有路由”,而是“路由规则不够统一”:
1. planner 模型和 reply 模型曾经不一致
2. analyzer 有时会被别的 provider 抢走
3. 生图/修图/视频执行模型与对话模型混杂
4. provider 报错或额度不足时,回退不够统一
### 3.3.3 必做改造
#### A. 明确 4 类模型槽位
统一定义:
1. `plannerModel`
2. `analyzerModel`
3. `replyModel`
4. `executionModel`
而不是所有地方都混着叫“当前模型”。
#### B. Agent 模式默认规则
在 `selectedChatModel = auto` 或进入 Agent 模式时:
- `plannerModel` = Agent 默认模型
- `analyzerModel` = Agent 默认模型优先,多模态能力不足时再回退
- `replyModel` = Agent 默认模型
- `executionModel` = 按任务类型路由
#### C. Provider 健康与额度状态缓存
建议新增:
- `lib/ai/runtime/provider-health.ts`
缓存内容:
- 最近错误类型
- 最近额度不足
- 最近超时率
- 最近 5 分钟成功率
如果某 provider 连续报:
- `quota not enough`
- `403`
- `timeout`
则在短时间内直接降级,避免用户连续踩坑。
### 3.3.4 落点文件
- `app/(chat)/api/chat/route.ts`
- `lib/ai/model-router.ts`
- `lib/ai/smart-analyzer.ts`
- `lib/ai/auto-agent-graph.ts`
- `lib/ai/runtime/provider-health.ts`(新增)
### 3.3.5 验收标准
- Agent 模式不会再出现“规划走豆包、回复走别家”的错位
- 上游 provider 额度不足时,能快速回退或明确报错
- 对话模型、执行模型职责清晰
---
## 3.4 执行层
### 3.4.1 目标
让执行系统遵守:
- 该确认时必须确认
- 该取消时必须停
- 该提示时只提示,不执行
- 该失败时明确失败
### 3.4.2 当前问题
虽然我们已经做了很多 protocol / workflow 事件:
- clarification
- storyboard confirm
- revision
- cancel
- execution started/completed
- video generation started/completed/failed
但执行层还存在 3 个结构问题:
1. 快路径不够多
2. timeout fallback 仍偏重
3. “对话型输出”和“执行型输出”没有完全剥离
### 3.4.3 必做改造
#### A. 建立 execution policy gate
建议新增:
- `lib/ai/runtime/execution-policy-gate.ts`
统一做这些判定:
- 当前回合是否允许执行
- 当前回合是否必须先确认
- 当前回合是否应该只输出提示词
- 当前回合是否应该只对话
#### B. 扩展 fast-path 列表
必须内建以下快路径:
1. greeting fast-path
2. prompt-only fast-path
3. analysis-only fast-path
4. confirmation fast-path
5. cancel fast-path
#### C. timeout 退化策略升级
以后 timeout 退化规则应改成:
- `execute` 超时 → 不自动换任务类型
- `planner` 超时 → 退到简单规则,但不跨任务边界
- `provider` 超时 → 直接明确告诉用户该 provider 超时
一句话:
**退化后可以更笨,但不能更错。**
### 3.4.4 落点文件
- `lib/ai/runtime/middlewares/human-confirmation-gate.ts`
- `lib/ai/runtime/execution-policy-gate.ts`(新增)
- `app/(chat)/api/chat/route.ts`
- `lib/video-agent/storyboard-chat-followup.ts`
### 3.4.5 验收标准
- “只要提示词”绝不执行生图
- “确认开始生成”绝不只回复聊天
- provider 报错时前端总能看到明确原因
---
## 3.5 前端交互层
### 3.5.1 目标
让用户知道 Agent 当前理解成了什么,而不是靠猜。
### 3.5.2 当前问题
现在前端可见性还不够:
1. 用户不知道系统把这轮理解成聊天、分析还是执行
2. 用户不知道系统到底引用了哪张图
3. 用户不知道系统为什么突然继续上一轮任务
4. 用户不知道系统为什么没执行
### 3.5.3 必做改造
#### A. 增加“本轮理解摘要”
建议在输入框附近或 assistant 第一段里展示:
- 本轮类型:`聊天 / 分析 / 提示词 / 生图 / 修图 / 视频`
- 目标来源:`当前上传 / 画布选中 / 历史结果 / 上一轮提示词`
- 是否会执行:`仅分析 / 待确认 / 直接执行`
#### B. 增加“任务切换提示”
当系统从旧 workflow 切到新任务时,前端明确显示:
- “已识别为新任务,不继续沿用上一轮修图流程”
当系统继续旧任务时,显示:
- “已继续上一轮修图流程”
#### C. 协议调试面板继续升级
当前已有 `ProtocolDebugPanel`,建议继续加:
- 当前任务边界摘要
- 当前记忆裁剪摘要
- 当前模型槽位摘要(planner / reply / execution)
- 当前 provider 健康状态
### 3.5.4 落点文件
- `components/chat.tsx`
- `components/protocol-debug-panel.tsx`
- `components/canvas/CanvasChatPanel.tsx`
### 3.5.5 验收标准
- 用户能看见“系统理解成什么”
- 用户能看见“为什么这轮不执行”
- debug 时能看见模型和 workflow 生命周期
---
## 4. 实施顺序(必须按这个顺序)
### P0:先止血
1. greeting fast-path
2. prompt-only fast-path
3. stream provider 错误明确回显
4. Agent 模式 replyModel 跟随 Agent 默认模型
> 这几项已经部分落地,但要继续收边并补测试。
### P1:统一任务边界
1. `task-boundary-classifier`
2. 统一 taskType / taskMode / allowExecution
3. 对 route 中旧 heuristics 收口
### P2:统一记忆裁剪
1. relevance scoring
2. session/task/preference 记忆分层
3. 旧 workflow 自动降权
### P3:统一模型链路
1. planner / analyzer / reply / execution 四槽位
2. provider health cache
3. 额度不足/超时自动降级
### P4:统一前端解释性
1. 本轮理解摘要
2. 任务切换提示
3. 调试面板生命周期摘要
---
## 5. 开发清单(可直接排期)
### 5.1 任务理解层
- [ ] 新增 `lib/ai/runtime/task-boundary-classifier.ts`
- [ ] 把 `conversation-action-resolver` 和 `smart-analyzer` 结果统一映射到 `taskType`
- [ ] 增加 `taskMode`:`new/continue/revise/confirm/cancel`
- [ ] 增加 fast-path 优先级表
### 5.2 记忆层
- [ ] 新增 `memory-relevance.ts`
- [ ] `composeConversationMemory` 支持 top-k 裁剪
- [ ] 为 workflow memory 增加过期/降权规则
- [ ] 为 prompt-only / analysis-only 场景建立独立上下文模板
### 5.3 路由层
- [ ] 统一 planner / analyzer / reply / execution 槽位
- [ ] Agent replyModel 跟随 Agent 默认模型
- [ ] provider health 状态缓存
- [ ] 上游 quota / timeout 短时熔断
### 5.4 执行层
- [ ] 新增 `execution-policy-gate.ts`
- [ ] clarification / prompt-only / analysis-only 全部走快路径
- [ ] timeout fallback 改成“保正确优先”
- [ ] 错误统一映射为用户可理解消息
### 5.5 前端层
- [ ] 增加“本轮理解摘要”
- [ ] 增加“任务切换提示”
- [ ] Protocol Debug 增加模型槽位摘要
- [ ] Protocol Debug 增加上下文裁剪摘要
---
## 6. 这次整改完成后,用户体验应该变成什么样
### 场景 1:用户说“你好”
系统行为:
- 识别为 `greeting`
- 不读取旧修图 workflow
- 不做大规模图像分析
- 1 秒内稳定回复
### 场景 2:用户上传图片,说“帮我写这张图的提示词”
系统行为:
- 识别为 `prompt_only`
- 只分析当前图片
- 不进入生图/修图执行链
- 输出提示词
- 把提示词写入 prompt memory
### 场景 3:用户说“按刚才那个提示词再来 4 张”
系统行为:
- 识别为 `image_generation_followup`
- 复用上一轮提示词和参数
- 明确出图数量为 4
- 进入执行链
### 场景 4:用户说“修改第 3 镜头,再确认”
系统行为:
- 识别为 `workflow_followup + revise`
- 只进入 storyboard revision 子链路
- 不误切普通生图
---
## 7. 最后一句话
我们现在已经有:
- protocol
- subagent
- workflow event
- image/video memory
- debug stream
所以真正差的不是“没有 Agent”,而是:
> **还没有把任务边界、记忆裁剪、模型链路、执行门控做成统一系统。**
这份整改清单的目标,就是把 Agent 模式从:
**很多聪明 patch**
升级成:
**真正稳定的统一 Agent Runtime**
---
## 8. 建议的下一步执行顺序
如果马上开工,建议按下面顺序推进:
1. 先做 **`task-boundary-classifier`**
2. 再做 **memory relevance / context pruning**
3. 再做 **provider health + model slot unification**
4. 最后做 **前端理解摘要**
因为只有先把任务边界做对,后面的“更聪明”才不会继续建立在错误理解之上。