知识学习管理

内容来源:clawhub · 原始地址 · 查看安装指南

原始内容


name: knowledge-review description: 学习知识管理系统。支持知识点录入、分类存储、每日早间学习建议推送、晚间知识回顾推送、专项备考管理(含大纲和DDL追踪)、知识点查询与维护。触发方式:学了/学习了/知识点/记录一下/知识:/K:/学到了/第N条/展开/查一下/搜索/开启专项/进度/大纲等。适用于备考/持续学习场景。

Knowledge Review Skill

基本信息

  • version: 1.0
  • skill 目录: /home/ubuntu/.openclaw/workspace/skills/knowledge-review/
  • 数据目录: /home/ubuntu/.openclaw/workspace/data/

数据文件

所有数据以 JSON 文件存储,路径相对于 /home/ubuntu/.openclaw/workspace/

文件 路径 用途
知识点 data/knowledge-items.json 所有学习知识点的存储
专项数据 data/special-projects.json 专项备考项目(含大纲)
回顾统计 data/review-stats.json 最后推送时间、寄语去重、回顾会话历史
兜底寄语 data/fallback-greetings.json 30 条学习鼓励寄语(web_fetch 失败时降级)

数据结构

详见 Plan 文档第 4 节「数据模型」。

意图识别与指令解析

本 skill 通过关键词匹配识别用户意图。

重要规则:Agent(主模型)本身不过滤任何输入。无论用户说什么,只要包含以下触发词,即进入本 skill 的处理逻辑。由 skill 决定是否匹配或回退到普通对话。

触发词表

意图 触发词 示例
知识录入 学了, 学习了, 知识点, 记录一下, 知识:, K:, 学到了, 刚学了, 今天学了, 学了一个新知识
图片OCR:发送图片时
"学了 BGP 选路原则"
发送 PPT/截图/笔记图片 → 自动 OCR 提取知识点
删除 删除 #, 删除第, 删除第 "删除 #23"
修改 修改 #, 修改第, 修改第 "修改 #15 BGP 选路:LP 越大越优先"
展开/查看 第N条, 展开 #, 展开第, 看第, 详情 "第3条"、"展开 #8"
专项创建 开启, 创建 + 专项, 开一个 + 专项, 启动 + 专项 "开启HCIE专项"
专项关闭 关闭 + 专项, 结束 + 专项 "关闭HCIE专项"
专项进度 进度, 进展 "HCIE进度"、"专项进度"
主副专项 设.*为主, 设.*为副, 设.*为主.*副, 切换主专项 "设HCIE为主专项,AI为副专项"
DDL 修改 延期, DDL改为, 截止改为, DDL改成 "HCIE延期到9月1号"
目标修改 目标改为, 目标改成 "HCIE目标改为100点"
大纲查看 大纲 (不含补充、不含查看大纲时的专项名) "HCIE大纲"
大纲补充 大纲补充: "HCIE大纲补充: BGP进阶, MPLS TE"
查询 查一下, 搜索, 查找, 查找一下, 搜一下, 查询 "查一下 BGP"
没有/没学 没有, 没学 (在追问的上下文中)
快问快答答案 答案, 答对, 错了, 第X题错了 查看答案或反馈结果

操作指令详解

A. 知识录入

A.0 图片 OCR 知识录入(新增)

当用户发送图片(飞书消息中带有图片附件)时,按以下流程处理:

  1. 下载图片:从飞书消息中提取图片 URL,使用 exec 命令 curl -o /tmp/ocr_input.png "<图片URL>" 下载
  2. 预处理:使用 ImageMagick 提高识别准确率
    convert /tmp/ocr_input.png -colorspace Gray -deskew 40% -threshold 55% /tmp/ocr_prepped.png
    
  3. OCR 识别
    tesseract /tmp/ocr_prepped.png /tmp/ocr_output -l chi_sim+eng --psm 6 2>&1 && cat /tmp/ocr_output.txt
    
    参数说明:
    • -l chi_sim+eng:中文简体 + 英文混合识别
    • --psm 6:假设文字为均匀排列的块(适合 PPT 截屏/笔记)
  4. 解析知识点
    • 将 OCR 识别结果按行或标号拆分
    • 识别出以数字序号(1. / ① / - / ·)开头的行作为独立知识点
    • 每一条知识点的后续处理同 A.3-A.6(分类、关联、存储)
  5. 反馈
    • 识别成功 → 逐条确认:从图片中识别到 N 个知识点: + 列表
    • 用户可回复 全部录入 一键存储,也可 去掉第X条 排除
    • OCR 置信度低 → 提示 识别结果可能不够准确,请检查: + 文本
  6. 清理
    rm -f /tmp/ocr_input.png /tmp/ocr_prepped.png /tmp/ocr_output.txt
    

