Files
Neo 70324d8542 chore: 文档与 IDE 配置整理
- .kiro/specs/ → docs/specs/(41 个历史需求 spec 迁移,移除 .config.kiro)
- CLAUDE.md 三层拆分:根文件精简 + apps/backend/CLAUDE.md + .claude/commands/
- 新增 /spec-close、/pre-change 两个工作流命令
- DDL 基线刷新(从测试库重新导出 11 个文件,dws 35→38 表,biz 18→21 表)
- BD_Manual → BD_manual 命名统一(48 个文件)
- 修复 3 处文档与数据库不一致(auth.users.status 默认值、scheduled_tasks 字段、RLS 视图数)
- 新增 BD_manual_public_rbac_tables.md(public schema 8 张 RBAC/工作流表)
- 合并 biz.trigger_jobs 文档(10→12 字段,归档独立文档)
- docs/database/README.md 索引更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 00:02:37 +08:00

335 lines
21 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.
# 需求文档 — P15AI 监控后台 + 测试重建 + 回填
## 简介
P14 完成 DashScope SDK 迁移和调度器修复后,本 Spec 覆盖三个方面:
1. admin-web AI 监控后台4 个页面:运行总览 Dashboard、调度状态、调用明细、手动操作
2. 测试体系重建(旧脚本归档、新全链路测试 15 个场景、属性测试更新 7 个)
3. 历史数据回填(半年内活跃会员 <100 人,分批执行 + 断点续跑)
**实施过程中如遇细节不明确,应优先查阅 PRD 原文 `docs/prd/specs/P15-ai-monitoring-testing.md`**
### 问题覆盖
本 Spec 覆盖 `docs/reports/2026-03-21__ai_module_issues.md` 中的:
- P2-1App5 话术缺分类(回填时验证 App5 输出包含分类字段)
- P2-2MCP 无健康检查admin-web Dashboard 展示各 App 最近调用状态)
- P2-4全链路测试不完整§3.2 新全链路测试)
- P3-3Prompt 版本管理(仅监控展示部分,只读)
### 依赖
- P14DashScope 迁移 + 调度器完善)— `P14-ai-dashscope-migration` spec 必须全部完成并验证通过
### 来源文档(权威参考)
- `docs/prd/specs/P15-ai-monitoring-testing.md` — PRD 主文档
- `docs/reports/2026-03-21__ai_module_issues.md` — 问题清单
- `docs/database/BD_Manual_ai_tables.md` — AI 表 BD 手册
### 不在本 spec 范围
- 多门店支持BACKLOG
- 消息队列(单独 PRD
- Prompt 版本管理的编辑功能BACKLOG本轮仅展示
- 前端刷新机制P1-5
- FDW 数据一致性P1-6
- 企业微信/邮件告警推送(后续迭代)
## 术语表
- **admin-web**:系统管理后台(`apps/admin-web/`面向系统管理员React + Vite + Ant Design
- **Backend**FastAPI 后端应用,位于 `apps/backend/`
- **Admin_AI_Service**:新增的 admin AI 聚合服务(`apps/backend/app/services/ai/admin_service.py`),负责聚合查询、批量操作、告警管理
- **Admin_AI_Router**:新增的 admin AI 路由文件(`apps/backend/app/routers/admin_ai.py`),注册 13 个 API 端点
- **Dashboard**AI 运行总览页面展示统计卡片、趋势图、App 分布、Token 预算、告警列表
- **ai_run_logs**AI 运行记录表P14 已创建),记录每次 DashScope API 调用的详细日志
- **ai_trigger_jobs**调度运行记录表P14 已创建),记录事件触发的调用链执行状态
- **ai_cache**AI 应用缓存表,各应用的结构化输出结果
- **App1~App8**8 个百炼智能体应用App1 通用对话、App2 财务洞察、App3 维客线索、App4 关系分析、App5 话术参考、App6 备注分析、App7 客户分析、App8 维客线索整理)
- **Backfill_Script**:历史数据回填脚本(`scripts/ops/ai_backfill.py`
- **Circuit_Breaker**:熔断器,按 app_id 独立计数P14 已实现)
- **Dispatcher**AI 事件调度与调用链编排器P14 已实现)
- **member_retention_clue**会员留存线索业务表App8 写入目标
## 需求
### 模块 Aadmin-web AI 监控后台 — 后端 API
#### 需求 A1Dashboard 总览统计 API
**用户故事:** 作为系统管理员,我希望通过 Dashboard API 获取 AI 运行总览数据以便在一个页面内掌握今日调用次数、成功率、Token 消耗、平均延迟和近 7 天趋势。
##### 验收标准
1. THE Backend SHALL 实现 `GET /api/admin/ai/dashboard` 端点,返回以下聚合数据:今日调用次数、今日成功率、今日 Token 消耗总量、今日平均延迟ms
2. THE Backend SHALL 在 Dashboard 响应中包含近 7 天的调用量和成功率按日聚合数据,用于趋势图展示
3. THE Backend SHALL 在 Dashboard 响应中包含各 App 调用占比分布数据(按 `ai_run_logs.app_type` 分组)
4. THE Backend SHALL 在 Dashboard 响应中包含日/月 Token 预算使用进度(已用量 / 预算上限)
5. THE Backend SHALL 在 Dashboard 响应中包含最近失败/超时/熔断告警事件列表(取自 `ai_run_logs` WHERE status IN ('failed', 'timeout', 'circuit_open')
6. THE Backend SHALL 支持 `site_id` 查询参数进行门店筛选
7. THE Backend SHALL 在 Dashboard 响应中包含各 App 最近一次调用状态,用于展示 App 健康状态(覆盖 P2-2 MCP 健康检查需求)
#### 需求 A2调度任务列表与详情 API
**用户故事:** 作为系统管理员,我希望查看调度任务的列表和详情,以便了解事件触发的执行状态、调用链和去重统计。
##### 验收标准
1. THE Backend SHALL 实现 `GET /api/admin/ai/trigger-jobs` 端点返回分页的调度任务列表包含事件类型、会员、状态、执行链app_chain、耗时
2. THE Backend SHALL 支持以下筛选参数:`event_type``status``site_id``date_from``date_to`
3. THE Backend SHALL 在列表响应中包含今日跳过的重复事件数(`ai_trigger_jobs` WHERE status='skipped_duplicate' AND created_at >= 今日零点)
4. THE Backend SHALL 实现 `GET /api/admin/ai/trigger-jobs/:id` 端点,返回单条调度任务的完整详情(含 payload、error_message
#### 需求 A3手动重跑 API
**用户故事:** 作为系统管理员,我希望对失败的调度任务进行手动重跑,以便修复因临时故障导致的执行失败。
##### 验收标准
1. THE Backend SHALL 实现 `POST /api/admin/ai/trigger-jobs/:id/retry` 端点,对指定调度任务发起手动重跑
2. WHEN 手动重跑时THE Backend SHALL 创建新的 `ai_trigger_jobs` 记录,标记 `is_forced=true`,跳过去重检查
3. THE Backend SHALL 在重跑请求后立即返回新的 `trigger_job_id``status: "pending"`,调用链在后台异步执行
#### 需求 A4调用记录列表与详情 API
**用户故事:** 作为系统管理员,我希望查看 AI 调用记录的列表和详情,以便追踪每次调用的 prompt、response、token 消耗和错误信息。
##### 验收标准
1. THE Backend SHALL 实现 `GET /api/admin/ai/run-logs` 端点,返回分页的调用记录列表,包含 app_type、trigger_type、member_id、tokens_used、latency_ms、status
2. THE Backend SHALL 支持以下筛选参数:`app_type``status``trigger_type``site_id``date_from``date_to`
3. THE Backend SHALL 实现 `GET /api/admin/ai/run-logs/:id` 端点,返回单条调用记录的完整详情,包含完整 request_prompt、完整 response_text、error_message
4. THE Backend SHALL 对调用记录详情不做脱敏处理,系统管理员可查看原文
#### 需求 A5缓存失效 API
**用户故事:** 作为系统管理员,我希望按 App / 会员 / 门店批量将缓存标记为失效,以便在数据异常时强制重新生成 AI 分析结果。
##### 验收标准
1. THE Backend SHALL 实现 `POST /api/admin/ai/cache/invalidate` 端点,接受请求体包含:`app_type`(可选)、`member_id`(可选)、`site_id`(必填)
2. WHEN 缓存失效请求到达时THE Backend SHALL 将匹配条件的 `ai_cache` 记录的 `status` 字段更新为 `invalidated`
3. THE Backend SHALL 返回受影响的缓存记录数量
#### 需求 A6Token 预算查询 API
**用户故事:** 作为系统管理员,我希望查看 Token 预算的使用情况,以便监控 AI 调用成本。
##### 验收标准
1. THE Backend SHALL 实现 `GET /api/admin/ai/budget` 端点,返回日预算和月预算的使用情况:已用量、预算上限、使用百分比
2. THE Backend SHALL 从 `ai_run_logs.tokens_used` 按日/月聚合计算已消耗 token 数
#### 需求 A7批量执行与成本二次确认 API
**用户故事:** 作为系统管理员,我希望批量执行 AI 调用前能看到预估成本,确认后才真正执行,以便防止误操作导致大量 API 调用和费用。
##### 验收标准
1. THE Backend SHALL 实现 `POST /api/admin/ai/batch-run` 端点,接受请求体包含:`app_types`App 列表)、`member_ids`(会员 ID 列表)、`site_id`(门店 ID
2. WHEN 批量执行请求到达时THE Backend SHALL 计算预估调用次数(会员数 × App 数)和预估 Token 消耗,返回 `{ batch_id, estimated_calls, estimated_tokens }`,不立即执行
3. THE Backend SHALL 实现 `POST /api/admin/ai/batch-run/confirm` 端点,接受 `{ batch_id }`,确认后在后台异步执行批量调用
4. IF batch_id 无效或已过期THEN THE Backend SHALL 返回 HTTP 400 错误
#### 需求 A8告警管理 API
**用户故事:** 作为系统管理员,我希望查看、确认和忽略 AI 运行告警,以便对失败事件进行分类处理。
##### 验收标准
1. THE Backend SHALL 实现 `GET /api/admin/ai/alerts` 端点,返回告警列表(来源:`ai_run_logs` WHERE status IN ('failed', 'timeout', 'circuit_open')),支持分页和状态筛选
2. THE Backend SHALL 实现 `POST /api/admin/ai/alerts/:id/ack` 端点,将指定告警标记为"已确认"
3. THE Backend SHALL 实现 `POST /api/admin/ai/alerts/:id/ignore` 端点,将指定告警标记为"已忽略"
4. THE Backend SHALL 支持告警的三种状态:`pending`(待处理)、`acknowledged`(已确认)、`ignored`(已忽略)
#### 需求 A9API 认证与权限
**用户故事:** 作为系统管理员,我希望 AI 监控后台的所有 API 端点都受 JWT 认证保护,以便只有授权管理员才能访问。
##### 验收标准
1. THE Backend SHALL 对所有 `/api/admin/ai/*` 端点使用 JWT Bearer Token 认证,复用现有 admin 权限体系
2. IF JWT Token 缺失或无效THEN THE Backend SHALL 返回 HTTP 401
3. THE Backend SHALL 确保系统管理员对所有 AI 监控数据全量可见,不做数据脱敏
---
### 模块 Badmin-web AI 监控后台 — 前端页面
#### 需求 B1AI 运行总览页面Dashboard
**用户故事:** 作为系统管理员,我希望在 admin-web 中看到 AI 运行总览 Dashboard以便一目了然地掌握 AI 模块的运行状况。
##### 验收标准
1. THE admin-web SHALL 新增 AI 运行总览页面包含以下区域顶部统计卡片今日调用次数、成功率、Token 消耗、平均延迟)、近 7 天趋势折线图(调用量 + 成功率)、各 App 调用占比饼图、Token 预算使用进度条(日/月)、告警列表
2. THE admin-web SHALL 在 Dashboard 页面展示各 App 最近一次调用状态,用于健康状态监控
3. THE admin-web SHALL 支持门店筛选(`site_id` 下拉选择)
4. THE admin-web SHALL 展示当前 App 配置信息(只读),覆盖 P3-3 Prompt 版本管理的监控展示需求
#### 需求 B2调度状态页面
**用户故事:** 作为系统管理员,我希望在 admin-web 中查看调度任务的执行状态,以便监控事件触发链的运行情况。
##### 验收标准
1. THE admin-web SHALL 新增调度状态页面包含分页表格展示事件类型、会员、状态、执行链app_chain、耗时
2. THE admin-web SHALL 提供筛选器event_type / status / site_id / 日期范围
3. THE admin-web SHALL 在页面顶部展示今日跳过的重复事件数
4. THE admin-web SHALL 在操作列提供"查看详情"和"手动重跑"按钮
5. WHEN 点击"手动重跑"时THE admin-web SHALL 弹出确认对话框,确认后调用 `POST /api/admin/ai/trigger-jobs/:id/retry`
#### 需求 B3调用明细页面
**用户故事:** 作为系统管理员,我希望在 admin-web 中查看 AI 调用的详细记录,以便排查问题和分析调用模式。
##### 验收标准
1. THE admin-web SHALL 新增调用明细页面包含分页表格展示app_type、trigger_type、member_id、tokens_used、latency_ms、status
2. THE admin-web SHALL 提供筛选器app_type / status / trigger_type / site_id / 日期范围
3. WHEN 点击表格行时THE admin-web SHALL 展开详情抽屉Drawer展示完整 prompt、完整 response、error_message
#### 需求 B4手动操作页面
**用户故事:** 作为系统管理员,我希望在 admin-web 中执行手动重跑、缓存失效、批量执行和告警管理操作,以便在需要时进行人工干预。
##### 验收标准
1. THE admin-web SHALL 新增手动操作页面,包含以下功能区域:手动重跑、缓存失效、批量执行(含成本二次确认)、告警确认/忽略
2. THE admin-web SHALL 在手动重跑区域提供 App 选择、会员输入、门店选择,触发单次执行
3. THE admin-web SHALL 在缓存失效区域提供按 App / 会员 / 门店的批量失效操作
4. THE admin-web SHALL 在批量执行区域实现成本二次确认流程:选择操作参数 → 调用 `POST /api/admin/ai/batch-run` 获取预估 → 展示确认弹窗("本次将执行 N 次 AI 调用,预估消耗 M tokens确认执行")→ 确认后调用 `POST /api/admin/ai/batch-run/confirm`
5. THE admin-web SHALL 在告警区域展示告警列表,每条告警提供"确认"和"忽略"操作按钮
---
### 模块 C测试体系重建
#### 需求 C1旧测试脚本归档
**用户故事:** 作为开发者,我希望将基于旧 openai SDK 的测试脚本归档到 `_archived/` 目录,以便清理过时代码,避免误用。
##### 验收标准
1. THE Backend SHALL 将以下 7 个脚本从 `scripts/ops/` 移至 `scripts/ops/_archived/``ai_full_chain_test.py``test_chat_e2e.py``test_chat_ai_quality.py``test_bailian_apps.py``test_bailian_single.py``test_bailian_full.py``_run_ai_tests_remaining.py`
2. THE Backend SHALL 将 `apps/backend/tests/test_ai_bailian.py` 移至 `apps/backend/tests/_archived/test_ai_bailian.py`
3. THE Backend SHALL 将 `docs/reports/2026-03-21__ai_full_chain_test.md` 移至 `docs/reports/_archived/2026-03-21__ai_full_chain_test.md`
4. THE Backend SHALL 保留归档文件内容不变,仅移动位置
5. THE Backend SHALL 不删除 `docs/audit/` 中的审计记录,仅停止引用
#### 需求 C2新全链路测试 — 15 个场景
**用户故事:** 作为开发者,我希望建立覆盖 15 个场景的全链路测试,以便验证 DashScope 迁移后所有 AI 应用的端到端功能正确性。
##### 验收标准
1. THE Backend SHALL 实现 App1 对话测试,覆盖 10 种入口general、customer_detail、coach_detail、task_detail、finance_overview、member_list、settlement_detail、note_detail、dashboard、report验证 SSE 流式输出、session_id 双轨持久化、对话复用规则
2. THE Backend SHALL 实现 App2 定时预生成测试,验证 8 个时间维度(今日、昨日、本周、上周、本月、上月、本季、上季)的缓存写入和 JSON 合法性
3. THE Backend SHALL 实现消费事件触发链测试App3→App8→App7验证事件传播、缓存写入、业务表写入
4. THE Backend SHALL 实现助教消费触发链测试App3→App8→App7→App4→App5验证完整链路和助教关联
5. THE Backend SHALL 实现备注事件触发链测试App6→App8验证备注分析和线索整合
6. THE Backend SHALL 实现任务分配触发链测试App4→App5验证关系分析和话术生成
7. THE Backend SHALL 实现缓存命中测试App2~8验证缓存有效期内直接返回、过期后重新生成
8. THE Backend SHALL 实现缓存失效测试App2~8验证 admin-web 手动失效后重新生成
9. THE Backend SHALL 实现熔断触发测试,验证连续 5 次失败→熔断→半开→恢复的完整流程
10. THE Backend SHALL 实现 Token 预算超限测试,验证超限后正确降级
11. THE Backend SHALL 实现失败记录测试,验证 `ai_run_logs` 记录完整且 error_message 有值
12. THE Backend SHALL 实现后台可见性测试,验证 admin-web API 能返回所有运行记录和详情
13. THE Backend SHALL 实现 JSON 兜底测试App2~8验证非法 JSON 重试 3 次
14. THE Backend SHALL 实现幂等验证测试App8验证同一 member 同一天重复触发只执行一次
15. THE Backend SHALL 实现内容质量测试App2~8验证返回内容包含必要字段、格式正确
16. THE Backend SHALL 支持 Mock 模式和真实 API 模式双轨运行Mock 模式用于 CI 环境,真实 API 模式用于集成验证
#### 需求 C3属性测试更新 — 7 个属性测试
**用户故事:** 作为开发者,我希望更新 Hypothesis 属性测试,以便通过随机输入验证 AI 模块的关键不变量。
##### 验收标准
1. THE Backend SHALL 实现熔断器状态机属性测试验证状态转换合法性closed→open→half_open→closed/open任意操作序列不产生非法状态
2. THE Backend SHALL 实现 Token 预算计算属性测试,验证日/月聚合值等于各条记录 tokens_used 之和(聚合不变量)
3. THE Backend SHALL 实现去重逻辑属性测试,验证相同 (event_type, member_id, site_id, date) 只产生一条非 skipped 记录
4. THE Backend SHALL 实现缓存过期属性测试,验证 expires_at 过期的缓存 status 必须为 expired
5. THE Backend SHALL 实现 App8 幂等属性测试,验证同一 member 同一天的 member_retention_clue 只有一组记录
6. THE Backend SHALL 实现 session_id 重建属性测试,验证重建后的 messages 数组与本地 ai_messages 一致round-trip 属性)
7. THE Backend SHALL 实现限流计数属性测试,验证窗口内请求数不超过上限
---
### 模块 D历史数据回填
#### 需求 D1回填脚本
**用户故事:** 作为系统管理员,我希望通过回填脚本为半年内活跃会员生成 AI 分析数据,以便新上线的 AI 功能对历史会员也有完整的分析结果。
##### 验收标准
1. THE Backend SHALL 实现回填脚本 `scripts/ops/ai_backfill.py`查询半年内2025-09-21 ~ 2026-03-21三者并集的活跃会员有消费记录、有备注记录、有任务变更
2. THE Backfill_Script SHALL 写死门店范围 `site_id = 2790685415443269`
3. THE Backfill_Script SHALL 分批执行:每批 10 个会员,批间间隔 5 秒
4. THE Backfill_Script SHALL 实现断点续跑:将已完成的 member_id 列表记录到本地文件,失败后从断点继续
5. THE Backfill_Script SHALL 对每个会员执行以下调用链App3维客线索→ App8线索整理→ App7客户分析如有助教关联→ App4关系分析→ App5话术参考如有备注→ App6备注分析→ App8再次整合
6. THE Backfill_Script SHALL 对 App8 写入 `member_retention_clue` 业务表时使用 DELETE + INSERT 事务包裹
7. THE Backfill_Script SHALL 不备份现有数据
#### 需求 D2回填成本确认
**用户故事:** 作为系统管理员,我希望在执行回填前通过 admin-web 二次确认预估成本,以便防止意外的大量 API 调用。
##### 验收标准
1. THE Backfill_Script SHALL 在执行前输出预估信息:会员数量、预估调用次数(会员数 × 平均 5 个 App、预估 Token 消耗(每次约 2000 tokens
2. THE Backfill_Script SHALL 支持通过 admin-web 的批量执行 + 成本二次确认流程触发(复用需求 A7 的 API
3. THE Backfill_Script SHALL 在回填过程中验证 App5 输出包含分类字段(覆盖 P2-1 问题修复)
---
### 模块 E数据保留与清理
#### 需求 E1数据保留策略
**用户故事:** 作为系统管理员,我希望 AI 相关数据按策略自动清理,以便控制数据库存储增长。
##### 验收标准
1. THE Backend SHALL 永久保留 App1 对话记录(`ai_conversations` + `ai_messages`),不自动删除
2. THE Backend SHALL 对 App2~8 缓存(`ai_cache`)每个 App 保留最新 20,000 条,超出部分按 `created_at` 排序删除最旧记录
3. THE Backend SHALL 对 `ai_run_logs` 保留 90 天,删除 90 天前的记录
4. THE Backend SHALL 对 `ai_trigger_jobs` 保留 90 天,删除 90 天前的记录
#### 需求 E2清理定时任务
**用户故事:** 作为系统管理员,我希望数据清理任务每日自动执行,以便无需人工干预即可维持数据保留策略。
##### 验收标准
1. THE Backend SHALL 实现数据清理定时任务,每日凌晨 03:00 执行
2. THE Backend SHALL 在清理任务中依次执行:删除 90 天前的 `ai_run_logs`、删除 90 天前的 `ai_trigger_jobs`、对每个 App 类型清理超出 20,000 条上限的 `ai_cache` 记录
3. THE Backend SHALL 记录每次清理任务的执行结果(删除记录数)到日志
---
### 模块 F数据库查询优化与收尾
#### 需求 F1Dashboard 聚合查询优化
**用户故事:** 作为后端开发者,我希望 Dashboard 的聚合查询性能良好,以便页面加载不卡顿。
##### 验收标准
1. THE Backend SHALL 为 `ai_run_logs` 的 Dashboard 聚合查询评估并添加 BRIN 索引(基于 `created_at` 列),提升按时间范围聚合的查询性能
2. THE Backend SHALL 确保 Dashboard API 的响应时间在合理范围内(分页 + 索引 + 90 天保留策略共同保障)
#### 需求 F2文档同步
**用户故事:** 作为开发者,我希望所有相关文档在 P15 完成后保持同步更新,以便文档与代码一致。
##### 验收标准
1. THE Backend SHALL 更新 `apps/admin-web/README.md`,新增 AI 监控页面说明
2. THE Backend SHALL 更新 `apps/backend/README.md`,新增 admin AI API 说明
3. THE Backend SHALL 更新 `docs/DOCUMENTATION-MAP.md`,新增 P15 相关条目
4. THE Backend SHALL 更新 `docs/database/BD_Manual_ai_tables.md`,补充 admin API 相关的查询模式说明
5. THE Backend SHALL 确认 `docs/prd/ai-app-prompts.md` 中环境变量已全部更新P14 遗留确认)