281 lines
14 KiB
Markdown
281 lines
14 KiB
Markdown
# 互动组件配置JSON生成器 — 产品需求文档
|
||
|
||
## v1 基础版(已完成)
|
||
|
||
### 目标
|
||
从飞书wiki剧本文档出发,经过sheet数据解析、组件类型匹配、LLM驱动的jsonData生成,
|
||
最终输出组件配置JSON并持久化到本地SQLite数据库。
|
||
|
||
### 已实现能力
|
||
- 27种中互动组件类型的中英对照注册表
|
||
- 飞书wiki文档+内嵌sheet读取(feishu_client.py)
|
||
- 组件行识别与教研配置提取(parse_script.py)
|
||
- 通用LLM生成(few-shot参考样例驱动)
|
||
- 规则化kpInfo生成
|
||
- 端到端pipeline + SQLite持久化
|
||
|
||
---
|
||
|
||
## v2 精确Prompt优化(已完成 2026-04-28)
|
||
|
||
> 来源: /root/.openclaw/prd/xiaoyan_comp_json_skill_v2.md
|
||
|
||
### 核心需求
|
||
|
||
1. **每种组件类型使用独立的精确Prompt模板**,包含完整的字段定义、抽取规则、输出格式和样例,
|
||
方便排查问题。输出规则设置应尽量全部保留,最终达成与原有流程一样的输出效果。
|
||
|
||
2. **角色物品配置(resourceMapping)通过 section 对应关系解析**:
|
||
- 读取文档markdown中 "角色-section对应" 表格,获取每个section的角色id对应关系
|
||
- 组件配置行的"配置信息"列标记了所属section(如 "S1主线")
|
||
- 根据section找到对应的角色id,写入最终JSON的 resourceMapping 字段
|
||
|
||
3. **教研配置文本拆解为结构化字段**,作为prompt的输入变量:
|
||
- 标题、情境引入、互动内容、后置对话、角色配置、资源配置、互动反馈、互动描述、学习意义构建、语音识别热词
|
||
|
||
### 覆盖组件类型(16种已提供精确prompt)
|
||
|
||
#### 对话类(6种)
|
||
| 中文名 | cType | 特殊字段 |
|
||
|--------|-------|----------|
|
||
| 对话朗读 | mid_dialog_repeat | question(去掉"朗读"), imgShowTimingList, audioFile/itemName |
|
||
| 对话表达 | mid_dialog_express | asrPrompt(热词), tip, corFeedback/errFeedback, question.desc, example |
|
||
| 对话选择 | mid_dialog_choose | optionList+needAudio, answer, corFeedback/errFeedback |
|
||
| 对话选读 | mid_dialog_select | optionList+needAudio+feedback(per-option) |
|
||
| 对话挖空 | mid_dialog_fillin | question(desc+content), optionGroupList, corFeedback/errFeedback |
|
||
| 对话组句 | mid_dialog_sentence | question(desc+content), optionList, answer(索引), tip, corFeedback/errFeedback |
|
||
|
||
#### 信息类(6种)
|
||
| 中文名 | cType | 特殊字段 |
|
||
|--------|-------|----------|
|
||
| 信息描写 | mid_message_trace | cDesc, trace, img, inputSet=[] |
|
||
| 信息拼词 | mid_message_spell | cDesc, inputConfig(stem+value), stemList, tip |
|
||
| 信息组句 | mid_message_combine | cDesc, optionList, answer(索引), tip |
|
||
| 信息补词 | mid_message_fillin | cDesc, inputConfig(stem+value), tip |
|
||
| 信息填词 | mid_message_word | cDesc, answer(数组), tip |
|
||
| 信息填句 | mid_message_sentence | cDesc, answerHint, tip |
|
||
|
||
#### 图片类(4种)
|
||
| 中文名 | cType | 特殊字段 |
|
||
|--------|-------|----------|
|
||
| 图片单选 | mid_image_choose | meaning, imageInfo(questionImg+answerImg), optionList({ID}_option_XX.png), answer, cDesc |
|
||
| 图片多选 | mid_image_multiple | 同上,answer为多个索引 |
|
||
| 图片有序 | mid_image_sequence | 同上,answer为排序索引 |
|
||
| 图片拖拽 | mid_image_drag | 同上,question可含content(音频) |
|
||
|
||
### 通用输出规则(所有类型)
|
||
- 输出必须在一行内完成,不要换行
|
||
- 不要使用markdown代码块包裹
|
||
- 输出内容必须是合法JSON,可直接用于 JSON.parse
|
||
- resourceMapping中id必须为int类型
|
||
- "无"的字段使用空数组[]或空对象{}
|
||
- imgShowTimingList对应关系:preDialog:情境引入、content:互动内容、feedback:互动反馈、postDialog:后置对话
|
||
- img字段值为"{ID}.png"(仅资源配置中存在图片时机时)
|
||
- audioFile字段值为"{ID}.mp3"(仅资源配置中存在音频载体时)
|
||
- "(音频)"标记 → needAudio:true
|
||
- "(正确)"标记 → answer索引,抽取时不包含标记本身
|
||
|
||
### 实现方案
|
||
- `prompts/prompt_registry.py` — 16种组件的prompt模板 + 结构化字段解析 + prompt构建
|
||
- `parse_script.py` 增强 — extract_section_character_map() + resolve_resource_mapping() + config_info列
|
||
- `generate_json.py` 重写 — 优先使用per-type prompt模板,无模板时回退到few-shot
|
||
- `pipeline.py` 更新 — 传递section_char_map到generate_component
|
||
|
||
### 参考文档
|
||
- 输入: https://makee-interactive.feishu.cn/wiki/Z3ydwGJnti4zaDkLXLNcGk3enod
|
||
|
||
---
|
||
|
||
## v3 resourceMapping补全 + LLM升级(已完成 2026-04-28)
|
||
|
||
> 来源: /root/.openclaw/prd/xiaoyan_comp_json/v3.md
|
||
|
||
### 核心需求
|
||
|
||
1. **resourceMapping字段补全**:所有互动类型都有resourceMapping字段,此前6种信息类(mid_message_*)
|
||
的prompt模板中遗漏了该字段。已为全部6种信息类模板补充resourceMapping字段定义和角色配置输入。
|
||
|
||
2. **section-character映射验证**:确认每个组件的config_info(如"S1主线")正确关联到角色ID:
|
||
- S1-S14 → Eva:663, Peter:653, Vicky:658
|
||
- S15-S16 → Eva:738, Peter:739
|
||
- 实现:parse_script.py中extract_section_character_map()解析markdown表格,
|
||
resolve_resource_mapping()根据config_info列的section编号查找对应角色ID
|
||
|
||
3. **LLM模型切换到doubao-seed-2.0-pro**:
|
||
- 端点:ep-m-20260301164317-vmmj4
|
||
- 关闭thinking模式(payload中设置 `thinking: {type: "disabled"}`)
|
||
- 性能提升:单组件生成从~17s降至~4s
|
||
|
||
### 变更文件
|
||
- `prompts/prompt_registry.py` — 6种mid_message_*模板补充resourceMapping + INPUT_FIELDS补充角色配置
|
||
- `scripts/llm_client.py` — 新增doubao-seed-2.0-pro模型注册,设为默认,disable_thinking支持
|
||
|
||
---
|
||
|
||
## v3.1 语音识别热词自动生成(已完成 2026-04-28)
|
||
|
||
### 核心需求
|
||
对涉及语音识别的互动组件,基于教研配置上下文自动生成热词(asrPrompt):
|
||
- **表达类**(mid_dialog_express):LLM根据情境引入、互动内容、后置对话自动生成高频/难识别词汇,逗号连接
|
||
- **朗读类**:返回"无"
|
||
|
||
### 实现
|
||
- `scripts/generate_json.py` — 新增 `generate_asr_hotwords()` 函数 + `ASR_TYPES` 集合
|
||
- 在 `_generate_with_template()` 中,对 ASR_TYPES 类型在构建prompt前自动生成热词并注入 parsed_fields
|
||
|
||
---
|
||
|
||
## v4 核心互动组件支持(已完成 2026-04-28)
|
||
|
||
> 来源: /root/.openclaw/prd/xiaoyan_comp_json/v4.md
|
||
|
||
### 数据来源说明
|
||
**数据来源不变** — 仍然是剧本文档表格的"组件配置"列。多维表格(bitable)是旧的数据流程,
|
||
我们基于剧本文档进行自动化生产是新流程,目标是替换多维表格流程。
|
||
|
||
### 飞书多维表格读取经验(参考用)
|
||
已有能力通过 `feishu_client.py` 读取多维表格数据,可用于参考理解数据结构:
|
||
```python
|
||
from feishu_client import list_bitable_tables, read_bitable_records
|
||
|
||
# 列出表
|
||
tables = list_bitable_tables('H6DJweNkpigCbak2Y5LcTZ8Vnfb')
|
||
# 读取记录
|
||
records = read_bitable_records('H6DJweNkpigCbak2Y5LcTZ8Vnfb', 'tblAsmsV19vUnFb8', page_size=5)
|
||
# 每条记录: {"record_id": str, "fields": dict}
|
||
```
|
||
|
||
### 一. 合作阅读(core_reading_order)
|
||
|
||
#### 输入
|
||
剧本"组件配置"列 = "教研配置-任务" + "教研配置-材料" 拼接,包含以下【】section:
|
||
- 【任务标题】、【任务背景】、【通关知识】(来自教研配置-任务)
|
||
- 【阅读材料】(来自教研配置-材料)
|
||
- 【流程编排】、【角色配置】、【专有词汇】、【学习材料】等
|
||
|
||
#### 多维表格参考(合作阅读 bitable)
|
||
- wiki: H6DJweNkpigCbak2Y5LcTZ8Vnfb
|
||
- S3表: tblAsmsV19vUnFb8
|
||
- 字段列表: ID, 教研配置-任务, 教研配置-材料, 角色配置, 通关知识, 流程编排, 专有名词,
|
||
阅读材料, 学习材料, 互动题目, 阅读材料格式化, 学习材料格式化, 学习过程配置,
|
||
taskData, textData, sequenceData, learningData, kpInfo
|
||
|
||
#### 生成流水线(7步LLM调用)
|
||
```
|
||
教研配置-材料 ──┬──→ [Step 1] 阅读材料格式化 ──→ 材料正文
|
||
└──→ [Step 2] 学习材料格式化 ──→ 学习内容(段落)
|
||
↓
|
||
[Step 3] 学习过程配置 ←── 文章材料(S1) + 学习内容(S2) + 专有词汇
|
||
│
|
||
┌─────────────┼─────────────┬─────────────┐
|
||
↓ ↓ ↓ ↓
|
||
[Step 4] [Step 5] [Step 6] [Step 7]
|
||
taskData textData sequenceData learningData
|
||
```
|
||
|
||
#### 4个最终JSON输出
|
||
- **taskData**: cType, cId, title, sceneDesc, img, key(通关知识), resourceMapping
|
||
- **textData**: text(材料正文), question(互动题目)
|
||
- **sequenceData**: sequence(流程编排→材料/对话/题目序列)
|
||
- **learningData**: closing, learningPart(段落+题目+反馈)
|
||
|
||
### 实现
|
||
- `scripts/match_component.py` — 注册 `core_reading_order` cType
|
||
- `prompts/core_reading_prompts.py` — 7步prompt模板 + `build_step_prompt()` + `CORE_READING_STEPS` 注册表
|
||
- `scripts/generate_json.py` — 新增:
|
||
- `CORE_TYPES` 集合
|
||
- `parse_core_reading_fields()` 从【】section提取各字段
|
||
- `generate_core_reading_order()` 7步LLM调用编排器
|
||
- `generate_component()` 增加核心互动分流逻辑,返回 taskData/textData/sequenceData/learningData
|
||
- `scripts/pipeline.py` — 核心互动结果写入多JSON字段,HTML报告传递 category
|
||
- `scripts/db_manager.py` — 新增5列: task_data_json, text_data_json, sequence_data_json, learning_data_json, intermediate_json + 自动迁移
|
||
- `scripts/html_report.py` — 核心互动卡片展示多JSON section + 中间结果 + 核心互动badge
|
||
|
||
### 验证
|
||
使用 bitable 样例数据 (ID=0325001) 端到端通过7步生成,所有JSON结构正确。
|
||
|
||
---
|
||
|
||
## v5 看图选词 + 口语快答 核心互动支持(已完成 2026-04-28)
|
||
|
||
> 来源: prd/v5.md
|
||
|
||
### 二. 看图选词(core_reading_imageDrag)
|
||
|
||
#### 输入
|
||
剧本"组件配置"列 = "教研-导览配置" + "教研-互动配置" 拼接,包含以下【】section:
|
||
- 【任务标题】、【任务背景】、【任务描述】、【通关知识】(来自教研-导览配置)
|
||
- 【阅读材料】、【互动问题】(来自教研-互动配置)
|
||
|
||
#### 多维表格参考
|
||
- wiki: MVo7wugWfimJPIkxhJCcqppFnyf
|
||
- 表: tblKl9CGmARjpw1O
|
||
- 字段: ID, 教研-导览配置, 教研-互动配置, 用户任务描述, 用户任务知识, 角色配置, 专有名词,
|
||
学习流程配置, 互动描述, taskInfo, questionGroup, studyInfo, kpInfo
|
||
|
||
#### 生成流水线(5步LLM调用)
|
||
```
|
||
教研配置 ──┬──→ [Step 1] 学习流程配置 ──→ 中间文本
|
||
└──→ [Step 2] 互动描述 ──→ 中间文本
|
||
↓
|
||
[Step 3] taskInfo ←── 用户任务描述 + 用户任务知识 + 角色配置 + 互动描述
|
||
[Step 4] questionGroup ←── 互动配置(材料+问题)
|
||
[Step 5] studyInfo ←── 学习流程配置(S1)
|
||
```
|
||
|
||
#### 3个最终JSON输出
|
||
- **taskData**: cType, cId, title, taskDesc, sceneDesc, key(通关知识), resourceMapping, cDesc
|
||
- **questionGroupData**: [{ image, questionList: [{ type, npcName, content/title, desc, optionList, answer }] }]
|
||
- **studyData**: { learningPart: [{ image, learning: [{ question, optionList(+feedback), answer }] }], closing }
|
||
|
||
### 三. 口语快答(core_speaking_reply)
|
||
|
||
#### 输入
|
||
剧本"组件配置"列 = "教研-用户视角任务信息" + "教研-任务规则与NPC设定" 拼接,包含以下【】section:
|
||
- 【任务标题】、【任务背景】、【任务描述】、【通关知识】(用户视角任务信息)
|
||
- 【对话角色】、【回合设定】、【任务设定】、【示例对话】、【通过规则】(任务规则与NPC设定)
|
||
|
||
#### 多维表格参考
|
||
- wiki: TSwcw0nFmi21khkpUndchNMsn6f
|
||
- 表: tbl4Qg8d45O58Cqf
|
||
- 字段: ID, 教研-用户视角任务信息, 教研-任务规则与NPC设定, 用户任务描述, 用户任务知识,
|
||
示例对话, 角色配置, 对话角色及回合设定, 通过规则, 任务设定, 任务背景,
|
||
学习流程配置, promptInfo配置, 语音识别热词, taskData, settingData, configData, learningData, kpInfo
|
||
|
||
#### 生成流水线(7步LLM调用)
|
||
```
|
||
教研配置 ──┬──→ [Step 1] 学习流程配置 ──→ 中间文本
|
||
├──→ [Step 2] promptInfo配置 ──→ 中间文本
|
||
└──→ [Step 3] 语音识别热词 ──→ 中间文本
|
||
↓
|
||
[Step 4] taskData ←── 用户任务描述 + 用户任务知识 + 角色配置
|
||
[Step 5] settingData ←── 对话配置(角色+回合)
|
||
[Step 6] configData ←── 热词(S3) + 背景 + promptInfo(S2) + 示例对话 + 通过规则
|
||
[Step 7] learningData ←── 学习流程配置(S1)
|
||
```
|
||
|
||
#### 4个最终JSON输出
|
||
- **taskData**: cType, cId, title, taskDesc, sceneDesc, img, key(通关知识), resourceMapping
|
||
- **settingData**: { setting: { npcName, round, checkRound } }
|
||
- **configData**: { config: { asrPrompt, promptInfo: { default, scene, in_progress_goal, final_goal, reference_dialog, user_task, user_scene, user_knowledge } } }
|
||
- **learningData**: { learningPart: { opening, wrongReadLeadIn, learning: [{ question, optionList(+feedback), answer, read, feedback }], closing } }
|
||
|
||
### 实现
|
||
- `scripts/match_component.py` — 注册 `core_reading_imageDrag` + `core_speaking_reply` cType 及 db_table
|
||
- `prompts/core_imagedrag_prompts.py` — 5步prompt模板 (2中间+3最终JSON)
|
||
- `prompts/core_speaking_prompts.py` — 7步prompt模板 (3中间+4最终JSON)
|
||
- `scripts/generate_json.py` — 新增:
|
||
- `parse_core_imagedrag_fields()` / `parse_core_speaking_fields()` 字段解析器
|
||
- `generate_core_reading_imagedrag()` 5步LLM编排器
|
||
- `generate_core_speaking_reply()` 7步LLM编排器
|
||
- `generate_component()` 增加两种新核心类型分流
|
||
- `CORE_TYPES` 集合新增两种类型
|
||
- `scripts/pipeline.py` — 核心互动结果写入多JSON字段 (questionGroupData/studyData/settingData/configData)
|
||
- `scripts/html_report.py` — 核心互动卡片展示全部JSON section
|
||
- `scripts/db_manager.py` — 新增4列: question_group_json, study_data_json, setting_data_json, config_data_json + 自动迁移 + allowed_fields
|
||
|
||
### 验证
|
||
- 看图选词 (ID=1201001): 5步生成全部通过,taskData/questionGroupData/studyData 结构正确,耗时~47s
|
||
- 口语快答 (ID=0325001): 7步生成全部通过,taskData/settingData/configData/learningData 结构正确,耗时~90s
|
||
- HTML验证报告: `outputs/V5核心互动验证 - imageDrag + speaking`
|