边界条件

  • 图片下载失败 → 提示"图片下载失败,请重新发送"
  • OCR 识别为空 → 提示"未能从图片中识别到文字,请手动输入知识点"
  • 多张图片同时发送 → 逐张处理,合并结果

A.1 触发与提取

  1. 检测输入是否包含触发词(见上表)
  2. 提取知识点正文:取触发词之后的全部内容
    • 例如 "学了 BGP 选路原则:AS-Path 越短越优先" → 正文为 "BGP 选路原则:AS-Path 越短越优先"
    • 例如 "知识: 等保2.0的五个等级" → 正文为 "等保2.0的五个等级"
  3. 去除首尾空白字符

A.2 边界处理

场景 处理
正文长度 < 10 字符 提示"知识点太短了(少于10个字),是否补充更多内容?"
正文长度 > 500 字符 截断到 500 字符,并提示"知识点较长,已截断到 500 字"
内容仅包含触发词无后续内容 提示"请告诉我具体学了什么"

A.3 分类匹配

  1. 读取 references/classify-rules.md 中的分类映射表
  2. 对知识点正文进行关键词全量匹配
  3. 优先级:网络安全 > 网络 > 云计算 > AI > 其他
  4. 若有匹配到多个分类,取优先级最高的
  5. 无法匹配任何关键词 → 归为"其他"
  6. 尝试推断子分类(见 classify-rules.md 中的子分类规则)

匹配方法:对正文逐个测试分类关键词的包含关系。关键词大小写不敏感(英文关键词统一小写匹配)。

匹配示例

正文: "BGP 选路原则:AS-Path 越短越优先"
→ 匹配 "BGP"(网络-路由协议)→ 分类: 网络, 子分类: 路由协议
→ 不匹配其他分类更高优先级的关键词 → 结果: 网络/路由协议

正文: "防火墙配置了拒绝所有入站流量"
→ 匹配 "防火墙"(网络安全)→ 分类: 网络安全
→ 虽然"防火墙"不能与网络直接竞争(网络安全优先级更高)

正文: "Docker 的网络模式包括 bridge、host、none"
→ 匹配 "Docker"(云计算-容器技术)→ 分类: 云计算, 子分类: 容器技术
→ 匹配 "网络"(网络)→ 但云计算优先级高于网络 → 结果: 云计算/容器技术

A.4 专项自动关联

  1. 读取 special-projects.json 获取所有活跃专项(status=active)
  2. 对每个活跃专项,检查其大纲模块关键词是否出现在知识点正文中
  3. 若匹配,则:
    • 将知识点的 special_project 设为该专项的 ID
    • 更新该专项的 total_learned +1
    • 更新匹配模块的 learned +1
    • 更新该专项的 outline 中对应模块的计数

关联示例

知识点: "MPLS VPN 跨域方案 Option A/B/C"
活跃专项: HCIE(大纲含 "MPLS VPN" 模块)
→ 关联到 HCIE 专项
→ HCIE.total_learned +1
→ MPLS VPN 模块.learned +1

A.5 ID 生成

  1. 读取 knowledge-items.json,取所有条目中的最大 id
  2. 新条目 ID = 最大 ID + 1
  3. 若知识点列表为空,ID 从 1 开始

A.6 重复检测

  1. 对知识点正文进行简单编辑距离比较(或关键词重叠判断)
  2. 若存在内容相似度 > 70% 的已有知识点(非 deleted),提示"⚠️ 发现疑似重复知识点:#N 内容类似,确认仍要录入吗?"
  3. 用户确认后继续录入,取消则不录入

简化重复检测方法:提取正文中的前 2-3 个关键名词,查找是否有包含相同关键词组的知识点即可(不需复杂 NLP)。

A.7 存储与确认

数据结构(追加到 knowledge-items.json):

{
  "id": 23,
  "content": "BGP 选路原则:AS-Path 越短越优先",
  "category": "网络",
  "sub_category": "路由协议",
  "tags": ["BGP", "HCIE"],
  "special_project": "hcie",
  "created_at": "2026-05-30T09:00:00+08:00",
  "last_reviewed_at": null,
  "review_count": 0,
  "deleted": false,
  "edit_history": []
}

确认输出格式

✅ 已记录 #23
📂 网络 - 路由协议
🏷️ BGP, HCIE
📅 2026-05-30

要点

  • created_at 取当前北京时间(UTC+8),格式 ISO 8601
  • last_reviewed_at 初始为 null
  • review_count 初始为 0
  • deleted 初始为 false
  • edit_history 初始为空数组
  • tags 初始空数组,但从内容和关联专项中提取关键词作为 tag

B. 知识维护

