Files
EmailBill/.doc/icon-prompt-testing-guide.md

349 lines
11 KiB
Markdown
Raw Normal View History

2026-02-15 10:10:28 +08:00
# 图标生成优化 - 测试与部署指南
本文档说明如何手动完成剩余的测试和部署任务。
## 第三阶段:测试与验证(手动部分)
### 任务 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.9A/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.110% 用户)
- 稳定阶段0.550% 用户)
- 全量发布前0.880% 用户)
- 正式全量1.0100% 用户)或 `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