小鹅通题库批量导入
把乱序、格式各异的题目素材,整理成小鹅通题库批量导入能直接吃的 .docx。
典型输入:一份 PDF 试卷、一个 Word 题集、一张题目截图、Excel 里的题目行,或者用户直接在对话里粘一堆题。
典型输出:一份 .docx,用户拿去小鹅通后台「题库 → 批量导入」上传即可。
核心价值:格式的坑全部由脚本处理,你只需要把题目内容抽准。
一、格式速查(每次执行都必须满足)
| 规则 | 要求 |
|---|---|
| 题号 | 每道题必须有,1、(本技能默认)/1./(1) 三种之一 |
| 答案 | 每道题必须有非空 答案:xxx |
| 解析 | 可选,格式 解析:xxx,没有就整行省略 |
| 选择题选项 | 每行 A、内容,按 A→Z 顺序、不跳号;必须是手动输入的纯文本(禁用 Word 自动编号,否则导入后标号全丢) |
| 判断题答案 | 只能是 正确/错误/对/错 |
| 填空题 | 空位只能用 ();多空答案用 \| 分隔;一空多个可接受答案用 ; 分隔 |
| 不定项选择题 | 题号后紧跟 [不定项选择题] |
| 材料题 | 题号后紧跟 [材料题],材料正文另起段落,小问用 (1)(2)(3),结尾必须有独立一行 [材料题结束] |
| 禁止内容 | 导入文件内不得出现「导入说明」「格式说明」、章节标题等非题目文字 |
| 公式 | 只支持识别为图片;纯文本公式导入后仍是纯文本 |
标准例文:
1、驾驶人有下列哪种违法行为一次记6分
A、使用其他车辆行驶证
B、饮酒后驾驶机动车
C、车速超过规定时速50%以上
D、违法占用应急车道行驶
答案:D
解析:请仔细阅读交规
2、[不定项选择题]下列说法正确的有( )
A、……
B、……
答案:AB
3、国际象棋起源于英国吗?
答案:错误
4、我国古典四大名著是()()()()
答案:红楼梦|水浒传|三国演义|西游记
5、请论述全球化对国家政治产生了哪些深刻的影响?
答案:全球化使国家主权受到一定的制约;全球化对政府的治理提出了更高的要求。
6、[材料题]阅读下面材料,回答(1)—(2)题。
材料正文第一段……
(1)国际象棋起源于英国吗?
答案:错误
(2)我国古典四大名著是()()()()
答案:红楼梦|水浒传|三国演义|西游记
[材料题结束]
完整规范(含官方原文、题型判定逻辑、实测踩坑、交付自检清单)见 @references/format-spec.md。
二、工作流
Step 0 · 确认口径(只在有歧义时问)
- 范围:全部题目都要,还是只要某一科/某一章?把素材里的考点清单、公式表、答题技巧等非题目内容排除。
- 一或多个文件:用户说"一个新的文件"就出一个;跨科目时可以补一句"也可以按科目拆多个文件"。
- 缺答案怎么办:绝不编造。要么向用户确认,要么在交付说明里列出"以下 N 题缺答案"。
Step 1 · 抽取素材
python3 scripts/extract_source.py 素材.pdf --out /tmp/src.txt
python3 scripts/extract_source.py 素材.docx --out /tmp/src.txt # 兜底用,优先用 WorkBuddy 的文档读取能力
python3 scripts/extract_source.py 素材.csv --out /tmp/src.txt
- 截图/图片 → 用读图能力识别文字,识别不确定处要标记,别硬猜。
- 用户直接粘贴的文本 → 直接用。
Step 2 · 整理成中间 JSON
按 @references/question-schema.md 的结构,把素材整理成一个 JSON 文件(例如 /tmp/questions.json)。
这一步是你的活:拆题、认题型、排题号顺序、抽选项、抄答案、抄解析。
脚本负责题号前缀、选项标号、() 空位、材料题标记、答案规范化 —— 你不要自己写这些。
结构说明与 6 题型完整示例:@references/question-schema.md、@references/sample-questions.json。
Step 3 · 构建 + QA
python3 scripts/build_import.py \
--input /tmp/questions.json \
--name 我的题库 \
--outdir /tmp/xiaoe_build
看 QA 报告。有 QA 问题就回 Step 2 改 JSON,改到全绿再往下走。
产出:我的题库.blocks.json(段块清单)+ 我的题库.expect.txt(期望文本逐行清单)。
Step 4 · 出 docx
python3 scripts/build_import.py \
--input /tmp/questions.json \
--name 我的题库 \
--outdir /tmp/xiaoe_build \
--emit-docx "/Users/xxx/Desktop/我的题库(小鹅通批量导入).docx"
内部走官方本地编辑通道:create_doc → doc_batch_execute(段块逐段纯文本写入)→ save_file。
报"找不到 edsdk.py"时:先加载 workbuddy-local-office-edit 技能并确认 editor_sdk 在跑,
或用 EDSDK_PATH 环境变量指定 edsdk.py 的绝对路径。
> 保存位置按用户说的来;用户没说就放桌面。文件名建议「题库名(小鹅通批量导入).docx」。
Step 5 · 校验 + 交付
python3 scripts/verify_import.py \
--docx "/Users/xxx/Desktop/我的题库(小鹅通批量导入).docx" \
--expect /tmp/xiaoe_build/我的题库.expect.txt
必须看到 ✓ 校验通过(逐行差异 0、无自动编号段、题号连续、材料题标记成对)。不通过就回头修,别交付。
最后用 present_files 呈现 docx,并用一段话说明:
- 共多少题、各题型分布
- 源素材里哪些内容被排除了
- 有没有缺答案的题;有没有图片/公式只能以文本形式保留
- 导入路径:小鹅通后台 → 题库 → 批量导入
端到端实战记录(真实输入 → 输出 → 校验结果)见 @references/usage-examples.md。
三、已知踩坑(脚本已处理)
| 坑 | 现象 | 本技能怎么绕开 |
|---|---|---|
| markdown 吞题号 | 1. 被当成有序列表,题号从正文消失 |
默认 1、,且不走 markdown 通道,用 doc_batch_execute 段块写纯文本 |
| markdown 吞方括号 | [x](y) 被解析成链接,方括号连同内容丢失 |
正文里 [ ] 自动转 【 】;仅规定标记保留 ASCII 方括号 |
| markdown 斜体 | _、* 被当成强调标记 |
填空下划线统一转 ();不走 markdown 通道 |
| 批处理不推断末尾 | doc_batch_execute 传 idx=-1 报 failed to resolve the document tail position |
每块前先 doc_get_last_operable_pos 取 position 再显式传 idx |
| 说明文字进文档 | 模板开头的「导入说明」被当作题目内容 | 生成时只输出题目行,绝不带说明/标题 |
| Word 自动编号 | 选项用自动编号写的,导入后标号全丢 | 选项为纯文本写入,不产生 <w:numPr>(校验会检查) |
| 公式变纯文本 | 公式导入后不是公式对象 | 提前告知用户;要公式对象只能把公式做成图片嵌入 |
四、本技能包含的文件(缺任何一个都会导致运行失败)
xiaoe-question-bank-import/
├── SKILL.md # 本文件:格式速查 + 工作流
├── references/
│ ├── format-spec.md # 小鹅通导入格式完整规范(权威依据)
│ ├── question-schema.md # 中间 JSON 结构说明 + 整理纪律
│ ├── sample-questions.json # 覆盖 6 种题型的完整示例
│ └── usage-examples.md # 端到端实战示例与真实输出片段
└── scripts/
├── extract_source.py # 素材抽文本(pdf/docx/csv/txt/json)
├── build_import.py # JSON → 段块清单 + QA 报告(--emit-docx 一键出文件)
└── verify_import.py # 成品 docx 逐行校验 + 结构体检
脚本依赖:仅 Python 标准库;extract_source.py 处理 PDF 时需 pymupdf
(pip install pymupdf;不要用 cairosvg,macOS 缺 libcairo)。