Resources
9Install
npx skillscat add kaichencurry/ielts-speaking-ai Install via the SkillsCat registry.
SKILL.md
雅思口语AI教学系统
题库:最新模考题库2026(66套,Test 1-66)
DB:bba82871-4fe1-4409-9f70-72f6bf27e7b3
核心理念:无标准答案。基于学生实际答案,逐句个性化反馈(语法/词汇/时态/逻辑/思路)
一、完整工作流(含所有环节)
标准答题流程(Part1 → Part2 → Part3 全自动递进)
开始
│
▼
老师发 /题目
│
├── Part1题目列表(5题)
├── Part2题卡(1题)
└── Part3题目列表(5题)
│
▼
Bot解析所有题目 + 锁定状态(IDLE → PART1)
│
▼
┌─────────────────────────────────────────────┐
│ PART 1(5题循环) │
│ │
│ Bot发题: │
│ Q1: Have you ever lost something? │
│ │ │
│ ▼ │
│ 等待学生语音(无时间限制) │
│ │ │
│ ▼ │
│ < 3秒 ──▶ Bot:"录音太短,请重新回答" │
│ │ │
│ ▼ │
│ Whisper转文字 │
│ │ │
│ ▼ │
│ │ │
│ ▼ │
│ MiniMax逐句评分暂存 并提示同学进行下一个问题的答题 │
│ │ │
│ ──▶ Q2: What do you usually lose? │
│ ──▶ Q3: How do you keep track of things? │
│ ──▶ Q4: Do you have a system for items? │
│ ──▶ Q5: What is the most valuable thing? │
│ │(每题重复以上流程) │
│ │Q5完成 │
└─────────┼───────────────────────────────────┘
│
▼
Bot自动切换 PART1 → PART2
Bot:"Part 1完成!进入Part 2"
│
▼
┌─────────────────────────────────────────────┐
│ PART 2(1题) │
│ │
│ Bot发题卡: │
│ "Describe a time you lost something" │
│ • what you lost │
│ • where you lost it │
│ • how you felt │
│ • if you found it │
│ │
│ Bot:"准备好了请发语音(1-2分钟)" │
│ │ │
│ ▼ │
│ 等待学生语音(无时间限制) │
│ │ │
│ ▼ │
│ Whisper → RAG → MiniMax评分暂存 │
└─────────┼───────────────────────────────────┘
│
▼
Bot自动切换 PART2 → PART3
Bot:"Part 2完成!进入Part 3"
│
▼
┌─────────────────────────────────────────────┐
│ PART 3(5题循环) │
│ │
│ Bot发题: │
│ Q1: Is losing things a modern problem? │
│ │ │
│ ▼ │
│ 等待学生语音(无时间限制) │
│ │ │
│ ▼ │
│ < 3秒 ──▶ Bot:"录音太短,请重新回答" │
│ │ │
│ ▼ │
│ Whisper→ MiniMax评分暂存 │
│ │ │
│ ──▶ Q2: Can technology prevent losing? │
│ ──▶ Q3: Should we own less? │
│ ──▶ Q4: Is minimalism a good idea? │
│ ──▶ Q5: Do children need organization? │
│ │(每题重复以上流程) │
│ │Q5完成 │
└─────────┼───────────────────────────────────┘
│
▼
Bot自动切换 PART3 → DONE
│
▼
Bot汇总所有评分
│
├──▶ 群内发简洁评分卡
│ ┌─────────────────────┐
│ │ 📊 本次评分总览 │
│ │ Part1 均分: 6.5 │
│ │ Part2 得分: 7.0 │
│ │ Part3 均分: 6.0 │
│ │ 综合 Band: 6.5 │
│ └─────────────────────┘
│
└──▶ Notion存详细逐句分析
│
▼
老师可发 /纠正 [内容]
│
└──▶ 更新Notion + 存入Bad Case库二、五大环节详解
2.1 RAG 检索增强生成
什么时候用RAG?
| 时机 | 检索内容 | 用途 |
|---|---|---|
| 布置题目时 | 该话题历史错题 | 给老师参考,提醒学生易错点 |
| 答题过程中(每题) | 同类话题常见错误模式 | 增强评分上下文(静默,不输出) |
| 全部答完后汇总时 | Part 2发现的问题 + Part 3关联 | 生成综合评分总览 |
| 老师纠正时 | 该学生在该话题的历史表现 | 判断是否重复犯错 |
RAG数据来源(现有数据)
RAG知识库 = Notion现有数据(无需额外采集)
│
├── Bad Case错题本(3412e55d-7136-8113-aa98-cfd36af9799c)
│ └── 错误类型 + 学生答案 + 老师纠正
│
├── 作业反馈库(3412e55d-7136-8179-9ac8-ee60a420ac21)
│ └── 学生答题原文 + AI评分 + Band
│
└── 题库(bba82871-4fe1-4409-9f70-72f6bf27e7b3)
└── 题目分类 + 话题标签RAG实现方式(轻量版)
# 不需要向量数据库,用关键词检索实现简单RAG
def rag_retrieve(query: str, top_k: int = 3) -> list:
"""
简单RAG:从Notion作业反馈库检索相似回答
query: 话题关键词,如"社交媒体"
"""
results = []
# 1. 从错题本检索同类话题错误模式
badcases = notion_query_badcases(topic=query, limit=top_k)
results.extend([
f"【历史错题】{bc['错误类型']}: {bc['学生错误答案'][:100]}"
for bc in badcases
])
# 2. 从作业反馈库检索同类话题学生回答
homeworks = notion_query_homeworks(topic=query, limit=top_k)
results.extend([
f"【同类回答】Band {hw['综合BandScore']}: {hw['逐句反馈分析'][:150]}..."
for hw in homeworks
])
return results为什么不用向量数据库?
| 方案 | 适合场景 | 你的系统 |
|---|---|---|
| Pinecone/Chroma | 大量非结构化文档检索 | 数据量还不够大(<1000条) |
| 关键词检索 | 结构化数据 + 固定字段 | ✅ 你的Notion数据已结构化 |
| 混合方案 | 以后数据量大时升级 | 预留升级空间 |
结论:当前用关键词检索足够。等错题本积累到500+条时再考虑升级向量数据库。
2.2 微调 Fine-tuning
什么时候需要微调?
信号(出现任意一个就考虑):
/纠正频率高:每周>10条- 同一错误重复出现:比如"语法错误总是漏掉"
- AI输出格式不稳定:评分模板总是不统一
- Band系统性偏差:总是偏高或偏低0.5+
当前状态:数据不足,需要先积累
微调数据从哪里来?
微调数据 = 老师的每一次纠正(/纠正)
│
└── 每一条/纠正 = 1条高质量标注数据
数据积累管道:
学生答题 → AI评分 → 老师纠正 → 错题本 → 微调数据池
↑
关键!这不是凭空生成的
是专家人工审核过的"正确答案"数据格式
// 微调样本(从/纠正数据中提取)
{
"messages": [
{
"role": "system",
"content": "你是一个雅思口语个性化反馈助手。..."
},
{
"role": "user",
"content": "学生回答:I think it's really interesting because my teacher told me about it."
},
{
"role": "assistant",
"content": "【逐句反馈】\n\n句子1:...\n 语法:❌ ...\n 词汇:⚠️ ...\n ..."
}
]
}数据标准
| 检查项 | 要求 |
|---|---|
| 数据量 | ≥100条(当前不足,先积累) |
| 来源 | 必须来自老师/纠正,不能纯AI生成 |
| 覆盖 | 5个维度都要有(语法/词汇/时态/逻辑/思路) |
| 分布 | 不同Band分数段都要有(4.5-8分) |
| 质量 | 老师确认过的评分结果 |
微调触发条件
当前错题本数量:X条(需要≥100条)
│
▼
评估准确率:
• Band误差 > 0.5 持续3周?
• 某维度准确率 < 70% 持续2周?
│
├─ 是 → 准备微调
│
└─ 否 → 继续积累数据2.3 提示词设计与迭代
当前Prompt结构
System Prompt(固定)
│
├── 角色定义:你是一个雅思口语个性化反馈助手
├── 5个维度定义(语法/词汇/时态/逻辑/思路)
├── 逐句分析原则
├── Band计算规则(Part1×30% + (Part2×40%+Part3×60%)×70%)
└── 禁忌(不对照标准答案,只看学生说的)
User Prompt(动态)
│
├── 学生转写文本
├── RAG检索结果(历史错题/同类回答)
└── 具体问题(如果有)迭代日志
## Prompt迭代记录
### V2 (2026-04-13)
**问题**:维度名称不统一,有时写"词汇"有时写"LR"
**修改**:统一为5维度中文名称
**验证**:输出格式一致性从78%→98%
### V1 (2026-04-11)
**问题**:Band Score系统性偏高0.5分
**修改**:增加校准规则——有明显错误必须扣分
**验证**:误差从0.5→0.2迭代流程
发现Bad Case
│
▼
判断是"格式问题"还是"内容问题"
│
├─ 格式问题 → 优化System Prompt(1天内见效)
│
└─ 内容问题 → 分析根因
│
├─ 知识不足 → RAG增强
└─ 能力不足 → 积累微调数据2.4 Agent Workflow 架构
状态机设计
from enum import Enum
class Stage(Enum):
IDLE = "idle" # 等待布置题目
AWAITING_PART2 = "awaiting_part2" # 等待Part 2录音
AWAITING_PART3 = "awaiting_part3" # 等待Part 3录音
DONE = "done" # 完成
class SessionState:
student_id: str
test_num: int
topic: str
category: str
stage: Stage = Stage.IDLE
# 答题内容
part2_text: str = ""
part3_text: str = ""
part2_band: float = 0.0
part3_band: float = 0.0
overall_band: float = 0.0
# 上下文(RAG用)
rag_context: list = []状态流转图
┌─────────────┐
│ IDLE │ ← 等待老师布置题目
└──────┬──────┘
│
老师发送 /题目 Test XX
│
▼
┌─────────────────┐
│ AWAITING_PART1 │
└────────┬────────┘
│
学生发送语音(Part 1,每题)
│
Whisper → RAG检索 → 评分(暂存)
│
▼
┌─────────────────┐
│ AWAITING_PART2 │
└────────┬────────┘
│
学生发送语音(Part 2)
│
Whisper → RAG检索 → 评分(暂存)
│
▼
┌─────────────────┐
│ AWAITING_PART3 │
└────────┬────────┘
│
学生发送语音(Part 3,每题)
│
Whisper → RAG检索 → 综合评分(暂存)
│
▼
┌──────────┐
│ DONE │ → 写Notion → 发群里 → IDLE
└──────────┘
═══════════════════════════════════════
【老师纠正路径】
┌─────────────────────┐
│ 任意状态都可接收 │
└──────────┬──────────┘
│
解析纠正 → 写入错题本
│
▼
回复老师确认
(不改变主流程状态)为什么不需要复杂框架?
| 你的场景 | 框架需求 |
|---|---|
| 固定流程 | Part 1→Part 2→Part 3三段式 |
| 状态简单 | IDLE/Part1/Part2/Part3/Done |
| 无分支逻辑 | 顺序执行即可 |
| 多渠道复用 | 状态机统一处理 |
结论:Python字典或简单类就能实现状态管理,不需要LangGraph/AutoGen等框架。
2.5 模型效果评测体系
核心指标
| 指标 | 计算方式 | 目标 | 数据来源 |
|---|---|---|---|
| Band误差 | AI Band - 老师纠正后Band的绝对值 | ≤0.3 | /纠正数据 |
| 维度准确率 | AI标记的错误被老师确认的比例 | ≥85% | /纠正数据 |
| 错题命中率 | AI识别的错误中真正存在的比例 | ≥80% | /纠正数据 |
| 格式正确率 | 评分输出符合格式要求的比例 | ≥98% | 自动检测 |
评估触发机制
每周五 18:00 自动触发评估
│
▼
抽样本周10条作业
│
▼
对比AI评分 vs 老师纠正(如果有)
│
▼
计算各项指标
│
▼
┌─────────────────────────────────────────┐
│ 结果: │
│ • Band平均误差:X.X(目标≤0.3) │
│ • 语法准确率:XX%(目标≥85%) │
│ • 词汇准确率:XX%(目标≥85%) │
│ • 时态准确率:XX%(目标≥85%) │
│ • 逻辑准确率:XX%(目标≥85%) │
│ • 思路准确率:XX%(目标≥85%) │
└─────────────────────────────────────────┘
│
▼
如果超标 → 发预警给老师评完之后怎么迭代?
评估结果触发迭代判断:
Band误差 > 0.5?
│
├─ 是 → 分析原因
│ ├─ 格式问题 → 优化Prompt
│ └─ 能力问题 → 准备微调数据
│
└─ 否 → 继续监控
某维度准确率 < 70%?
│
├─ 是 → 针对该维度增强RAG/优化Prompt
│
└─ 否 → 继续监控
错题本积累 ≥ 100条 且 有系统性偏差?
│
└─ 是 → 启动微调三、Notion数据表结构
3.1 题库(bba82871-4fe1-4409-9f70-72f6bf27e7b3)
题库字段:只有5个
| 字段 | 类型 | 说明 |
|---|---|---|
| 编号 | number | Test编号(自动递增) |
| 题目 | title | 完整题目名称 |
| 类型 | multi_select | 人物类/事件类/物品类/地点类 |
| 难度 | select | 基础/中等/进阶 |
| 练习状态 | select | 新增待练习/已练习/未练习 |
页面正文格式:
- Part 1: heading_2 + heading_3(topic) + bulleted_list_item(最多5题/topic)
- Part 2: heading_1 + paragraph(topic) + paragraph(You should say:) + bulleted_list_item(points)
- Part 3: heading_2 + numbered_list_item(最多5题)
题目数量限制:
- Part 1: 每个Topic最多5题,1-3个Topics
- Part 3: 最多5题
3.2 Bad Case错题本(3412e55d-7136-8113-aa98-cfd36af9799c)
位置:雅思口语教材-赵 下面
字段:只有 Name (title)
内容:全部写入页面正文,包含:
- 📋 基本信息(学生ID、原始题目、时间)
- 🏷️ 错误类型(语法/词汇/时态/逻辑/思路)
- ❌ 学生错误答案
- 🤖 AI原评判
- ✅ 老师正确纠正
- 📊 最终Band Score
3.3 作业反馈库(3412e55d-7136-8179-9ac8-ee60a420ac21)
位置:雅思口语教材-赵 下面
字段:只有 Name (title)
内容:全部写入页面正文,包含:
- 📋 基本信息(学生昵称、题目编号、快捷ID、类别、时间)
- 📝 Part 1/2/3 答案原文
- 📊 Band Score(各部分及综合)
- 💡 逐句反馈分析
四、脚本清单
4.1 核心脚本
| 脚本 | 用途 | 调用时机 |
|---|---|---|
notion_search.py |
搜索Notion题库 | 收到/题目时 |
notion_append_homework.py |
写入作业反馈 | Part3评分完成后 |
notion_append_badcase.py |
写入错题本 | 收到/纠正时 |
rag_retrieve.py |
RAG检索 | 评分时增强上下文 |
evaluate_weekly.py |
每周评估 | 每周五18:00自动 |
prepare_ft_data.py |
微调数据准备 | 错题本≥100条后 |
create_homework_db.py |
创建作业反馈库 | 初始化时 |
4.2 周报脚本
| 脚本 | 用途 | 触发 |
|---|---|---|
weekly_report.py |
查询学生周报 | 手动 |
weekly_report_dispatch.py |
发送详细周报到群 | 每周五18:00 |
4.3 题库管理脚本
| 脚本 | 用途 | 说明 |
|---|---|---|
topic_updater.py |
自动更新题库 | 每周三、六自动运行 |
| 导入格式 | 最新模考题库2026 | 必须符合以下字段 |
最新模考题库2026 字段格式
数据库字段(只有5个):
编号 | number | 自动递增
题目 | title | 如"社交媒体趣事 | Test 67"
类型 | multi_select | 人物类/事件类/物品类/地点类
难度 | select | 基础/中等/进阶
练习状态 | select | 新增待练习/已练习/未练习页面正文格式(由topic_updater.py自动生成):
## Part 1
### Topic: [话题名]
• 问题1 (最多5题/topic)
## Part 2
[英文话题描述]
You should say:
• point 1
## Part 3
1. 追问1 (最多5题)⚠️ 题目数量限制:Part 1每Topic最多5题,Part 3最多5题
五、群报告格式
📊 个性化反馈报告 | {学生昵称}
🏷️ 题目:{快捷ID} | {英文题目}
📂 类别:{类别}
═══════════════════════════════════════
📝 Part 1 逐句反馈
═══════════════════════════════════════
• Part 1 均分:{Part1均分}
(每题答案原文 + 逐句分析)
═══════════════════════════════════════
📝 Part 2 逐句反馈
═══════════════════════════════════════
• 答案原文:
{原文}
{逐句分析:每句话的语法/词汇/时态/逻辑/思路}
═══════════════════════════════════════
📝 Part 3 逐句反馈
═══════════════════════════════════════
• Part 3 均分:{Part3均分}
(每题答案原文 + 逐句分析)
═══════════════════════════════════════
🏆 综合 Band Score
═══════════════════════════════════════
Band Score:{综合X.X} / 9.0
(计算方式:Part1×30% + (Part2×40%+Part3×60%)×70%)
💪 下次最需突破:
• [维度]:[具体改进建议]六、文件结构
ielts-speaking/
├── SKILL.md # 本文件
├── references/
│ ├── prompts.md # 评分Prompt模板
│ └── prompt_changelog.md # Prompt迭代日志
└── scripts/
├── notion_search.py # 搜索Notion题库 ✅
├── notion_append_homework.py # 写入作业反馈 ✅
├── notion_append_badcase.py # 写入错题本 ✅
├── rag_retrieve.py # RAG检索(新增)
├── evaluate_weekly.py # 每周评估(新增)
└── prepare_ft_data.py # 微调数据准备(新增)七、快速参考
| 场景 | 命令/动作 | 结果 |
|---|---|---|
| 布置作业 | /题目 Test 07 |
RAG检索 → 发送 Part1/2/3 全部题目 |
| 学生Part 1 | 发送语音 | Whisper → 评分暂存 → 追问下一题(不显示反馈) |
| 学生Part 2 | 发送语音 | Whisper → 评分暂存 → 不显示反馈 |
| 学生Part 3 | 发送语音 | Whisper → 评分暂存 → 追问下一题(不显示反馈) |
| 全部答完 | 自动触发 | 评分总览发群 + 写入Notion |
| 老师纠正 | /纠正 <内容> |
错题本收录 → 评估触发 |
| 每周评估 | 自动(周五18:00) | 抽样评估 → 发预警 |
| 每周详细周报 | 自动(周五18:00) | Band分布 + 常见错误 + 下周建议 |