# 图标生成优化 - 测试与部署指南 本文档说明如何手动完成剩余的测试和部署任务。 ## 第三阶段:测试与验证(手动部分) ### 任务 3.5:在测试环境批量生成新图标 **目的**:验证新提示词在测试环境能够正常生成图标 **步骤**: 1. 确保测试环境已部署最新代码(包含新的 IconPromptSettings 和 ClassificationIconPromptProvider) 2. 在测试环境的 `appsettings.json` 中配置: ```json { "IconPromptSettings": { "EnableNewPrompt": true, "GrayScaleRatio": 1.0, "StyleStrength": 0.7, "ColorScheme": "single-color" } } ``` 3. 查询数据库中已有的分类列表: ```sql SELECT Name, Type FROM TransactionCategories WHERE Icon IS NOT NULL AND Icon != ''; ``` 4. 手动触发图标生成任务(或等待定时任务自动执行) 5. 观察日志,确认: - 成功为每个分类生成了 5 个 SVG 图标 - 使用了新版提示词(日志中应显示"新版") **预期结果**: - 所有分类成功生成 5 个 SVG 图标 - 图标内容为 JSON 数组格式 - 日志显示"使用新版提示词" ### 任务 3.6:对比新旧图标的可识别性 **目的**:评估新图标相比旧图标的可识别性提升 **步骤**: 1. 从数据库中提取一些分类的旧图标数据: ```sql SELECT Name, Icon FROM TransactionCategories LIMIT 10; ``` 2. 手动为相同分类生成新图标(或使用 3.5 的结果) 3. 将图标数据解码为实际的 SVG 代码 4. 在浏览器中打开 SVG 文件进行视觉对比 **评估维度**: | 维度 | 旧图标 | 新图标 | 说明 | |------|---------|---------|------| | 复杂度 | 高(渐变、多色、细节多) | 低(单色、扁平、细节少) | - | | 可识别性 | 较低(细节过多导致混淆) | 较高(几何简约,直观易懂) | - | | 颜色干扰 | 多色和渐变导致视觉混乱 | 单色避免颜色干扰 | - | | 一致性 | 5 个图标风格差异大,不易识别 | 5 个图标风格统一,易于识别 | - | **记录方法**: 创建对比表格: | 分类名称 | 旧图标可识别性 | 新图标可识别性 | 提升程度 | |---------|----------------|----------------|----------| | 餐饮 | 3/5 | 5/5 | +2 | | 交通 | 2/5 | 4/5 | +2 | | 购物 | 3/5 | 5/5 | +2 | ### 任务 3.7-3.8:编写集成测试 由于这些任务需要实际调用 AI 服务生成图标并验证结果,建议采用以下方法: **方法 A:单元测试模拟** 在测试中使用 Mock 的 AI 服务,返回预设的图标数据,然后验证: - 相同分类名称和类型 → 返回相同的图标结构 - 不同分类名称或类型 → 返回不同的图标结构 **方法 B:真实环境测试** 在有真实 AI API key 的测试环境中执行: ```csharp [Fact] public async Task GetPrompt_相同分类_应生成结构一致的图标() { // Arrange var categoryName = "餐饮"; var categoryType = TransactionType.Expense; // Act var icon1 = await _aiService.GenerateCategoryIconsAsync(categoryName, categoryType); var icon2 = await _aiService.GenerateCategoryIconsAsync(categoryName, categoryType); // Assert icon1.Should().NotBeNull(); icon2.Should().NotBeNull(); // 验证图标结构相似性(具体实现需根据实际图标格式) } ``` **注意事项**: - 真实环境测试会增加测试时间和成本 - 建议 CI/CD 环境中使用 Mock,本地开发环境使用真实 API - 添加测试标记区分需要真实 API 的测试 ### 任务 3.9:A/B 测试 **目的**:收集真实用户对新图标的反馈 **步骤**: 1. 确保灰度发布开关已开启(EnableNewPrompt = true) 2. 设置灰度比例为 10%(GrayScaleRatio = 0.1) 3. 部署到生产环境 4. 观察 1-2 天,收集: - 图标生成成功率(生成成功的数量 / 总生成请求数) - 用户反馈(通过客服、问卷、应用内反馈等) - 用户对图标的满意度评分 **反馈收集方法**: - 应用内反馈按钮:在分类设置页面添加"反馈图标质量"按钮 - 用户问卷:通过邮件或应用内问卷收集用户对新图标的评价 - 数据分析:统计用户选择新图标的频率 **评估指标**: | 指标 | 目标值 | 说明 | |------|---------|------| | 图标生成成功率 | > 95% | 确保新提示词能稳定生成图标 | | 用户满意度 | > 4.0/5.0 | 用户对新图标的整体满意度 | | 旧图标选择比例 | < 30% | 理想情况下用户更倾向选择新图标 | ### 任务 3.10:根据测试结果微调 **调整方向**: 1. **如果可识别性仍不够**: - 增加 `StyleStrength` 值(如从 0.7 提升到 0.85) - 在提示词中添加更多"去除细节"的指令 2. **如果图标过于简单**: - 降低 `StyleStrength` 值(如从 0.7 降低到 0.6) - 在提示词中放宽"保留必要细节"的约束 3. **如果某些特定分类识别困难**: - 更新 `category-visual-mapping.md` 文档,为该分类添加更精确的视觉元素描述 - 在提示词模板中为该分类添加特殊说明 4. **如果生成失败率高**: - 检查 AI API 响应,分析失败原因 - 可能需要调整提示词长度或结构 - 考虑增加 timeout 参数 ## 第四阶段:灰度发布 ### 任务 4.1:测试环境验证 已在任务 3.5 中完成。 ### 任务 4.2-4.3:配置灰度发布 配置已在 `appsettings.json` 中添加: - `EnableNewPrompt`: 灰度发布总开关 - `GrayScaleRatio`: 灰度比例(0.0-1.0) **配置建议**: - 初始阶段:0.1(10% 用户) - 稳定阶段:0.5(50% 用户) - 全量发布前:0.8(80% 用户) - 正式全量:1.0(100% 用户)或 `EnableNewPrompt: true` 且移除灰度逻辑 ### 任务 4.4:灰度逻辑实现 已在 `ClassificationIconPromptProvider.ShouldUseNewPrompt()` 方法中实现: ```csharp private bool ShouldUseNewPrompt() { if (!_config.EnableNewPrompt) { return false; } var randomValue = _random.NextDouble(); return randomValue < _config.GrayScaleRatio; } ``` **验证方法**: - 在日志中查看是否同时出现"新版"和"旧版"提示词 - 检查新版和旧版的比例是否接近配置的灰度比例 ### 任务 4.5:部署灰度版本 **部署步骤**: 1. 准备部署包(包含更新后的代码和配置) 2. 在 `appsettings.json` 中设置: ```json { "IconPromptSettings": { "EnableNewPrompt": true, "GrayScaleRatio": 0.1, "StyleStrength": 0.7, "ColorScheme": "single-color" } } ``` 3. 部署到生产环境 4. 验证部署成功(检查应用日志、健康检查端点) ### 任务 4.6:监控图标生成成功率 **监控方法**: 1. 在 `SmartHandleService.GenerateCategoryIconsAsync()` 方法中添加指标记录: - 生成成功计数 - 生成失败计数 - 生成耗时 - 使用的提示词版本(新版/旧版) 2. 导入到监控系统(如 Application Insights, Prometheus) 3. 设置告警规则: - 成功率 < 90% 时发送告警 - 平均耗时 > 30s 时发送告警 **SQL 查询生成失败分类**: ```sql SELECT Name, Type, COUNT(*) as FailCount FROM IconGenerationLogs WHERE Status = 'Failed' GROUP BY Name, Type ORDER BY FailCount DESC LIMIT 10; ``` ### 任务 4.7:监控用户反馈 **监控渠道**: 1. 应用内反馈(如果已实现) 2. 客服系统反馈记录 3. 用户问卷调查结果 **反馈分析维度**: - 新旧图标满意度对比 - 具体分类的反馈差异 - 意见类型(正面/负面/中性) ### 任务 4.8:逐步扩大灰度比例 **时间规划**: | 阶段 | 灰度比例 | 持续时间 | 验证通过条件 | |------|----------|----------|------------| | 阶段 1 | 10% | 3-5 天 | 成功率 > 95%,用户满意度 > 4.0 | | 阶段 2 | 50% | 3-5 天 | 成功率 > 95%,用户满意度 > 4.0 | | 阶段 3 | 80% | 3-5 天 | 成功率 > 95%,用户满意度 > 4.0 | | 全量 | 100% | - | 长期运行 | **扩容操作**: 只需修改 `appsettings.json` 中的 `GrayScaleRatio` 值并重新部署。 ### 任务 4.9:回滚策略 **触发回滚的条件**: - 成功率 < 90% 且持续 2 天以上 - 用户满意度 < 3.5 且负面反馈占比 > 30% - 出现重大 bug 导致用户无法正常使用 **回滚步骤**: 1. 修改 `appsettings.json`: ```json { "IconPromptSettings": { "EnableNewPrompt": false } } ``` 2. 部署配置更新(无需重新部署代码) 3. 验证所有用户都使用旧版提示词(日志中应只显示"旧版") **回滚后**: - 分析失败原因 - 修复问题 - 从小灰度比例(5%)重新开始测试 ### 任务 4.10:记录提示词迭代 **记录格式**: 在 `.doc/prompt-iteration-history.md` 中维护迭代历史: | 版本 | 日期 | 变更内容 | 灰度比例 | 用户反馈 | 结果 | |------|------|----------|----------|----------|------| | 1.0.0 | 2026-02-14 | 初始版本,简约风格提示词 | 10% | - | - | | 1.1.0 | 2026-02-XX | 调整风格强度为 0.8,增加去除细节指令 | 50% | 满意度提升至 4.2 | 扩容至全量 | ## 第五阶段:文档与清理 ### 任务 5.1-5.4:文档更新 已创建/需要更新的文档: 1. ✅ `.doc/category-visual-mapping.md` - 分类名称到视觉元素的映射规则 2. ✅ `.doc/icon-prompt-testing-guide.md` - 本文档 3. ⏳ API 文档 - 需更新说明 IconPromptSettings 的参数含义 4. ⏳ 运维文档 - 需说明如何调整提示词模板和风格参数 5. ⏳ 故障排查文档 - 需添加图标生成问题的排查步骤 6. ⏳ 部署文档 - 需说明灰度发布的操作流程 ### 任务 5.5:清理测试代码 **清理清单**: - 移除所有 `Console.WriteLine` 调试语句 - 移除临时的 `TODO` 注释 - 移除仅用于测试的代码分支 ### 任务 5.6:代码 Review **Review 检查点**: - ✅ 所有类和方法都有 XML 文档注释 - ✅ 遵循项目代码风格(命名、格式) - ✅ 无使用 `var` 且类型可明确推断的地方 - ✅ 无硬编码的魔法值(已在配置中) - ✅ 异常处理完善 - ✅ 日志记录适当 ### 任务 5.7-5.8:测试运行 **后端测试**: ```bash cd WebApi.Test dotnet test --filter "FullyQualifiedName~ClassificationIconPromptProviderTest" ``` **前端测试**: ```bash cd Web pnpm lint pnpm build ``` ## 总结 自动化部分(已完成): - ✅ 第一阶段:提示词模板化(1.1-1.10) - ✅ 第二阶段:提示词优化(2.1-2.10) - ✅ 第三阶段单元测试(3.1-3.4) 手动/灰度发布部分(需人工操作): - ⏳ 第三阶段手动测试(3.5-3.10) - ⏳ 第四阶段:灰度发布(4.1-4.10) - ⏳ 第五阶段:文档与清理(5.1-5.8) **下一步操作**: 1. 部署到测试环境并执行任务 3.5-3.8 2. 根据测试结果调整配置(任务 3.10) 3. 部署到生产环境并开始灰度发布(任务 4.5-4.10) 4. 完成文档更新和代码清理(任务 5.1-5.8)