ae2fd1032f
- 更新 15 个 Agent 的 HEARTBEAT.md 文件 - 新增智能体运行稳定性保障标准模板 - 更新 BIZ-13 方案文档(v1.1,Phase 1 执行中状态) - 心跳频率分级:高频 10min / 开发 15min / 业务 15min - 超时阈值分级:高频 60min / 开发 120min / 业务 90min - 轮次上限分级:高频 50轮 / 开发 100轮 / 业务 30轮 Co-authored-by: multica-agent <github@multica.ai>
346 lines
8.1 KiB
Markdown
346 lines
8.1 KiB
Markdown
# BIZ-13 智能体运行稳定性保障方案
|
||
|
||
> 版本:v1.1
|
||
> 编制:陆怀瑾(COO)
|
||
> 日期:2026-06-22
|
||
> 状态:Phase 1 执行中(Vincent 已审阅同意)
|
||
|
||
---
|
||
|
||
## 一、目标
|
||
|
||
解决智能体运行中的两大核心问题:
|
||
1. **任务停滞**:智能体未完成任务便停滞不前
|
||
2. **429 限流**:API 速率限制(当前 40 RPM)导致任务延迟
|
||
|
||
确保智能体系统稳定、可靠、持续运行。
|
||
|
||
---
|
||
|
||
## 二、任务停滞问题分析
|
||
|
||
### 2.1 根因分析
|
||
|
||
| 根因 | 表现 | 发生频率 |
|
||
|------|------|----------|
|
||
| 超时无响应 | 执行到某一步后卡住,无输出 | 高 |
|
||
| 依赖缺失 | 等待前置条件,但条件永不满足 | 中 |
|
||
| 无限循环 | 反复执行相同逻辑,无进展 | 中 |
|
||
| 上下文溢出 | Token 超限,无法继续 | 低 |
|
||
| 工具调用失败 | 工具返回错误,未处理 | 中 |
|
||
| 等待用户确认 | 错误地等待人类输入 | 高 |
|
||
|
||
### 2.2 典型案例
|
||
|
||
```
|
||
案例 1:等待用户确认
|
||
问题:Agent 发现任务后,向用户请示"要不要做"
|
||
影响:用户不在线时,任务卡死数小时
|
||
对策:HEARTBEAT.md 明确规定"禁止请示"
|
||
|
||
案例 2:依赖循环等待
|
||
问题:Agent A 等 Agent B,Agent B 等 Agent A
|
||
影响:双方永远无法推进
|
||
对策:依赖图检测 + 超时自动降级
|
||
|
||
案例 3:工具调用失败未处理
|
||
问题:工具返回错误,Agent 未检查,继续执行
|
||
影响:后续步骤全部失败
|
||
对策:强制错误检查 + 重试机制
|
||
```
|
||
|
||
---
|
||
|
||
## 三、任务停滞解决方案
|
||
|
||
### 3.1 心跳超时检测
|
||
|
||
**机制**:每个 Agent 配置 HEARTBEAT.md,定期执行检查清单
|
||
|
||
**超时阈值**:
|
||
- 高频 Agent(secretary/coo):10 分钟
|
||
- 开发 Agent:15 分钟
|
||
- 业务 Agent:15 分钟
|
||
|
||
**超时处理**:
|
||
```
|
||
检测到超时
|
||
↓
|
||
检查任务状态
|
||
↓
|
||
┌─────┴─────┐
|
||
│ │
|
||
有进展 无进展
|
||
│ │
|
||
延长超时 自动恢复
|
||
(通知 COO) (重新调度)
|
||
```
|
||
|
||
### 3.2 依赖检查前置
|
||
|
||
**规则**:任务开始前,检查所有依赖是否满足
|
||
|
||
```python
|
||
def check_dependencies(task):
|
||
for dep in task.depends_on:
|
||
if not is_complete(dep):
|
||
return False, f"依赖 {dep} 未完成"
|
||
return True, "依赖满足"
|
||
|
||
# 任务启动前强制检查
|
||
ready, reason = check_dependencies(task)
|
||
if not ready:
|
||
set_status(task, "blocked", reason)
|
||
notify_co()
|
||
```
|
||
|
||
### 3.3 最大轮次限制
|
||
|
||
**规则**:单任务最大执行轮次限制
|
||
|
||
| Agent 类型 | 最大轮次 | 超限处理 |
|
||
|------------|----------|----------|
|
||
| 高频 Agent | 50 | 自动暂停,通知 COO |
|
||
| 开发 Agent | 100 | 自动暂停,记录日志 |
|
||
| 业务 Agent | 30 | 自动暂停,通知创建者 |
|
||
|
||
### 3.4 上下文控制
|
||
|
||
**策略**:引用代替填塞
|
||
|
||
```
|
||
错误做法:
|
||
- AGENTS.md 中嵌入全部 Agent 信息(3000+ tokens)
|
||
|
||
正确做法:
|
||
- AGENTS.md 只保留核心协作协议
|
||
- 详细信息存 docs/agent-roster.md
|
||
- 通过引用链接访问
|
||
```
|
||
|
||
**上下文清理**:
|
||
- 每轮对话前清理过期信息
|
||
- 工具调用结果仅保留必要部分
|
||
- 长文档分块读取
|
||
|
||
---
|
||
|
||
## 四、429 限流问题分析
|
||
|
||
### 4.1 当前限制
|
||
|
||
| 模型 | RPM 限制 | 当前使用 | 风险等级 |
|
||
|------|----------|----------|----------|
|
||
| 主模型 (qwen3.5-397b) | 40 | ~30 | 中 |
|
||
| 备用模型 (deepseek-v4-pro) | 40 | ~10 | 低 |
|
||
|
||
### 4.2 限流影响
|
||
|
||
```
|
||
触发 429 限流
|
||
↓
|
||
任务延迟执行
|
||
↓
|
||
┌─────┴─────┐
|
||
│ │
|
||
等待恢复 任务失败
|
||
(分钟级) (小时级)
|
||
```
|
||
|
||
---
|
||
|
||
## 五、429 限流解决方案
|
||
|
||
### 5.1 请求队列 + 优先级调度
|
||
|
||
**队列设计**:
|
||
```
|
||
请求队列(FIFO + 优先级)
|
||
┌─────────────────────────────────────┐
|
||
│ 优先级 1 (紧急): Vincent 直接任务 │
|
||
│ 优先级 2 (高): 阻塞性任务 │
|
||
│ 优先级 3 (正常): 常规任务 │
|
||
│ 优先级 4 (低): 后台优化任务 │
|
||
└─────────────────────────────────────┘
|
||
↓
|
||
令牌桶限流
|
||
↓
|
||
模型 API
|
||
```
|
||
|
||
**调度算法**:
|
||
```python
|
||
def schedule_request(request):
|
||
# 1. 加入优先级队列
|
||
priority_queue.add(request)
|
||
|
||
# 2. 检查令牌桶
|
||
if token_bucket.has_tokens():
|
||
token_bucket.consume()
|
||
send_to_api(request)
|
||
else:
|
||
# 3. 等待或降级
|
||
if request.priority >= 2:
|
||
wait_for_token()
|
||
else:
|
||
fallback_to_backup_model(request)
|
||
```
|
||
|
||
### 5.2 多模型负载均衡
|
||
|
||
**模型池**:
|
||
| 模型 | 用途 | 优先级 |
|
||
|------|------|--------|
|
||
| qwen3.5-397b | 主模型,复杂推理 | 高 |
|
||
| deepseek-v4-pro | 备用模型,常规任务 | 中 |
|
||
| 本地模型 | 简单任务,成本优化 | 低 |
|
||
|
||
**负载均衡策略**:
|
||
```
|
||
主模型可用且 RPM 充裕
|
||
↓
|
||
使用主模型
|
||
↓
|
||
主模型 RPM 不足
|
||
↓
|
||
切换到备用模型
|
||
↓
|
||
备用模型也不足
|
||
↓
|
||
降级到本地模型或等待
|
||
```
|
||
|
||
### 5.3 智能重试机制
|
||
|
||
**指数退避 + Jitter**:
|
||
```python
|
||
def retry_with_backoff(api_call, max_retries=3):
|
||
for i in range(max_retries):
|
||
try:
|
||
return api_call()
|
||
except RateLimitError:
|
||
delay = (2 ** i) * 1000 + random(0, 1000) # ms
|
||
sleep(delay)
|
||
|
||
raise Exception("重试失败")
|
||
```
|
||
|
||
**重试策略**:
|
||
| 重试次数 | 延迟时间 | 说明 |
|
||
|----------|----------|------|
|
||
| 第 1 次 | 1-2 秒 | 快速重试,应对短暂波动 |
|
||
| 第 2 次 | 2-4 秒 | 指数退避 |
|
||
| 第 3 次 | 4-8 秒 | 切换备用模型 |
|
||
|
||
### 5.4 请求合并与缓存
|
||
|
||
**合并策略**:
|
||
```
|
||
错误做法:
|
||
- 每个 Agent 独立轮询 WorkBoard(40 RPM × N Agent)
|
||
|
||
正确做法:
|
||
- COO 统一轮询,广播结果
|
||
- 减少轮询频率(10 分钟 → 15 分钟)
|
||
- 合并相似查询
|
||
```
|
||
|
||
**缓存策略**:
|
||
```
|
||
查询请求
|
||
↓
|
||
检查缓存
|
||
↓
|
||
┌─────┴─────┐
|
||
│ │
|
||
缓存命中 缓存未命中
|
||
│ │
|
||
返回缓存 调用 API → 更新缓存
|
||
```
|
||
|
||
**缓存有效期**:
|
||
| 数据类型 | 有效期 | 说明 |
|
||
|----------|--------|------|
|
||
| WorkBoard 状态 | 5 分钟 | 高频变化 |
|
||
| Agent 配置 | 1 小时 | 低频变化 |
|
||
| 知识库内容 | 1 天 | 基本不变 |
|
||
| 用户信息 | 1 天 | 基本不变 |
|
||
|
||
---
|
||
|
||
## 六、监控与告警
|
||
|
||
### 6.1 监控指标
|
||
|
||
| 指标 | 阈值 | 告警级别 |
|
||
|------|------|----------|
|
||
| 任务停滞时长 | > 1h | 警告 |
|
||
| 任务停滞时长 | > 4h | 严重 |
|
||
| 429 错误率 | > 5% | 警告 |
|
||
| 429 错误率 | > 20% | 严重 |
|
||
| Agent 响应延迟 | > 30s | 警告 |
|
||
|
||
### 6.2 告警流程
|
||
|
||
```
|
||
监控系统检测到异常
|
||
↓
|
||
记录日志
|
||
↓
|
||
┌─────┴─────┐
|
||
│ │
|
||
警告 严重
|
||
│ │
|
||
通知 COO 通知 Vincent
|
||
```
|
||
|
||
### 6.3 监控工具
|
||
|
||
- Prometheus + Grafana(基础设施监控)
|
||
- 自定义 Agent 健康检查脚本
|
||
- WorkBoard 诊断工具
|
||
|
||
---
|
||
|
||
## 七、实施步骤
|
||
|
||
### 阶段 1:心跳机制落地(本周)
|
||
- [x] 更新所有 Agent 的 HEARTBEAT.md(15/15 Agent 已完成)
|
||
- [x] 已创建分步实施子任务(BIZ-24 ~ BIZ-28,5个子任务)
|
||
- [ ] 配置定时任务(10/15 分钟)→ BIZ-25,已分派 opengineer 严维序
|
||
- [ ] 测试超时检测 → BIZ-24 执行中
|
||
|
||
### 阶段 2:限流优化(下周)
|
||
- [ ] 实现请求队列
|
||
- [ ] 配置多模型负载均衡
|
||
- [ ] 实现智能重试
|
||
|
||
### 阶段 3:监控体系(持续)
|
||
- [ ] 搭建监控面板
|
||
- [ ] 配置告警规则
|
||
- [ ] 定期健康检查
|
||
|
||
---
|
||
|
||
## 八、风险与对策
|
||
|
||
| 风险 | 影响 | 对策 |
|
||
|------|------|------|
|
||
| 心跳任务本身卡死 | 监控失效 | 独立监控进程 |
|
||
| 请求队列过长 | 延迟增加 | 动态扩容 |
|
||
| 缓存数据过期 | 决策错误 | 设置 TTL + 主动刷新 |
|
||
|
||
---
|
||
|
||
## 九、交付物清单
|
||
|
||
- [ ] HEARTBEAT.md 更新模板
|
||
- [ ] 请求队列实现代码
|
||
- [ ] 多模型负载均衡配置
|
||
- [ ] 智能重试机制实现
|
||
- [ ] 监控面板 URL
|
||
- [ ] 告警规则配置
|
||
|
||
---
|
||
|
||
> ⚠️ 本方案需 Vincent 审阅后方可实施。审阅前不修改任何 Agent 配置文件。 |