B.1 删除知识点

  1. 从输入中提取 ID 号:删除 #N删除第N条 → 提取 N
  2. 读取 knowledge-items.json,查找 id=N 且 deleted=false 的条目
  3. 若未找到 → 返回 ❌ 找不到 #N,请确认编号是否正确
  4. 若找到 → 展示知识点内容,请求确认:
    确认要删除 #N 吗?
    🔹 #N 内容: BGP 选路原则:AS-Path 越短越优先
    回复"确认"或"是"继续,回复其他取消
    
  5. 用户确认后,将 deleted 设为 true,保留 created_at 等元数据
  6. 若知识点有关联专项,更新专项的 total_learned -1 和大纲模块 learned -1(不低于 0)
  7. 返回确认:✅ 已删除 #N

B.2 修改知识点

  1. 从输入中提取 ID 号和新内容:
    • 修改 #N 新内容 → ID=N, 新内容=之后全部
    • 修改第N条 新内容 → 同上
  2. 读取 knowledge-items.json,查找 id=N 且 deleted=false 的条目
  3. 若未找到 → 返回 ❌ 找不到 #N
  4. 若找到 → 执行修改:
    • 将旧 content 推入 edit_history 数组
    • 更新 content 为新值
    • 重新匹配分类(调用 A.3 分类匹配逻辑)
    • 更新 category, sub_category, tags
    • 更新 last_reviewed_at 为当前时间
  5. 如果新内容提到"不对"或内容大幅变化 → 重新关联专项(调用 A.4)
  6. 返回确认:
    ✅ #N 已更新
    📂 网络 - 路由协议(原: 其他)
    📝 旧: xxx
    📝 新: xxx
    

B.3 展开复习(详细回顾)

  1. 从输入中提取 ID 号:第N条展开 #N看第N条
  2. 查找 id=N 且 deleted=false 的条目
  3. 未找到 → ❌ 找不到 #N
  4. 找到后:

输出

🔹 #N 知识标题
   完整内容: ...
   
   📂 分类: 网络 - 路由协议
   🏷️ 标签: BGP, HCIE
   📅 录入时间: 2026-05-30
   👀 回顾次数: 2
   🕐 最近回顾: 3天前

   🔗 相关知识点(同分类):
   - #12 网络边界防护策略
   - #31 BGP 路由反射器
   - #45 OSPF LSA 类型
  1. 关联推荐
    • 查找同分类(category 相同)的其他非删除知识点,最多 3 条
    • 排除当前知识点自己
    • 若同分类不足 3 条,从同专项(special_project 相同)补充
    • last_reviewed_at 最久优先排序(越久越需要复习)
    • 输出 "暂无相关知识点" 如果没有任何关联

C. 每日推送

C.1 早间推送 9:00 — 今日学习建议

触发:cron 定时任务(周一至周五 9:00 北京时间)

流程

  1. 读取 review-stats.json,更新 last_morning_review 为当前时间
  2. 读取 special-projects.json 获取活跃专项
  3. 读取 knowledge-items.json 获取近期学习统计
  4. 获取寄语(调用 F. 寄语获取)
  5. 根据是否有专项选择输出模板

输出模板 A — 有专项时

🌅 早安!今日学习建议 · 2026-05-30

🏁 专项: <name>(<role>)
├── 已学: <total_learned>/<total_target> (<percent>%)
├── 剩余: <remaining> 点
├── DDL: <ddl>(剩 <days_left> 天)
├── 日需: ~<daily_needed> 个/天
└── <urgency_emoji> <urgency_text>

📖 今日建议学习方向:
1. <module1>(大纲第 x 章)
2. <module2>(大纲第 x 章)

(大纲推荐:优先推荐未开始的模块,其次是学习中未完成的模块)

如有紧迫提醒(DDL<30天且进度<60%):

🔴 紧迫提醒:<name> DDL 仅剩 <days_left> 天,还有 <remaining> 个知识点未学!
⚠️ 每日需学 <daily_needed> 个知识点,建议翻倍!

放入输出最顶部(紧迫 > 问题 > 大纲推荐 > 寄语)。

紧迫判断(详见 special-project-spec.md 第 2 节):

  • 🔴:DDL<30天 且 进度<60%
  • 🟡:DDL<60天 且 进度<40%
  • 🟢:其他

多个活跃专项:取主专项输出,副专项仅展示一行:

🏁 主专项: HCIE 备考 — 23/80 (29%) 🟢
🎯 副专项: AI 深度学习 — 5/50 (10%) 🟢

输出模板 B — 无专项时

🌅 早安!· 2026-05-30
📊 最近 7 天学习了 <count_7d> 个知识点,保持节奏!
📖 今天想学什么方向?网络 / 安全 / 云计算 / AI 任你挑。

