KaichenCurry

ielts-speaking

雅思口语AI教学助手。核心理念:无标准答案,逐句个性化反馈(语法/词汇/时态/逻辑/思路)。

KaichenCurry 1 Updated 1mo ago

Resources

9
GitHub

Install

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分布 + 常见错误 + 下周建议