---
name: audit_unit_challenge
description: 单元挑战所有题型自动化审校技能。覆盖听力P1-P7（除P3）、阅读P1-P7、写作P1-P5、口语P1-P5的全表结构完整性、jsonData字段规范、能力标签标准化、explanation质量、题目集合ID一致性等检查。触发关键词：单元挑战审校、单元挑战检查、单元挑战审核、unit challenge audit、审校 听力/阅读/写作/口语-P
---

# 单元挑战内容审校

## 目标数据源

- **多维表格 App Token**: `CMHSbUUjka3TrUsaxxEc297ongf`
- **身份**: Bot 身份操作（`cli_a931175d41799cc7`）
- **操作方式**: Python `requests` 直调飞书 Open API

## ⛔ 审校红线（强制执行）

### 禁止修改「题目集合 ID」列

> **`题目集合 ID`（QSID）列绝对禁止修改。** 审校过程中发现的一切问题——无论严重程度——都**不得修改**该列的值。

**原因：** 该列是教研团队手动维护的唯一标识符，与课程大纲、教学进度、资源管理等上游系统关联。自动审校修改 QSID 会导致数据关联断裂。

**处理方式：**
- 如果 QSID 与 jsonData 内部 `questionSetID` 不一致 → 标记为 🔴，在「审校结果」列报告差异，**不改任何一方的值**
- 如果 QSID 格式异常（如 "L1"、空值）→ 标记为 🔴，说明原因，**不改值**
- 如果多个 record 共享同一 QSID → 标记为 🟡，说明可能有意的第一/第二题组设计，**不改值**

### 禁止修改的资源字段

- 音频资源 key（questionAudio / textAudio 字段）
- 图片资源 key（textImage / optionsImage / imageDesc 字段）
- 任何包含文件路径/资源标识的字段

## 表结构总览

| 题型类别 | 表名 | Table ID | 字段结构 |
|---------|------|----------|---------|
| 听力 P1 | 图片选择题 | `tbliZAhcc9C43B23` | 题目集合 ID, 题目1 完整配置, 题目2 完整配置, jsonData, dataStatus, 推送到服务端, 审校结果 |
| 听力 P2 | 表格填空题 | `tblzTLNH7f13uWQN` | 同上 |
| 听力 P4 | 短对话选择题 | `tblVmeDtBDKsAEfz` | 同上 |
| 听力 P5 | 信息匹配题 | `tblDssVmhGzc3UKd` | 同上 |
| 听力 P6 | 听力选图 | `tbloiMcD0sBtGSTq` | 同上 |
| 听力 P7 | 听力拖拽 | `tbly9SvPEa44k3yX` | 同上 |
| 阅读 P1-P7 | (待补充) | (待补充) | 同上基础结构 |
| 写作 P1 | 邮件回复 | `tblszuk1TeToofBF` | 题目集合 ID, 题目1, 题目2, jsonData, dataStatus, 推送到服务端, 审校结果 |
| 写作 P2-P5 | (待补充) | (待补充) | — |
| 口语 P1 | 日常回答 | `tblRGv7k4WH58Jgq` | 题目集合 ID, 题目1, 题目1热词, 题目2, 题目2热词, jsonData, dataStatus, 推送到服务端, 审核结果 |
| 口语 P2 | 话题讨论 | `tblGoWYBmVI0IrvQ` | 题目集合 ID, 题目1, 题目2, 图片描述, jsonData, dataStatus, 推送到服务端, 审核结果 |
| 口语 P3-P5 | (待补充) | (待补充) | — |



## 文本输出规范（强制执行）

所有输出的文本内容（台词、题目、选项、解析、音频文本、阅读文章等）必须遵守以下规则：

1. 禁止 Markdown 标记：禁止使用 ** * __ _ 等加粗/斜体标识，也禁止使用 # > - 等块级 Markdown 语法。所有文本纯文本输出。
2. 英式拼写优先：单词涉及英美式拼写差异时（如 colour/color、centre/center、travelling/traveling），统一选择英式拼写。
3. 标点符号规范：严格区分全角/半角符号。中文内容使用全角标点（，。！？：），英文内容使用半角标点（. , ! ? :），不得混用。特别注意：英文冒号必须用半角 `:`，不得用全角 `：`。
4. 中英文混排空格规范：中文与英文/数字之间加半角空格（如"汇报 Jay 不配合"、"Tom 说 hello"），纯中文或纯英文内容不加额外空格。

## 审校流程