最近 7 天学习统计:统计 knowledge-items.jsoncreated_at 在最近 7 天内的条目数(非删除)。

寄语 置于末尾:💬 <寄语内容>

大纲为空时的降级:如果专项有 outline 但为空数组或所有模块已完成,则推荐句子改为:

📖 今日建议:复习已学知识点,巩固记忆!

C.2 晚间推送 17:30 — 回顾 + 追问

触发:cron 定时任务(周一至周五 17:30 北京时间)

流程

  1. 读取 review-stats.json,更新 last_afternoon_review 为当前时间
  2. 读取 knowledge-items.json 获取所有 deleted=false 的知识点
  3. 按权重策略抽样 5 条
  4. 获取寄语(调用 F. 寄语获取)
  5. 更新选中知识点的 last_reviewed_atreview_count
  6. 存储本次会话到 review_sessions
  7. 输出

抽样策略(详见 special-project-spec.md 第 1.3 节):

知识点总数 < 5 时:有多少推多少,不执行权重抽样

有主+副专项:
  55% 主专项 → 3 条(从 special_project=主专项ID 中抽样)
  15% 副专项 → 1 条(从 special_project=副专项ID 中抽样)
  30% 常规 → 1 条(从无专项关联或关联已关闭的知识点中抽样)

仅主专项(无副):
  70% 主专项 → 4 条
  30% 常规 → 1 条

无专项:
  100% 常规 → 5 条(从全部知识点按 last_reviewed_at 最久优先)

抽样内部方法

  1. 从对应类别中,按 last_reviewed_at 升序排序(越久未回顾越优先)
  2. 取前 N 条
  3. 若某类别知识点不足,差额从其他类别补充
  4. 将最终选取的 5 条打乱顺序输出(随机排列)

全部回顾过处理(专项池或全库知识点在 48 小时内全部被回顾过):

  • 放宽间隔阈值:允许 2 天内(48 小时)已回顾过的知识点重新入选
  • 若仍不足所需数量,从全部知识点中随机填充

输出

📚 知识回顾 · 2026-05-30 傍晚

🔹 #12 BGP 选路:AS-Path 越短越优先
   📂 网络 · 🏷️ HCIE · 5天前

🔹 #8 等保 2.0 基本要求
   📂 网络安全 · 12天前

...

❓ 今天学了哪些新知识点?
📝 回复新知识点即可记录;回复「第X条」展开复习

每条显示格式:

🔹 #<id> <content_前40字...>
   📂 <category> · 🏷️ <tags_逗号> · <距离上次回顾的天数>天前
  • last_reviewed_at 为 null → 显示"新"
  • 若超过 30 天 → 显示"很久以前"

寄语 置于追问之后:💬 <寄语内容>

追问应答规则

用户回复 处理
知识点内容 调用知识录入(A. 知识录入),录入后确认
"没有" / "没学" 回复"明天加油!"
"第X条" / 数字 调用展开复习(B.3)
其他内容 正常对话
不回复 不追问,下次正常推送

C.3 review-sessions 记录

每次推送后追加一条回话记录到 review-stats.jsonreview_sessions 数组:

{
  "time": "2026-05-30T17:30:00+08:00",
  "type": "afternoon",
  "item_ids": [12, 8, 5, 23, 15],
  "greeting": "学习从来无捷径,循序渐进登高峰。"
}

E. 快问快答(隔日)

E.1 触发

定时触发:通过 cron 每隔一天的 9:00 触发(与早间学习建议错开,隔日轮换)。

编排方式:早间学习建议每天 9:00 触发,快问快答与学习建议交替执行——

  • 第 1 天 9:00 → 学习建议
  • 第 2 天 9:00 → 快问快答
  • 第 3 天 9:00 → 学习建议
  • 以此类推

实现判断

  1. 读取 review-stats.json 中的 last_quiz_date 字段
  2. 如果 last_quiz_date 为 null(从未答过)→ 当前推送快问快答,设置 last_quiz_date 为今天
  3. 如果 last_quiz_date 不是昨天(距今天 >= 2 天)→ 推送快问快答,更新 last_quiz_date
  4. 如果 last_quiz_date 是昨天 → 推送学习建议,不更新 last_quiz_date

Cron 配置:统一用每天 9:00 的 cron,由 skill 逻辑判断当天是学习建议还是快问快答。

E.2 权重与题量

总题数 = 5
专项相关 = ceil(5 * 0.7) = 4 题(若无活跃专项则全部均摊)
其他分类 = 5 - 专项数

题型混合:填空 2 题 + 选择 2 题 + 判断 1 题

E.3 命题方法

基于 knowledge-items.json 中的知识点自动生成题目:

