Files
llm-intelligence/IMPLEMENTATION_PLAN.md
2026-05-13 14:42:45 +08:00

186 lines
9.9 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.
# LLM Intelligence Hub — 生产级实施计划(修正版 v1.1
> 文档版本: v1.1
> 日期: 2026-05-10
> 负责人: 宰相
> 状态: Phase 1 执行中
> **修正说明**: 根据评审报告补充国内厂商覆盖、数据质量规则、非功能需求验证、容错降级设计、审计日志
---
## 一、项目状态快照
### 已完成 ✅
| 组件 | 说明 |
|------|------|
| PRD.md v0.3 | 产品需求文档 |
| TECHNICAL_DESIGN.md v1.1 | 技术设计文档 |
| FEATURE_LIST.md v1.1 | 功能清单 |
| BUSINESS_MODEL.md | 商业模型 |
| fetch_openrouter.go | OpenRouter采集器 |
| generate_daily_report.go | 日报生成器 |
| db/migrations/001_phase1_core_tables.sql | 3张核心表 |
| frontend/src/pages/Explorer.tsx | Explorer页面脚手架 |
| verification_executor.go | 验证执行器 |
### 进行中/待完善 🟡
| 组件 | 说明 |
|------|------|
| 数据库Schema升级 | 3张表 → 8张完整表 + audit_log |
| 数据质量规则 | CHECK约束 + stale标记 |
| 国内厂商数据 | 7家种子数据DeepSeek/阿里/Moonshot/智谱/字节/百度/腾讯) |
| Explorer页面 | 分页/排序/stale显示 |
| 日报推送 | cron配置+降级策略 |
| 前端构建配置 | package.json/vite.config.ts |
| 生产部署 | Dockerfile/docker-compose |
| 审计日志 | audit_log表 + 写入集成 |
---
## 二、修正说明(对照评审报告)
| 评审发现 | 修正措施 | 所在Sprint |
|----------|----------|-----------|
| 国内厂商覆盖缺失 | Sprint 2 新增7家种子数据录入 | Sprint 2 |
| 数据质量规则缺4/6 | Sprint 1 新增CHECK约束+stale标记+质量摘要 | Sprint 1 |
| 非功能需求缺5/6 | Sprint 2~6 新增采集成功率监控+连续失败告警+性能门禁 | Sprint 2~6 |
| 容错降级缺5项 | Sprint 3~5 新增日报降级+Explorer stale显示+维护模式 | Sprint 3~5 |
| 审计日志缺失 | Sprint 1 新增audit_log表Sprint 2 集成写入 | Sprint 1~2 |
| 3个TBD验证 | 全部改为自动化验证命令 | 全量修正 |
| 前端基础假设 | T-Q2-2.34拆分为34a+34b | Sprint 4 |
---
## 三、详细任务清单74个Task
> 强制规则每个Task必须有可自动验证的 command禁止 TBD/semantic 兜底
### Sprint 1: 数据层补全Week 1-2
**目标**: 3张表 → 8张完整表 + audit_log + 质量约束
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| T-Q2-2.9 | model_provider 表创建 | `psql -c "\dt" \| grep model_provider` |
| T-Q2-2.10 | operator 表创建 | `psql -c "\dt" \| grep operator` |
| T-Q2-2.11 | region_pricing 表创建 | `psql -c "\dt" \| grep region_pricing` |
| T-Q2-2.12 | pricing_history 表创建 | `psql -c "\dt" \| grep pricing_history` |
| T-Q2-2.13 | free_tier 表创建 | `psql -c "\dt" \| grep free_tier` |
| T-Q2-2.14 | daily_report 表创建 | `psql -c "\dt" \| grep daily_report` |
| T-Q2-2.15 | user_subscription 表创建 | `psql -c "\dt" \| grep user_subscription` |
| **T-Q2-2.15a** | **audit_log 表创建** | `psql -c "\dt" \| grep audit_log` |
| T-Q2-2.16 | model_prices → region_pricing 迁移 | `SELECT COUNT(*) FROM region_pricing` |
| T-Q2-2.16a | models 表字段扩充 | `psql -c "\d models"` |
| **T-Q2-2.16b** | **CHECK 约束price≥0, context≤10M, currency枚举** | `psql -c "\d region_pricing" \| grep Check` |
| T-Q2-2.17 | Provider 种子数据 | `SELECT COUNT(*) FROM model_provider` >= 6 |
| **T-Q2-2.16c** | **血缘字段强制写入验证** | `SELECT COUNT(*) FROM models WHERE batch_id IS NULL` = 0 |
| **T-Q2-2.16d** | **stale 标记定时任务** | 插入48h前数据运行SQL后验证 |
| T-Q2-2.18 | 审计触发器 | 更新记录验证 updated_at 自动变化 |
### Sprint 2: 采集器强化 + 国内厂商Week 3-4
**目标**: 采集器重构 + 国内7家厂商种子数据 + 审计日志集成
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| T-Q2-2.19 | ProviderMapper 模块提取 | `go test ./internal/collectors/` |
| T-Q2-2.20 | ProviderNameMap 完整映射 | 单元测试覆盖所有映射 |
| T-Q2-2.21 | Collector 接口抽象 | `go test ./internal/collectors/` |
| T-Q2-2.22 | 指数退避重试包 | `go test ./internal/retry/ -v` |
| T-Q2-2.23 | 采集器集成重试 | 模拟API失败验证重试 |
| T-Q2-2.24 | 批量插入优化 | 采集371条 < 30秒 |
| T-Q2-2.25 | 价格变动检测(>5% | 修改价格验证 history 表记录 |
| T-Q2-2.25a | 事务边界优化(每批次事务) | 中断采集验证已提交数据保留 |
| T-Q2-2.26 | 结构化日志slog JSON | 日志含 collector/duration/records |
| **T-Q2-2.26a** | **采集成功率监控** | `SELECT success_rate_7d FROM collector_stats` >= 95 |
| **T-Q2-2.27a** | **国内厂商录入DeepSeek** | DeepSeek模型数 >= 3 |
| **T-Q2-2.27b** | **国内厂商录入:阿里/Moonshot/智谱** | 每家至少2个模型 |
| **T-Q2-2.27c** | **国内厂商录入:字节/百度/腾讯** | 每家至少1个模型 |
| **T-Q2-2.27d** | **国内厂商CNY定价录入** | `SELECT COUNT(*) FROM region_pricing WHERE currency='CNY'` >= 10 |
| **T-Q2-2.27e** | **采集器写入 audit_log** | `SELECT COUNT(*) FROM audit_log WHERE table_name='models'` >= 371 |
### Sprint 3: 日报与报告Week 5-6
**目标**: 日报增强 + 降级策略 + 飞书推送
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| T-Q2-2.28 | 日报从DB读取非JSON | 删除 models.json 后日报仍能生成 |
| T-Q2-2.29 | 新模型检测逻辑 | 插入测试模型验证报告含"新模型" |
| T-Q2-2.30 | 价格变动高亮(>5% | 修改价格>5%验证报告高亮 |
| T-Q2-2.31 | 场景推荐算法 | 推荐含 TOP 3 模型及理由 |
| **T-Q2-2.31a** | **数据质量摘要段落** | `grep "数据质量" reports/daily/*.md` |
| T-Q2-2.32 | HTML报告模板 | 浏览器正常打开 |
| T-Q2-2.33 | Markdown报告优化 | 飞书/钉钉渲染正常 |
| **T-Q2-2.33a** | **run_daily.sh 完整脚本** | 手动执行 exit code = 0 |
| T-Q2-2.34 | cron配置每日08:00 | `crontab -l \| grep llm-intelligence` |
| **T-Q2-2.35** | **日报失败降级(复制昨日+"[数据延迟]"** | 模拟失败验证复制和标题 |
| **T-Q2-2.36** | **日报飞书告警(失败时)** | 测试webhook模拟失败验证消息到达 |
| T-Q2-2.37 | 日报写入 daily_report 表 | `SELECT * FROM daily_report WHERE report_date = TODAY` |
| T-Q2-2.38 | 报告文件归档 | `ls reports/daily/2026/05/` |
### Sprint 4: 前端完善Week 7-8
**目标**: Explorer完善 + 可视化 + 降级显示
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| **T-Q2-2.39a** | **package.json 创建** | `cd frontend && npm install` |
| **T-Q2-2.39b** | **vite.config.ts + tsconfig.json** | `cd frontend && npm run build` |
| T-Q2-2.40 | index.html 入口页 | `npm run dev` 可访问 |
| T-Q2-2.41 | App.tsx 路由配置 | 路由切换正常 |
| T-Q2-2.42 | 数据服务层封装 | API返回正确结构 |
| T-Q2-2.43 | 分页功能 | 100+条分页正常 |
| T-Q2-2.44 | 排序功能 | Jest单元测试通过 |
| T-Q2-2.45 | 免费标记样式 | 所有免费模型标记正确 |
| T-Q2-2.46 | 厂商筛选动态加载 | 新增厂商自动出现 |
| T-Q2-2.47 | 模态筛选修正 | vision/text/code分类正确 |
| **T-Q2-2.48** | **stale 状态显示(红标)** | 插入stale数据验证显示 |
| **T-Q2-2.49** | **pricing unavailable 显示** | 单元测试null/undefined显示 |
| T-Q2-2.50 | ECharts 集成 | 渲染柱状图 |
| T-Q2-2.51 | 价格趋势占位图替换 | 显示趋势曲线 |
| T-Q2-2.52 | Dashboard 首页 | 显示今日报告摘要 |
### Sprint 5: 生产部署Week 9-10
**目标**: 容器化 + CI/CD + 运维脚本
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| T-Q2-2.53 | Dockerfile多阶段构建 | `docker build -t llm-hub .` |
| T-Q2-2.54 | docker-compose.yml | `docker-compose up -d` |
| T-Q2-2.55 | .env.example | 文件存在且密钥为空 |
| T-Q2-2.56 | Nginx配置 | `curl http://localhost/health` = 200 |
| **T-Q2-2.56a** | **Nginx 维护模式** | curl 返回503 + maintenance.html |
| T-Q2-2.57 | GitHub Actions CI | Push自动触发CI |
| T-Q2-2.58 | 测试覆盖率检查≥80% | 不达标CI失败 |
| T-Q2-2.59 | 构建产物上传 | Artifacts含产物 |
| T-Q2-2.60 | 数据库备份脚本 | 手动执行验证OSS上传 |
| T-Q2-2.61 | 数据库恢复脚本 | 恢复后数据完整 |
| **T-Q2-2.62** | **健康检查脚本** | `./healthcheck.sh` 输出正常 |
| **T-Q2-2.63** | **日志轮转配置30天** | `ls /var/log/llm-hub/` |
| **T-Q2-2.64** | **连续3天失败告警** | 插入3条失败记录验证告警 |
### Sprint 6: 验收与优化Week 11-12
**目标**: 全面验收 + 性能优化 + 文档完善
| Task ID | 任务 | 验证方式 |
|---------|------|----------|
| **T-Q2-2.65** | **采集覆盖率OpenRouter 371+ + 国内7家** | models数 >= 371 + 国内厂商 >= 10 |
| **T-Q2-2.66** | **数据质量:自动抽样核对脚本** | exit code = 0差异 < 1% |
| **T-Q2-2.67** | **采集性能 < 30秒** | `time ./fetch_openrouter` < 30s |
| T-Q2-2.68 | 日报生成验收连续7天 | 含新模型/价格变动/场景推荐/质量摘要 |
| T-Q2-2.69 | Explorer页面验收 | 所有交互无报错 |
| **T-Q2-2.70** | **API响应 < 500ms** | `curl -w "%{time_total}"` < 0.5 |
| **T-Q2-2.71** | **前端首屏 < 2s** | Lighthouse >= 80 |
| **T-Q2-2.72** | **7日采集成功率 >= 95%** | `SELECT AVG(success_rate_7d)` >= 95 |
| T-Q2-2.73 | 密钥管理检查 | `grep -r "sk-" --include="*.go" .` 无结果 |
| T-Q2-2.74 | SQL注入检查 | 所有SQL参数化查询 |
---
## 四、质量保障措施
| 措施 | 实施方式 |
|------|----------|
| 每个Task必须有可自动验证的command | 禁止 TBD/semantic全部 test_pass/artifact_present |
| 关键路径双重验证 | 数据采集类:单元测试 + 集成测试 + DB验证 |
| Sprint结束门禁 | 最后1个任务必须是"全链路回归测试" |
| Weekly数据质量报告 | Sprint 2起每周自动生成质量摘要 |
| 生产放行标准 | 采集成功率>95%、报告<30秒、20+厂商、500+模型、审计日志完整 |