Files
EmailBill/.doc/icon-prompt-testing-guide.md
SunCheng a88556c784 fix
2026-02-15 10:10:28 +08:00

349 lines
11 KiB
Markdown
Raw 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.
# 图标生成优化 - 测试与部署指南
本文档说明如何手动完成剩余的测试和部署任务。
## 第三阶段:测试与验证(手动部分)
### 任务 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