A. 填空题(2 题)

  1. 选取知识点正文
  2. 识别正文中的关键名词/数字/术语(优先级:专有名词 > 数字 > 缩写 > 其他术语)
  3. 将关键词替换为 ____
  4. 保留原语义明确(用户能根据上下文推断答案)

示例:

知识点: "BGP 选路原则:AS-Path 越短越优先"
→ 填空: "BGP 选路中,AS-Path 越____越优先"
   答案: 短

知识点: "CAPWAP 协议在 AP 与 AC 之间建立隧道,实现对 AP 的控制和业务配置"
→ 填空: "____ 协议在 AP 与 AC 之间建立隧道"
   答案: CAPWAP

B. 选择题(2 题)

  1. 选取知识点中的核心概念
  2. 正确答案 = 知识点原文的正确描述
  3. 构造 3 个干扰项(从同分类其他知识点中提取关键词混淆组合)

示例:

知识点: "FAT AP 独立配置管理,无需 AC;FIT AP 依赖 AC 进行配置管理"

Q: 关于 FAT AP 和 FIT AP,正确的是?
A. FAT AP 需要 AC 才能工作
B. FIT AP 独立配置无需 AC
C. FAT AP 独立配置,无需 AC  ← 正确答案
D. FAT AP 和 FIT AP 都需要 AC

C. 判断题(1 题)

  1. 选取知识点中的一个关键断言
  2. 50% 概率原样输出(答案为正确)
  3. 50% 概率反转关键词(答案为错误)

示例:

知识点: "VAP 是单个物理 AP 虚拟出的多个虚拟 AP"
→ 判断题: "VAP 是单个物理 AP 虚拟出的多个虚拟 AP" → ✅ 正确

反转后:  "VAP 是多个物理 AP 合并为一个虚拟 AP" → ❌ 错误

命题原则

  • 答案必须能从知识点原文中明确推导
  • 不造假概念,判断题反转时替换关键词而非整句意思
  • 优先选取近 7 天未在回顾中出现过的知识点

E.4 输出格式

⚡ 快问快答 · 2026-06-01

📝 填空题
1. AP 与 AC 之间通过____协议建立隧道
2. WLAN 中,ESS 由多个使用相同____的 BSS 构成

📋 选择题
3. AP 获取 AC 地址的方式不包括?
   A. DHCP option 43
   B. 广播方式
   C. DNS 解析
   D. 静态配置

4. 关于 VLAN POOL,正确的是?
   A. VLAN POOL 不支持 Hash 分配
   B. 同一 SSID 下用户只能获取同一 VLAN
   C. VLAN POOL 关联到 VAP-Profile
   D. VLAN POOL 只能包含一个 VLAN

✅❌ 判断题
5. FIT AP 不需要 AC 即可独立完成配置管理

---
📝 回复「答案」查看正确答案
🏷️ 专项: HCIE(4题) | 常规(1题)
💬 <寄语>

E.5 答案反馈

用户回复「答案」时,推送:

⚡ 快问快答 · 答案

1. CAPWAP — 答对了吗?
2. SSID — 答对了吗?

3. C — DNS 解析(AP 获取 AC 地址的方式包括 DHCP option 43、广播、静态配置,不包括 DNS)
4. C — VLAN POOL 关联到 VAP-Profile

5. ❌ 错误 — FIT AP(瘦 AP)依赖 AC 进行配置管理,FAT AP 才可独立工作

---
📊 你答对了几题?
💪 答错的知识点已标记,明天早间回顾会优先复习~

标记机制

  • 用户不需要报告分数,由 skill 假设用户诚实标记
  • 可补充 答对3题第1题错了 等反馈,系统将对应知识点 last_reviewed_at 置为更早的日期(提高回顾优先级)

E.6 边界处理

场景 处理
知识点 < 5 条时 有多少出多少题,提示「知识库还在成长,题目较少」
零知识点 推送「知识库还是空的,先记录一些知识点吧!」
专项知识不足 4 条 从常规知识补充
用户不回复答案 不追问,下次正常推送
题目生成失败(内容太短) 跳过该知识点,从备选池取下一个

E.7 TODO 实现标记

开发时需确认以下事项并移除本标记:

  • review-stats.json 中添加 last_quiz_date 字段
  • 实现命题逻辑(填空/选择/判断)
  • 实现答案反馈与标记机制
  • 早间 cron 逻辑改为判断 last_quiz_date 决定推送类型

F. 专项管理