```
Step 1: 准备 — 确认目标表范围、Bot Token 可用
Step 2: 结构检查 — 全表扫描、JSON 可解析性、字段完整性
Step 3: 深度检查 — 能力标签、explanation、answer、内容一致性
Step 4: 问题汇总 — 分级标记问题（🔴严重/🟡中等/⚪建议）
Step 5: 写回 — 将审校结果写入对应表的「审校结果」/「审核结果」列
         ↓
         ⛔ 写回时禁止修改「题目集合 ID」列
```

## 自动化检查项

### 1. QSID 一致性检查 ⛔

```
检查规则:
  - 读取「题目集合 ID」列值（记录不修改此值）
  - 读取 jsonData.first.questionSetID 和 jsonData.second.questionSetID
  - 比较差异并报告

报告格式:
  🔴 QSID不一致：字段={列值}，jsonData.first={内部QSID}
  🔴 QSID格式异常：字段="{列值}"，非标准7位数字格式
  🟡 QSID疑似占位：字段="000001"（需要人工确认是否有意为之）
```

### 2. jsonData 结构完整性

```
检查项:
  ✅ 是否有 jsonData 字段（非空）
  ✅ jsonData 是否可解析为合法 JSON
  ✅ 是否包含 first/second block（至少一个）
  ✅ first/second 中是否包含 type、questionSetID、questionSet
  ✅ questionSet 是否为非空数组
  ✅ 每题是否包含: content/question、answer、ability、explanation
  ✅ 各字段值非空（content > 0字符, answer 非空列表, ability 非空列表, explanation > 10字符）
```

### 3. 能力标签（ability）标准化

```
标准格式:
  - 层级分隔符: ｜（全角竖线，非 | 或 ¥¥）
  - 格式: 一级分类｜二级细分
  - 示例:
    听力: 显性事实理解｜单句信息点抓取
         显性细节理解｜数字/时间/地点
         多特征整合, 语用推断
         干扰抑制｜多信息筛选
    口语: 句型组织, 表达观点, 表达建议, 经历描述, 表达转变
          条件表达, 表达预测, 过去对比, 协商表达
    写作: 短消息写作｜邮件/便条
         衔接与连贯｜连词使用

常见错误:
  🔴 使用 ¥¥ 而非 ｜  →  需替换
  🟡 使用 | (半角)  →  建议替换为 ｜
  🟡 一级分类不在已知标准列表中  →  人工确认
```

### 4. Explanation 质量检查

```
检查项:
  🔴 explanation 为空字符串 → 必须补充
  🟡 explanation < 20 字符 → 可能过短，需检查
  🟡 explanation 纯模板化（如 "听力内容中提到的相关信息与第N张图片相符"）→ 建议具体化

口语类 explanation 要求:
  - 包含句型模板（如 "用 'I used to...' 描述"）
  - 包含示例回答（如 "例如 'I used to play...'"）
  - 解释出发点（考察什么能力）
  - 语法注意点（如时态、特殊结构）
```

### 5. Answer 格式检查

```
按题型检查:
  listening_choicePic: answer 应为 [0]/[1]/[2]（选项索引）
  listening_drag: answer 应为 排序数组如 [0,1,2,3]
  listening_matchInfo: answerSet 应为 匹配数组
  writing_email: answerSet 应为 排序数组，不超 optionSetList 范围
  speaking_qa: answer 可为空数组 []（口语无标准答案）
  speaking_topic: answer 可为空数组 []

检查项:
  🔴 answer 索引超出选项范围（如只有3个选项但 answer=[3]）
  🟡 answer 为空但题型应有答案
```

### 6. 文本字段 × JSON 内容一致性

```
写作类:
  - 题目1 文本中【段落列表】数量 = jsonData optionSetList 长度
  - 文本中的段落标签 A./B./C. 数量和顺序一致

听力类:
  - 题目1/2 中【题目】数量 = jsonData first/second questionSet 长度
  - 如有【听力文本】，检查题目数匹配

口语类:
  - 题目1/2 中【题目】数量 = jsonData first/second questionSet 长度
  - 热词字段与 jsonData asrPrompt 中关键词一致
```

### 7. 数值字段完整性

```
检查项:
  🟡 dataStatus 不为 "0" → 标记为非生产数据
  🟡 推送到服务端 为空 → 尚未推送
```

## 审校结果写入规范

写入各表「审校结果」/「审核结果」列时遵循：

