From 1c964c3e70457d28ec88a5316918634d8ab9f566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Fri, 17 Apr 2026 18:13:45 +0800 Subject: [PATCH] docs: add scene generator quality improvement design spec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Qoder][https://qoder.com] --- ...ne-generator-quality-improvement-design.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 docs/superpowers/specs/2026-04-17-scene-generator-quality-improvement-design.md diff --git a/docs/superpowers/specs/2026-04-17-scene-generator-quality-improvement-design.md b/docs/superpowers/specs/2026-04-17-scene-generator-quality-improvement-design.md new file mode 100644 index 0000000..83c4903 --- /dev/null +++ b/docs/superpowers/specs/2026-04-17-scene-generator-quality-improvement-design.md @@ -0,0 +1,192 @@ +# sgClaw 场景生成器质量提升设计 + +## 问题陈述 + +sgClaw 场景生成器能将 `D:\desk\智能体资料\场景\` 下的原始 HTML 场景转化为 skill 包,但自动生成质量仅为 Claude 手写的 tq-lineloss-report 的 ~40%。 + +### 四个核心问题 + +| # | 问题 | 根因 | +|---|------|------| +| 1 | Content-Type 硬编码为 `application/json` | `browser_script_with_business_logic()` 模板硬编码,`ApiEndpointJson` 无 content_type 字段 | +| 2 | 请求体缺少业务必需字段 | 仅做 `{...STATIC_PARAMS, ...args}` 简单合并,无 requestTemplate 机制 | +| 3 | 响应数据未正确提取 | 无 responsePath 提取步骤,`normalizeRows` 直接接收原始响应 | +| 4 | 缺乏多模式路由能力 | 旧路径硬编码 `API_ENDPOINTS[0]`,无模式检测 | + +### 根本架构缺陷 + +生成器有两条路径: +- `browser_script_with_modes()` — 新路径,支持所有高级特性 +- `browser_script_with_business_logic()` — 旧路径,仅支持基础功能 + +LLM 判断为单模式的场景走旧路径,所有高级特性丢失。 + +### 原始场景分类 + +13 个场景按 API 调用模式分为三类: + +- **模式 A:BrowserAction 跨页面注入**(5 场景)— 线损类、服务风险类、约时工单类 +- **模式 B:$http.sendByAxios 营销网关**(2 场景)— 营销2.0零度户、光伏 +- **模式 C:直接 AJAX**(6 场景)— 95598 类、监测类、大电量类 + +按复杂度分三个梯队: + +| 梯队 | 场景数 | 当前质量 | 目标质量 | 特征 | +|------|--------|---------|---------|------| +| 第一梯队 | 5 | ~60% | ~90% | 单模式、直接 AJAX、无 BrowserAction | +| 第二梯队 | 5 | ~40% | ~70% | 涉及 BrowserAction 或 form-urlencoded | +| 第三梯队 | 3 | ~20% | ~40% | 链式多步 API 调用,仍需人工介入 | + +## 解决方案 + +### 核心策略 + +统一生成路径 + 增强 LLM 提取深度 + 修复已知问题 + +### 架构变更 + +``` +修改前: + browser_script() + ├─ modes 非空 → browser_script_with_modes() [新路径] + ├─ api_endpoints 非空 → browser_script_with_business_logic() [旧路径,质量差] + └─ 其他 → browser_script_skeleton() [骨架路径] + +修改后: + browser_script() + ├─ modes 非空 → browser_script_with_modes() [统一路径] + ├─ 单模式场景 → 自动包装为 modes=[default_mode] → browser_script_with_modes() + └─ 无端点 → browser_script_skeleton() [骨架路径] +``` + +## 实施阶段 + +### 阶段一:修基础(统一路径,修模板) + +#### Task 1:统一生成路径 + +**目标**:废弃 `browser_script_with_business_logic()`,所有场景统一走 `browser_script_with_modes()` + +**改动**: +- 修改 `browser_script()` 路由逻辑:单模式场景自动包装为一个 mode +- `browser_script_with_business_logic()` 标记为 `#[deprecated]` +- `browser_script_skeleton()` 仅用于无端点、无列定义的场景 + +**文件**:`src/generated_scene/generator.rs` + +#### Task 2:修复 jQuery processData 参数 + +**目标**:form-urlencoded 请求在 jQuery ajax 中正确序列化 + +**改动**: +- `buildModeRequest` 函数中根据 `contentType` 区分处理: + - `application/x-www-form-urlencoded`:body 传对象,jQuery 调用加 `processData: false` + - `application/json`:body 传 `JSON.stringify()`,不加 processData +- 在模板中为 jQuery ajax 调用增加 `processData` 条件判断 + +**文件**:`src/generated_scene/generator.rs`(`browser_script_with_modes` 模板) + +#### Task 3:单模式场景自动包装为 mode 配置 + +**目标**:LLM 输出无 modes 但有 apiEndpoints 时,自动包装为单 mode + +**改动**: +- `analyzeSceneDeep()` 中增加自动包装逻辑 +- 当 `modes` 为空且 `apiEndpoints` 非空时,生成默认 mode: + ```js + { + name: "default", + condition: { field: "period_mode", operator: "equals", value: "default" }, + apiEndpoint: apiEndpoints[0], // 使用第一个端点 + columnDefs: columnDefs, + requestTemplate: staticParams, + responsePath: "", + normalizeRules: { type: "validate_all_columns", filterNull: true } + } + ``` +- 设置 `defaultMode: "default"`, `modeSwitchField: "period_mode"` + +**文件**:`frontend/scene-generator/llm-client.js` + +### 阶段二:增强提取(让 LLM 提取更准) + +#### Task 4:增强 LLM prompt 的强制约束 + +**目标**:让 LLM 必须输出 Content-Type、responsePath、requestTemplate 等关键字段 + +**改动**: +- `DEEP_SYSTEM_PROMPT` 中增加强制字段约束说明 +- 增加"如果找不到就填默认值"的指导,避免 LLM 跳过这些字段 +- 增加 contentType 判断示例(`$.ajax` 中找 `contentType` 属性,`$http.sendByAxios` 中看封装) + +**文件**:`frontend/scene-generator/llm-client.js` + +#### Task 5:增加业务 JS 文件提取 + +**目标**:LLM 不仅读 index.html,还要读 js/ 目录下的业务逻辑文件 + +**改动**: +- `frontend/scene-generator/server.js` 的切片逻辑:识别并提取 `js/mca.js`, `js/ami.js`, `js/sgApi.js`, `js/power.js` 等业务文件 +- `buildDeepAnalyzePrompt` 中增加业务 JS 文件的片段推送 +- 限制总 token 数不超过 `MAX_DEEP_PROMPT_CHARS`(60000) + +**文件**: +- `frontend/scene-generator/server.js`(新增业务 JS 文件识别和提取) +- `frontend/scene-generator/llm-client.js`(prompt 中增加业务 JS 片段) + +#### Task 6:提取后验证与二次追问 + +**目标**:LLM 返回后检查关键信息是否缺失,缺失则二次追问 + +**改动**: +- 新增 `validateExtractedSceneInfo()` 函数 +- 检查项:至少一个 apiEndpoint 有 contentType、至少一个 mode 有 responsePath +- 如果缺失,构造二次 prompt 要求补充 +- 最多追问 1 次,超时则使用默认值 + +**文件**:`frontend/scene-generator/llm-client.js` + +### 阶段三:测试验证 + +#### Task 7:单元测试 + +**目标**:为多模式生成路径添加测试覆盖 + +**改动**: +- 新增 `tests/scene_generator_modes_test.rs` +- 测试用例: + 1. 单模式场景生成包含 `const MODES =` 的 JS + 2. 多模式场景生成包含 mode 路由逻辑 + 3. 蛇形/驼峰序列化一致性 + 4. form-urlencoded 请求体格式正确 + 5. responsePath 提取步骤存在 + +**文件**:`tests/scene_generator_modes_test.rs`(新增) + +#### Task 8:集成测试 + +**目标**:用真实场景验证生成质量 + +**步骤**: +1. 拿 `用户日电量监测`(最简单的模式 C 场景)跑一次完整生成 +2. 拿 `台区线损大数据`(最复杂的模式 A 双模式场景)跑一次完整生成 +3. 对比生成结果与 tq-lineloss-report 的差异 +4. 记录差距清单 + +**产出**:集成测试报告文档 + +## 影响范围 + +| 文件 | 改动类型 | 涉及 Task | +|------|---------|-----------| +| `src/generated_scene/generator.rs` | 修改 | Task 1, Task 2 | +| `frontend/scene-generator/llm-client.js` | 修改 | Task 3, Task 4, Task 6 | +| `frontend/scene-generator/server.js` | 修改 | Task 5 | +| `tests/scene_generator_modes_test.rs` | 新增 | Task 7 | +| 集成测试报告 | 新增 | Task 8 | + +## 非目标 + +- 第三梯队场景(链式多步 API 调用)的完全自动化不在本方案范围内 +- BrowserAction 跨页面注入的自动识别和转换在第二梯队中部分支持,不追求 100% 准确 +- Web UI 变更不在本方案范围内(后续独立方案处理)