F.1 创建专项

  1. 从输入中提取专项名称、DDL、目标数、大纲(可选)
  2. 名称提取:开启<名称>专项开启<名称>,取开启后、专项前的字符串
  3. DDL 提取:匹配 DDL, 截止, , 后接日期格式(8月15号, 2026-08-15, 8月15日
  4. 目标数提取:匹配 目标, , 等关键词提取数字
  5. 大纲提取:匹配 大纲:, 模块:, 后接逗号分隔的模块列表

名称处理

  • 去除"专项"后缀
  • 例如 "HCIE 备考" → name = "HCIE 备考"

专项 ID 生成规则(转小写英文或拼音首字母):

  • 若名称为纯英文或包含英文:取英文单词首字母小写拼接(如 "HCIE 备考" → "hcie")
  • 若名称为纯中文:取中文拼音首字母
  • 确保不与现有 ID 冲突,冲突则加数字后缀

冲突处理

场景 处理
已有同名活跃专项 提示已存在,询问是否要重新激活
已有主专项,新专项也设为主 询问:替换旧主专项为新主(旧降为副),或设新专项为副
已有副专项,新专项也设为副 提示最多1个副专项,询问是否替换

创建确认输出

🏁 已创建专项: <name>(<role>)
📋 目标: <target> 点
⏰ DDL: <ddl>
📝 是否要补充学习大纲?(如:BGP/MPLS/IPv6/安全等模块)
   回复「大纲: xxx, xxx」即可添加

F.2 主副专项管理

切换主专项

  1. 匹配 切换主专项为<名称>设<名称>为主专项
  2. 检查新主专项是否存在且活跃
  3. 若存在:
    • 旧主专项 role 改为 secondary(若有副专项,旧副改为 secondary 然后新主替代)
    • 新专项 role 改为 primary
  4. 若不存在:提示 未找到<名称>专项

设副专项

  1. 匹配 设<名称>为副专项
  2. 检查该专项是否存在且活跃
  3. 若已有副专项:
    • 询问是否替换
    • 替换:旧副 role 改为 active(无角色,仍活跃但不参与权重),新设的改为 secondary
  4. 设置后返回确认

权重更新:角色变更后,自动按 special-project-spec.md 1.3 节更新抽取权重。

F.3 查看进度

单项进度

用户: HCIE进度
→ 匹配提取专项名称 "HCIE"

🏁 HCIE 备考 · 主专项
📊 进度: 23/80 (29%)
📅 DDL: 2026-08-15(剩 77 天)
⚡ 日需: ~1 个/天
<urgency_emoji> <urgency_text>
📋 大纲: 4 个模块,3 个进行中
  1. ✅ BGP(3/10)
  2. 🕐 MPLS VPN(2/8)
  3. 🕐 IPv6(0/5)
  4. ⬜ SDN(0/0)

全局进度

用户: 专项进度

🏁 主专项: HCIE 备考 — 23/80 (29%) 🟢
🎯 副专项: AI 深度学习 — 5/50 (10%) 🟢
(若某个不存在则不展示该行)

F.4 大纲管理

补充大纲

  1. 匹配 HCIE大纲补充: BGP进阶, MPLS TE
  2. 提取专项名称("HCIE")和模块列表("BGP进阶", "MPLS TE")
  3. 找到对应专项,追加模块到 outlinetarget=0, learned=0
  4. 返回确认:
    ✅ 已补充 HCIE 大纲,新增 2 个模块:
    - BGP进阶
    - MPLS TE
    

查看大纲

  1. 匹配 HCIE大纲(不含"补充"关键词)
  2. 提取专项名称 "HCIE"
  3. 找到后输出模块列表(含各模块进度)

F.5 DDL 修改

  1. 匹配 HCIE延期到9月1号HCIEDDL改为9月1号
  2. 提取专项名称、新日期
  3. 格式统一为 YYYY-MM-DD
  4. 更新后重新计算紧迫等级
  5. 返回确认

F.6 关闭专项

  1. 匹配 关闭HCIE专项HCIE专项结束
  2. 找到该专项,设 status=closed, closed_at=当前时间
  3. 若该专项是主专项,自动检查是否有副专项:
    • 有副专项 → 副专项升级为主专项
    • 无其他专项 → 恢复无专项状态
  4. 确认输出:
    ✅ HCIE 备考 已关闭。
    (若有升级)🎯 AI 深度学习 已自动升级为主专项。
    

F.7 目标修改

  1. 匹配 HCIE目标改为100点HCIE目标改成100
  2. 提取专项名称、新目标数
  3. 更新 total_target,不重置 total_learned
  4. 返回确认

G. 查询

  1. 匹配 查一下 <关键词>搜索 <关键词>查找 <关键词>
  2. 提取查询关键词(取触发词后的全部内容,去除首尾空格)
  3. knowledge-items.json 中搜索 deleted=false 的条目,匹配以下字段:
    • content 包含关键词
    • category 包含关键词
    • tags 中任一 tag 包含关键词
  4. 返回最多 10 条,按 ID 升序排序
  5. 无结果 → 🔍 未找到包含 "<关键词>" 的知识点
  6. 有结果 → 输出:
    📋 "<关键词>" 相关知识点 (共 N 条)
    #12 BGP 选路:AS-Path 越短越优先  📂 网络 · 🏷️ HCIE
    #23 MPLS LDP                 📂 网络
    #31 BGP 路由反射器            📂 网络 · 🏷️ HCIE
    ...
    
    每条一行,格式:#<id> <content前20字...> 📂 <category> · 🏷️ <tags>

H. 寄语获取

调用时机:每次早间/晚间推送前调用。

获取流程

  1. 使用 web_fetch 搜索学习名言:

    • URL:https://www.baidu.com/s?wd=学习励志名言
    • https://www.google.com/search?q=学习励志名言
    • 提取页面中 1-2 句名言
    • 优先提取 <blockquote>, 引号内的句子
  2. 也可尝试其他 API:

    web_fetch https://v1.hitokoto.cn/?c=d  # 一言 API(可能返回励志句子)
    
  3. review-stats.jsonused_greeting_keywords 数组去重:

    • 检查新寄语是否包含数组中任一关键字
    • 关键字取寄语的前 4 个字符(如 "不积跬步"、"温故知新")
    • 若匹配到已用关键字,跳过该寄语,尝试获取下一条
  4. 降级策略(web_fetch 失败/超时/无结果时):

    • 读取 fallback-greetings.json 中的所有寄语
    • 找出未被 used_greeting_keywords 覆盖的寄语
    • 从未用寄语中取一条(按 id 顺序取最早的)
    • 若所有寄语都已用过,清空 used_greeting_keywords 重新轮转
  5. 去重维护

    • 选中寄语后,将其前 4 个字符添加到 used_greeting_keywords
    • 若数组长度 > 30,移除最早的(FIFO 淘汰)

超时处理:web_fetch 等待不超过 3 秒,超时直接降级到本地兜底。

最后一步:将寄语文本返回给推送模块,嵌入推送消息中。


样例对话流程

场景 1: 日常知识点录入

用户: 学了 BGP 选路原则:AS-Path 越短越优先

Agent(技能处理):
  → 提取正文: "BGP 选路原则:AS-Path 越短越优先"
  → 分类匹配: 网络-路由协议(匹配"BGP""路由")
  → 专项关联: 检查活跃专项 → 关联到 HCIE(大纲含 BGP 模块)
  → 存储(ID=23, category=网络, sub_category=路由协议, special_project=hcie)
  → 输出:

✅ 已记录 #23
📂 网络 - 路由协议
🏷️ BGP, HCIE
📅 2026-05-30

场景 2: 修改知识点

用户: 修改 #15 OSPF 的 LSA 类型有 1/2/3/4/5/7

Agent:
  → 提取 ID=15, 新内容="OSPF 的 LSA 类型有 1/2/3/4/5/7"
  → 查找 #15 → 找到
  → 更新 content,旧内容入 edit_history
  → 重新分类:匹配"OSPF" → 网络-路由协议
  → 确认输出

✅ #15 已更新
📂 网络 - 路由协议(原: 网络)
📝 旧: OSPF 介绍
📝 新: OSPF 的 LSA 类型有 1/2/3/4/5/7

场景 3: 创建专项

用户: 开启HCIE专项,DDL 8月15号,目标80点,大纲: BGP, MPLS VPN, IPv6, SDN

Agent:
  → 提取: name="HCIE 备考", ddl="2026-08-15", target=80, outline=[BGP, MPLS VPN, IPv6, SDN]
  → 专项 ID = "hcie"
  → 设为 primary role
  → 创建确认

🏁 已创建专项: HCIE 备考(主专项)
📋 目标: 80 点
⏰ DDL: 2026-08-15
📋 大纲模块: 4 个
  - BGP, MPLS VPN, IPv6, SDN

场景 4: 查看进度

用户: HCIE进度

Agent:
  → 查找 HCIE 专项
  → 计算进度: 23/80=28.75%
  → DDL 剩余: 77 天
  → 紧迫判断: 🟢 节奏正常
  → 输出:

🏁 HCIE 备考 · 主专项
📊 进度: 23/80 (29%)
📅 DDL: 2026-08-15(剩 77 天)
⚡ 日需: ~1 个/天
🟢 节奏正常
📋 大纲: 4 个模块,3 个进行中
  1. ✅ BGP(3/10)
  2. 🕐 MPLS VPN(2/8)
  3. 🕐 IPv6(0/5)
  4. ⬜ SDN(0/0)

场景 5: 查询

用户: 查一下 BGP

Agent:
  → 搜索 content/tags 包含 BGP 的知识点
  → 找到 3 条(#12, #23, #31)
  → 输出:

📋 "BGP" 相关知识点 (共 3 条)
#12 BGP 选路:AS-Path 越短 📂 网络 · 🏷️ BGP, HCIE
#23 MPLS LDP 标签分发    📂 网络 · 🏷️ MPLS, HCIE
#31 BGP 路由反射器规则    📂 网络 · 🏷️ BGP, HCIE

场景 6: 早间推送示例(有专项)

🌅 早安!今日学习建议 · 2026-05-30

🏁 专项: HCIE 备考(主)
├── 已学: 23/80 (29%)
├── 剩余: 57 点
├── DDL: 2026-08-15(剩 77 天)
├── 日需: ~1 个/天
└── 🟢 节奏正常

📖 今日建议学习方向:
1. BGP 路由策略与正则表达式(大纲第 1 章)
2. MPLS VPN 跨域方案(大纲第 2 章)

💬 不积跬步,无以至千里;不积小流,无以成江海。

场景 7: 晚间推送示例

📚 知识回顾 · 2026-05-30 傍晚

🔹 #12 BGP 选路:AS-Path 越短越优先
   📂 网络 · 🏷️ HCIE · 5天前

🔹 #8 等保 2.0 基本要求
   📂 网络安全 · 12天前

🔹 #5 Docker 网络模式
   📂 云计算 · 8天前

🔹 #23 MPLS LDP 标签分发
   📂 网络 · 🏷️ HCIE · 3天前

🔹 #15 Prompt Engineering 技巧
   📂 AI · 15天前

❓ 今天学了哪些新知识点?
📝 回复新知识点即可记录;回复「第X条」展开复习

💬 学习从来无捷径,循序渐进登高峰。

边界情况处理汇总

# 场景 处理方式
1 零知识点时推送 推送鼓励消息,展示"暂无知识点,快开始学习吧!"
2 知识点总数 < 5 条 晚间回顾有多少推多少,不做严格权重抽样
3 专项大纲为空 早间推送降级为"复习已学知识点"
4 知识点正文 < 10 字 提示太短,询问是否补充
5 知识点正文 > 500 字 截断到 500 字符并提示
6 无法分类 归为"其他"并提示可手动修改
7 疑似重复知识点 提醒但允许用户确认后存储
8 web_fetch 获取寄语失败 降级使用 fallback-greetings.json
9 cron 重启丢失 读取持久化的 review-stats.json 恢复状态
10 修改不存在的 ID 提示"找不到 #N"
11 删除后不在回顾中展示 除法和查询时过滤 deleted=true
12 专项知识点不足权重所需 差额补其他类别
13 所有寄语已用一遍 清空去重池重新轮转
14 单个用户消息含多个知识点 只取第一个触发词后的内容,提醒"一次记一个知识点更高效"

Cron 定时任务配置

在 OpenClaw 中配置两条 cron job:

1. 早间推送(每天 9:00 北京时间)

调度:每天 9:00 触发 逻辑:skill 读取 review-stats.jsonlast_quiz_date 字段,自动判断:

  • 如果 last_quiz_date 为 null 或 last_quiz_date 不是昨天 → 触发 E. 快问快答,并更新 last_quiz_date 为今天
  • 如果 last_quiz_date 是昨天 → 触发 C.1 早间学习建议

2. 晚间回顾推送(周一至周五 17:30 北京时间)

# schedule: "30 17 * * 1-5"
# timezone: "Asia/Shanghai"
# command: 发送此消息到技能频道或飞书用户
# "知识回顾:晚间回顾"

触发后,Agent 应当:

  1. 识别这是定时推送
  2. 进入 C.2 晚间推送流程
  3. 执行抽样+回顾+追问+寄语获取+输出
  4. 推送完毕后更新 review-stats.json

自动恢复机制

如果 cron 重启导致错过推送时间:

  1. 读取 review-stats.jsonlast_morning_reviewlast_afternoon_review
  2. 若上次推送距今超过 26 小时(即错过了一个完整工作日),在下次飞书交互时主动执行一次推送
  3. 优先补推送早间(早晚间冲突时早间优先)

质量检查清单

  • 所有 JSON 文件格式正确(修改后 json.load() 验证)
  • 所有时间使用北京时间(UTC+8),ISO 8601 格式
  • 知识点 ID 从 1 自增,无重复
  • 分类规则覆盖全部四类(网络/网络安全/云计算/AI)
  • 专项关联自动更新 total_learned 和大纲 learned
  • 权重抽样逻辑正确处理不足情况
  • deleted 知识点从不出现在回顾/查询/展开结果中
  • 寄语获取有降级保障
  • DDL 紧迫判断公式正确
  • 主/副专项互斥:最多 1 主 + 1 副