```
1. 🔴 标记必须修复的问题，附带:
   - 具体定位（first[2]/second[0]）
   - 错误内容片段
   - 建议修改方案

2. 🟡 标记建议优化的问题，附带:
   - 问题说明
   - 优化方向（不给具体值，保留人工判断空间）

3. ⚠️ 标记需人工确认的问题

4. ✅ 全量通过时写 "✅"

5. 📝 占位/测试数据标记为 "⚠️ 测试/占位数据" + 说明

⛔ 写入时只更新「审校结果」/「审核结果」+ 需要修复的 jsonData 字段
   绝不更新「题目集合 ID」列
```

## 脚本清单

| 脚本 | 用途 | 对应表 |
|------|------|--------|
| `../../scripts/audit_unit_challenge_listening.py` | 听力 P1-P7 第1轮基础审校 | 所有听力表 |
| `../../scripts/audit_unit_challenge_listening_v2.py` | 听力 P1-P7 第2轮深度审校 | 同上 |
| `../../scripts/audit_unit_challenge_reading.py` | 阅读基础审校 | 所有阅读表 |
| `../../scripts/audit_unit_challenge_v2.py` | 全题型基础检查 | 所有表 |
| `../../scripts/audit_unit_challenge_v3.py` | 全题型深度检查 | 所有表 |
| `../../scripts/write_audit_results_v3.py` | 审校结果写回 bitable | 所有表 |
| `../../scripts/fill_speaking_expl.py` | 口语-P1 explanation 补充 | 口语-P1 |
| `../../scripts/gen_writing_speaking.py` | 写作/口语内容生成 | 写作-P1/口语-P1/P2 |
| `../../scripts/gen_writing_speaking_batch2.py` | 写作/口语批量生成 | 同上 |
| `../../scripts/gen_batch3.py` | 写作/口语 C级批量生成 | 同上 |

## 已知能力标签库

### 听力类

```
显性事实理解｜关键词识别
显性事实理解｜单句信息点抓取
显性细节理解｜数字/时间/地点
显性细节理解｜物品特征辨识
显性细节理解｜物品功能辨识
多特征整合
语用推断
语用推断｜否定与纠错
干扰抑制｜多信息筛选
多句保持｜信息整合
听觉抓取关键信息
问题意图识别
关键细节听辨
图像语义对齐
近义改写
否定与纠错
```

### 写作类

```
短消息写作｜邮件/便条
衔接与连贯｜连词使用
情感表达｜鼓励与共情
情感表达｜感谢与赞美
描述性写作｜人物与地点
描述性写作｜场景与情绪
问题解决｜求助与建议
```

### 口语类

```
句型组织
表达观点
表达建议
表达转变
表达预测
表达愿望
表达困惑
表达反思
表达好奇
表达理解
表达期望
表达喜好与理由
经历描述
过去对比
条件表达
协商表达
回应表达
邀请表达
计划描述
解决问题
情感表达
```

## 常见问题案例

### 🔴 已遇到的真实错误

| 错误类型 | 示例 | 修复方案 | 涉及 QSID 列？ |
|---------|------|---------|---------------|
| ability ¥¥ 分隔符 | `显性事实理解¥¥关键词识别` | 替换为 ｜ | 否 |
| explanation 为空 | `explanation: ""` | 根据题目内容生成 | 否 |
| JSON 被 shell 转义破坏 | questionSet 全清空 | Python 直调 API 重写 | 否 |
| QSID 字段值与 jsonData 不一致 | 字段=021501, jsonData=032901 | ⛔ 不改 QSID，标记为 🔴 差异 | **禁止修改** |
| dataStatus 为 None | `dataStatus: None` | 改为 "0"（如是正式内容） | 否 |
| 文本字段题目数与 JSON 不对齐 | 文本5题 JSON4题 | 标记 🟡 等待上游确认 | 否 |
| answer 全相同 | 10题全 answer=[0] | 如为占位数据则标记；如是正式内容则确认素材后不改 | 否 |

### 🟡 已知需人工确认的场景

| 场景 | 示例 |
|------|------|
| 多个 record 共享同一 QSID | 如 first/second 分两个 record 存储 |
| QSID 非标准格式 | "L1"、"000001" 等 |
| 缺 second 题组 | 仅 first block 有内容 |
| 新增 QSID 无历史参考 | 无法自动判断内容是否符合单元难度 |

---

> **最后更新**: 2026-05-14
> **维护者**: 小研
> **变更记录**: 初始创建，明确「禁止修改题目集合 ID」为审校红线
