13 KiB
Scene Skill Compiler Design
Status: Draft Date: 2026-04-17 Author: Codex
Problem Statement
当前 sg_scene_generate 已经具备基础的场景识别、LLM 抽取和模板渲染能力,但整体上仍然更接近“场景元数据提取器 + 模板填充器”,还不是一个真正可复用的通用 skill 转化器。
这在两个对照样本上表现得很明显:
| 样本 | 转化方式 | 结果 |
|---|---|---|
tq-lineloss-report |
基于 Claude 的语义重建 | 生成结果接近可运行 skill,显式表达了月/周模式、请求体、列定义、响应路径 |
marketing-zero-consumer-report |
基于当前项目自动转化 | 生成结果偏“骨架 skill”,无法正确表达分页、逐户补数、过滤、导出等复合工作流 |
根因
- 当前生成流程主要抽取“字段”,没有稳定抽取“工作流”。
- 生成器默认假设报表场景接近“单次请求 -> 表格归一化 -> 输出 artifact”。
scene.toml、bootstrap、参数合同和 browser script 之间仍存在较强硬编码。- LLM 输入存在截断,且缺少对关键逻辑片段的优先抽取。
- 运行时 resolver 能力较弱,无法稳定承接更复杂的自动生成结果。
典型失败模式
以 marketing-zero-consumer-report 为例,原始场景实际是:
- 获取组织或用户列表。
- 按页拉取用户数据。
- 对每个用户发起二次请求补充电费信息。
- 根据
charge !== 0做业务过滤。 - 组装导出数据并通过本地服务导出。
但当前自动生成结果把它错误归类成了“单请求报表”,导致:
- bootstrap 域名和目标页面来源不稳定。
- browser script 只使用第一个 API 端点。
- 数据归一化直接对原始列表生效,没有分页循环和二次请求。
- 生成出的参数合同与真实业务流程不匹配。
Goal
将当前场景生成器升级为一个面向常见内网场景的“迷你版 skill-creator / scene skill compiler”,使其具备以下能力:
- 先理解场景工作流,再选择模板并生成 skill。
- 覆盖常见报表类内网场景,而不是只覆盖单请求表格场景。
- 在生成前给出可运行性评估,减少“生成成功但内网跑不通”的情况。
- 让同类场景可以复用同一套转化机制,而不是逐个手工重写。
Non-Goals
- 不追求一次性支持所有历史场景和所有前端技术栈。
- 不在第一阶段解决登录、鉴权、跨域和浏览器宿主差异的全部问题。
- 不要求 LLM 单独完成完整语义恢复,必须允许规则提取参与。
- 不要求生成结果 100% 无需人工审阅。
Design Principles
1. 先建模,再生成
必须先把原始场景建模为统一的 Scene IR,再由编译器按 archetype 渲染 skill。
2. 抽取“工作流证据”优先于抽取“字段清单”
对通用 skill 转化器而言,分页、模式切换、二次请求、导出动作、过滤条件,比单纯的 URL 和列定义更重要。
3. 确定性优先,LLM 补全
URL、请求方法、分页变量、入口函数、列头、导出调用等确定性信息优先由规则提取;LLM 负责做语义归并、命名和补全。
4. 模板按 archetype 拆分
不能继续用一个通用模板覆盖所有报表场景。不同工作流 archetype 必须有独立编译路径。
5. 运行时合同必须与生成能力对齐
生成器输出什么参数合同,运行时 resolver 就必须能承接;否则生成器必须降级或提示人工补齐。
Architecture
Target Architecture
原始场景目录
-> 场景扫描器
-> 确定性规则提取
-> LLM 语义补全
-> Scene IR 合并
-> archetype 分类
-> archetype 编译器
-> skill 包
-> 静态验收 / 可运行性评级
Core Pipeline
- 扫描
index.html、scripts/*.js、目录结构和可见依赖关系。 - 规则提取器抓取确定性证据。
- LLM 基于分块后的关键上下文提取高层语义。
- 合并为统一
Scene IR。 - 根据
workflowArchetype路由到对应编译器。 - 生成
scene.toml、SKILL.toml、browser script 和说明文档。 - 执行静态门禁和 readiness 评级。
Scene IR
Top-Level Fields
{
"sceneId": "marketing-zero-consumer-report",
"sceneName": "营销2.0零度户报表数据生成",
"sceneKind": "report_collection",
"workflowArchetype": "paginated_enrichment",
"bootstrap": {
"expectedDomain": "yx.gs.sgcc.com.cn",
"targetUrl": "http://yx.gs.sgcc.com.cn"
},
"params": [
{
"name": "org_code",
"resolver": "org_tree",
"required": true
}
],
"modes": [],
"workflowSteps": [
{ "type": "paginate", "entry": "getUserList" },
{ "type": "foreach", "source": "userList" },
{ "type": "secondary_request", "entry": "getUserCharges" },
{ "type": "filter", "expr": "charge !== 0" },
{ "type": "export", "entry": "exportExcel" }
],
"requestTemplate": {},
"responsePath": "data.rows",
"normalizeRules": {
"type": "field_map"
},
"artifactContract": {
"type": "report-artifact"
},
"validationHints": {
"requiresTargetPage": true
},
"evidence": []
}
Required IR Blocks
| Block | Purpose |
|---|---|
workflowArchetype |
决定编译器路由 |
bootstrap |
决定目标域名、目标页面和 helper page 行为 |
params |
决定 scene.toml 参数合同 |
modes |
表达月/周、日/月、报表类型切换等多模式逻辑 |
workflowSteps |
表达分页、循环、二次请求、过滤、导出等复合流程 |
requestTemplate |
表达固定请求体和参数映射 |
responsePath |
指定响应数据抽取路径 |
normalizeRules |
指定字段映射、空行过滤和关键字段校验 |
artifactContract |
指定输出 artifact 结构和状态语义 |
evidence |
保留抽取证据,便于 UI 预览和人工复核 |
Workflow Archetypes
第一阶段建议先稳定支持以下 archetype:
| Archetype | 场景特征 | 典型样本 |
|---|---|---|
single_request_table |
单次请求,直接返回表格或列表 | 简单报表场景 |
multi_mode_request |
同一场景存在月/周等多模式,请求体和列定义随模式切换 | tq-lineloss-report |
paginated_enrichment |
先分页拉主列表,再逐条或逐批补数,再过滤或导出 | marketing-zero-consumer-report |
page_state_eval |
更偏状态检查、页面判定、轻量采集 | 监测类或状态判定类场景 |
Routing Rules
- 有显式模式切换条件,优先判定为
multi_mode_request。 - 有分页调用且伴随逐条二次请求,优先判定为
paginated_enrichment。 - 无明确请求链、以页面状态判定为主,归到
page_state_eval。 - 其余默认归到
single_request_table,但标记为低置信度。
Extraction Architecture
Stage 1: Deterministic Extraction
规则提取器负责抽取高确定性信息:
- URL、请求方法、
contentType、请求体拼装方式。 - 分页参数,例如
page、rows、pageSize、sidx、sord。 - 入口函数、导出函数、列表函数、详情函数。
if/switch模式分支。- 表头、列定义、字段映射。
- 明确的过滤条件,例如
charge !== 0。
Stage 2: LLM Semantic Completion
LLM 负责以下内容:
- 对规则提取结果做归并和命名。
- 补全
workflowSteps的高层描述。 - 判断 archetype。
- 推断
requestTemplate、responsePath、normalizeRules。 - 输出不确定项和置信度。
Input Strategy
当前“截前 15000/3000 字符”的做法需要替换为:
- 目录结构摘要。
index.html分块。- 命中关键模式的函数片段优先注入。
- URL 和请求构建语句优先注入。
- 同一场景允许分阶段提问,而不是一次性塞完整上下文。
Compiler Architecture
Compiler Split
建议把当前单一生成器改成 archetype 路由后的多编译器:
| Compiler | Responsibility |
|---|---|
single_request_table compiler |
生成简单表格采集 skill |
multi_mode_request compiler |
生成多模式切换 skill |
paginated_enrichment compiler |
生成分页 + 补数 + 过滤类 skill |
page_state_eval compiler |
生成状态判定或轻量监测类 skill |
Compiler Outputs
每个编译器都负责:
- 生成
scene.toml。 - 生成
SKILL.toml。 - 生成 browser script。
- 生成引用说明文档,例如
collection-flow.md。 - 输出 readiness 评级和风险说明。
Marketing Case
marketing-zero-consumer-report 必须走 paginated_enrichment 编译器,至少生成这些逻辑骨架:
- 主列表分页采集。
- 对每个用户执行二次请求。
- 聚合字段。
- 业务过滤。
- 导出或 report artifact 输出。
TQ Case
tq-lineloss-report 必须走 multi_mode_request 编译器,至少生成这些逻辑骨架:
- 模式识别。
- 模式专属请求体构建。
- 模式专属列定义。
- 固定响应路径抽取。
- 统一 artifact 输出。
Runtime Contract Alignment
当前运行时参数解析器主要集中在 [src/compat/scene_platform/resolvers.rs],能力仍偏基础。编译器设计必须显式处理这层约束。
Short-Term Strategy
短期有两种可选策略:
- 扩展 resolver 集合,支持更多参数合同。
- 在生成阶段限制输出,只允许生成当前运行时能消化的参数模型。
Recommended Resolver Additions
第一阶段建议补齐以下解析能力:
mode_enumdate_rangeorg_treepage_sizehidden_staticderived_param
如果 resolver 暂时不扩,则生成器必须在 UI 和生成报告中明确标出“不兼容运行时合同”的风险。
Verification And Readiness Gates
Static Gates
生成完成后必须先过静态门禁:
- 是否识别到业务入口。
- 是否识别到核心请求链。
- 是否识别到正确 bootstrap。
- 参数合同是否与 archetype 匹配。
- 编译器是否覆盖全部关键步骤。
Readiness Levels
建议为每个生成结果打分级标签:
| Level | Meaning |
|---|---|
A |
可以直接进入内网试跑 |
B |
结构正确,但建议人工校验后试跑 |
C |
只适合作为草稿,需要人工补逻辑 |
Minimum Acceptance For Reference Scenes
marketing-zero-consumer-report:
- 被识别为
paginated_enrichment。 - 识别出主列表请求和二次补数请求。
- 识别出
charge !== 0过滤逻辑。 - 生成结果不再退化为单请求表格模板。
tq-lineloss-report:
- 被识别为
multi_mode_request。 - 识别出月/周双模式。
- 模式切换字段、请求体和列定义被区分。
- 生成结果与手工 skill 在结构上同构。
File Impact
New Or Modified Areas
| File | Responsibility |
|---|---|
frontend/scene-generator/llm-client.js |
深度抽取 schema、分块上下文、置信度输出 |
frontend/scene-generator/generator-runner.js |
文件读取、关键片段抽取、目录摘要 |
frontend/scene-generator/server.js |
分析接口、IR 透传、生成报告 |
frontend/scene-generator/sg_scene_generator.html |
抽取预览、风险展示、readiness 展示 |
src/bin/sg_scene_generate.rs |
接收 Scene IR 或 IR JSON 参数 |
src/generated_scene/analyzer.rs |
确定性提取、archetype 辅助识别 |
src/generated_scene/generator.rs |
archetype 路由和多编译器编排 |
src/generated_scene/ir.rs |
定义统一 Scene IR |
src/compat/scene_platform/resolvers.rs |
参数合同对齐与扩展 |
Migration Strategy
Phase 1
先修当前明显错误:
- bootstrap 来源修正。
- 移除通用报表默认硬编码。
- 替换截断式 LLM 输入。
- 生成前展示抽取预览。
Phase 2
引入 Scene IR,完成“先建模、再生成”的主干改造。
Phase 3
接入 archetype 分类器和多编译器。
Phase 4
补运行时 resolver,加入 readiness 门禁。
Open Questions
Scene IR是否作为单独 JSON 文件落地到输出目录,便于后续复用和回放。page_state_eval是否继续共用当前report-artifact,还是定义独立 artifact 类型。- 是否允许用户在 Web UI 中手工修正 archetype、bootstrap 和参数合同后再生成。
Acceptance Criteria
满足以下条件时,可以认为本设计达到预期:
- 同一套生成流程能够同时覆盖
tq-lineloss-report和marketing-zero-consumer-report两类差异明显的场景。 marketing不再因错误 archetype 导致内网必然跑不通。scene.toml不再默认带入错误的组织、周期和标题关键字。- 生成结果具备明确的 readiness 分级,用户能在生成前识别风险。
- 生成器在定位上从“模板填充器”升级为“通用场景 skill 编译器”。