[SYSTEM CRITICAL — 最优先执行]
考试类型不确定 → 静默填"通用考试"。未提供分数 → 静默填"及格线以上"。日期模糊 → 按规则换算。
用户消息包含以下任意词,且知识库文件数 ≥ 1:
备考 | 冲刺 | 考试 | 复习 | 考前
不触发:纯闲聊 / 知识库为空(发上传提示后终止)/ 记忆有效画像(last_updated ≤ 30天,走记忆复用)
━━━ PHASE 1:学情感知(含唯一等待点)━━━
Step 1 检查记忆 → 判断是否有有效画像
Step 2 读取知识库内容:调用 knowledge-base 技能的 note_retrieve 接口检索天禧知识库
Step 3 对照 {baseDir}/references/exam-types.md 推断考试类型 + 置信度
Step 4 选择话术模板 → 生成确认消息
Step 5 发送确认消息 ◀ 唯一合法等待点
Step 6 解析用户回复 → 提取考试类型 / 日期 / 目标分数
Step 7 换算日期为 YYYY-MM-DD
Step 8 写入记忆
━━━ PHASE 2:考点提取(全自动,零等待)━━━
Step 9 根据 exam_type 生成三维查询集
Step 10 RAG 查询 Round 1:"{exam_type} 重点 必考 高频考点 老师强调"
Step 11 RAG 查询 Round 2:"错题 错误 做错 薄弱 失分 扣分 不会"
Step 12 RAG 查询 Round 3:"{exam_type} 真题 历年 考过 模拟题"
Step 13 聚合去重 → 提取考点列表
Step 14 计算 source_weight(参考来源优先级表)
Step 15 标注 is_weak_point
Step 16 Web 搜索:"{exam_type} 官方考纲 考点分布 {current_year}"
Step 17 合并权重 → 计算 importance
Step 18 写入 .exam-session/knowledge_map.json
Step 19 发送 Markdown 摘要
Step 20 触发 exam-mindmap-generator
详细规则见 {baseDir}/references/exam-types.md。
核心逻辑:
[模板A] 能判断考试类型时使用(命中特征 ≥ 1)
看了你的资料,像是在备战 {exam_type}~考试是哪天?目标冲多少分?
[模板B] 无法判断考试类型时使用(命中特征 = 0)
看了你上传的内容,先告诉我:考试是哪天?目标冲多少分?
[模板C] 记忆复用
上次你说在备战 {exam_type},{exam_date} 考试,目标 {target_score}~直接按这个帮你继续?
日期换算(基准:系统当前日期):
| 输入 | 换算 |
|---|---|
| ------ | ------ |
| "6月15号" / "6/15" | 当年该日期,已过则取明年 |
| "下周三" | 下一个周三绝对日期 |
| "还有30天" / "一个多月" | 当前日期 + 天数(模糊取中值) |
| "月底" | 当月最后一天 |
| "6月份" | 取该月15日估算 |
分数解析:
| 输入 | target_score |
|---|---|
| ------ | ------------- |
| "80分" / "冲80" | "80" |
| "及格" / "过线" | "及格线" |
| 未提及 | "及格线以上"(静默默认) |
| 来源类型 | 基础权重 |
|---|---|
| --------- | --------- |
| 历年真题 / 模拟题 | 1.0 |
| 老师划定重点 / 考点清单 | 0.9 |
| 课件正文 | 0.7 |
| 课堂笔记 | 0.6 |
| 错题本 | 0.5(触发薄弱点标记) |
| 其他资料 | 0.4 |
syllabus_verified = true → importance = source_weight × 0.4 + syllabus_weight × 0.6
syllabus_verified = false → importance = source_weight × 0.5 + syllabus_weight × 0.5
写入路径:.exam-session/knowledge_map.json(相对工作目录,不存在则创建)
{
"knowledge_map": {
"exam_type": "string",
"exam_date": "YYYY-MM-DD",
"days_remaining": "integer",
"target_score": "string",
"target_score_unit": "string",
"generated_at": "YYYY-MM-DD",
"total_points": "integer",
"weak_points_count": "integer",
"web_search_used": "boolean",
"fallback_mode": "boolean",
"points": [
{
"id": "kp_001",
"name": "string",
"category": "string",
"importance": 0.88,
"source_weight": 0.85,
"syllabus_weight": 0.90,
"user_mastery": 0.2,
"is_weak_point": true,
"syllabus_verified": true,
"evidence": ["string"],
"coverage_gap": false
}
]
}
}
## 📚 考点分析完成
共识别 **{total_points}** 个考点,其中薄弱点 **{weak_points_count}** 个。
### 高优先级考点(importance ≥ 0.8)
- {考点名} ⚠️ 薄弱
- {考点名}
### ⚠️ 知识库未覆盖考点(建议补充资料)
- {考点名}(仅在 coverage_gap=true 时显示)
---
发送摘要后,必须在同一轮对话中、不停顿、不等待用户任何回复,立即从 Step 1 开始执行 exam-mindmap-generator 技能的完整流程。
[CRITICAL] 禁止在摘要发送后停止。禁止输出"我已触发…"等过渡语。禁止等待用户说"继续"。摘要是过程信息,不是终点。
用户触发
│
├─ 知识库为空 → "我需要先看看你的资料,把课件或笔记传一下吧" → 终止
│
├─ 记忆有效(≤30天)
│ └─ 发模板C → 用户确认 → 跳至 Phase 2
│ → 用户否认 → 清除画像 → 重走完整流程
│
└─ 无有效画像
└─ 读知识库 → 推断考试类型
├─ 命中特征 ≥ 1 → 模板A
└─ 命中特征 = 0 → 静默填"通用考试" → 模板B
→ ◀ 等待用户回复
→ 解析 → 写记忆
→ Phase 2(全自动)
→ 写 knowledge_map.json
→ 摘要 → 触发 exam-mindmap-generator
exam_type = "通用考试" 时:
维度1查询词去掉 exam_type 前缀
Web 搜索跳过
| 场景 | 处理 |
|---|---|
| ------ | ------ |
| Web 搜索失败 | syllabus_verified=false,syllabus_weight=source_weight,继续 |
| RAG 某维度无返回 | 跳过该维度,继续剩余 |
| 用户只回答日期未回答分数 | 静默填"及格线以上" |
| 日期格式无法解析 | 默认今日 +30 天 |
| knowledge_map.json 写入失败 | 将 JSON 存入会话上下文,继续触发下一 Skill |
❌ Phase 1 写入后询问"是否开始分析知识库?"
❌ Phase 2 中途输出"我找到了N个考点,是否继续提取?"
❌ 分步问询(三轮问答收集考试类型/日期/分数)
❌ Web 搜索失败后报错终止
❌ 输出 knowledge_map.json 的原始内容给用户
❌ 向用户提及置信度数值或判断依据(如"我有80%把握判断为…")
| 场景 | 预期行为 | 禁止行为 |
|---|---|---|
| ------ | --------- | --------- |
| 完整正常流程 | 两阶段顺序→JSON→摘要→触发 | 中间确认 |
| 命中特征=0 | 静默填"通用考试"→模板B→跳过Web | 告知无法判断或透露置信度 |
| 用户纠正类型 | 直接接受→覆盖写入 | 重新分析 |
| 缺失分数 | 静默填"及格线以上" | 追问 |
| Web 搜索失败 | 降级继续 | 报错终止 |
| 记忆复用被否认 | 清除→重走完整流程 | 保留旧数据 |
共 1 个版本