知識圖譜記憶·教育版

👤 我心似明月 📦 v1.0.1 ⭐ 4.6 ⬇️ 284 下載
📚 知識管理 免費

📖 技能介紹


name: knowledge-graph-memory description: 中文教育場景專用的型別化知識圖譜記憶技能。內建 Poem/Student/KnowledgePoint 教育型別,把詩庫、知識點、學生進度建成可查詢、可校驗的關係圖(帶型別的實體+關係+約束),跨會話、跨技能共享結構化狀態。觸發場景:(1) 使用者說「記住…」「我已知曉 X 什麼」「記一下…」,(2) 需要把兩類物件關聯(詩↔知識點、學生↔進度、人↔專案),(3) 從知識點反查詩、按作者/年級/卷冊聚合,(4) 做多步規劃想建模依賴,(5) 技能之間需要共享狀態。觸發詞示例:「建個知識圖譜」「把 X 關聯到 Y」「從知識點反查」「知識點圖譜」「結構化記憶」「關係圖」「實體關係」。特別適用於古詩詞/文言文/課文學習類應用(如已上線小程式「詩裡行間拾遺」的詩庫-知識點-學生互聯),以及任何需要結構化知識沉澱的中文專案。 version: 1.0.1 display_name: "知識圖譜記憶·教育版" agent_created: true


知識圖譜記憶 · 教育版(Knowledge Graph Memory)

把記憶從「一堆 markdown」升級成「一張可驗證的圖」。內建中文教育型別(詩/知識點/學生),已在已上線的小程式「詩裡行間拾遺」真實詩庫實測。

核心概念

一切都是實體(Entity):有型別(type)屬性(properties)、與其他實體的關係(relations)。每次變更都先按型別約束校驗,再落庫。

Entity:   { id, type, properties, relations, created, updated }
Relation: { relation_type, to_id, properties }

何時用(觸發判定)

使用者說 / 場景 動作
「記住…」「記一下…」「我已知曉 X 是什麼」 建立 / 更新實體
「把 X 關聯到 Y」「X 屬於 Y」 建立關係
「從知識點反查詩」「按作者 / 卷冊 / 學段聚合」 圖查詢
「顯示專案 Z 的所有任務」「X 依賴什麼」 圖遍歷 / 依賴查詢
「多步規劃」「建複習計劃」「排任務」 建模為圖變換
「技能間共享狀態」「把進度給另一個技能」 讀寫 ontology 物件

觸發詞清單(命中即啟用本技能)

以下任一關鍵詞出現時,優先走知識圖譜而非平鋪 markdown: 知識圖譜 / 關係圖 / 實體關係 / 結構化記憶 / 把 X 關聯到 Y / 從知識點反查 / 知識點網路 / 建個圖 / 關係建模 / 跨連結查詢

不適用場景(不要用本技能)

場景 改用
一次性臨時筆記、純流水記錄 普通 markdown / Note 檔案
簡單鍵值配置(如 settings) 配置檔案(yaml/json)
需要 ACID 事務、強一致併發寫的生產庫 直接上 SQLite / 資料庫
非結構化長文寫作(文章、報告) 文件工具

經驗法則:當"反查 / 聚合 / 關聯"成為核心需求,且資料會跨會話複用,才上圖譜;否則輕量儲存更合適。

內建型別(可擴充套件)

# 通用
Person:   { name, email?, phone?, notes? }
Project:  { name, status, goals[], owner? }
Task:     { title, status, due?, priority?, assignee?, blockers[] }
Document: { title, path?, url?, summary? }
Note:     { content, tags[], refs[] }

# 教育場景(詩裡行間拾遺可直接用)
Poem:           { title, author, dynasty, grade, content?, mastery? }
Student:        { name, grade_level, progress? }
KnowledgePoint: { topic, related_poems[], difficulty? }

# 元
Action: { type, target, timestamp, outcome? }

儲存

  • 預設:memory/ontology/graph.jsonl追加寫,絕不覆蓋
  • 可選約束:memory/ontology/schema.yaml

每行一條事件,圖的最終狀態 = 重放全部事件:

{"op":"create","entity":{"id":"poem_001","type":"Poem","properties":{"title":"靜夜思","author":"李白","grade":"小學"}}}
{"op":"relate","from":"poem_001","relation_type":"teaches","to":"kp_001"}

工作流

初始化

mkdir -p memory/ontology && touch memory/ontology/graph.jsonl

建立實體

python3 scripts/ontology.py create --type Poem --props '{"title":"靜夜思","author":"李白","grade":"一年級上冊"}'
# ↑ 返回形如 "created poe_1783704926535 (Poem)",poe_xxx 就是該實體的動態 id

查詢 / 取單個 / 取關聯

⚠️ <實體id>create 返回的動態值(如 poe_1783704926535),不要硬編碼 poem_001——會報 "entity not found"。完整排錯見下方「排錯速查表」。

python3 scripts/ontology.py query  --type Task --where '{"status":"open"}'
python3 scripts/ontology.py get    --id <實體id>
python3 scripts/ontology.py related --id <實體id> --rel has_task

關聯實體

# id 用 create 返回的即時值;不確定時先 query 拿到 id
python3 scripts/ontology.py relate --from <詩id,如 poe_1783704926535> --rel teaches --to <知識點id,如 kno_1783704926695>

校驗約束

python3 scripts/ontology.py validate

備份 / 還原 / 匯出

# 備份當前圖(自動帶時間戳,存 memory/ontology/backup/)
python3 scripts/ontology.py backup

# 從某個備份還原(還原前會自動再備份一次當前狀態作為安全網,不會丟資料)
python3 scripts/ontology.py restore --file memory/ontology/backup/graph.20260711_010800.jsonl

# 匯出整圖為單個 JSON 檔案(便於遷移到別的機器 / 人工檢視 / 分享)
python3 scripts/ontology.py export --out memory/ontology/export.json

# 規模監控:實體數 / 關係數 / 事件行 / 損壞行 / 檔案體積 / 遷移建議
python3 scripts/ontology.py stats

# 自動修復損壞日誌:備份後丟棄無法解析的行並重寫乾淨的事件日誌
python3 scripts/ontology.py repair

圖譜損壞或誤操作後:restore 即可回到任意歷史備份;restore 前會自動把"當前(可能已壞)狀態"再存一份,所以永遠不會徹底丟失。若 graph.jsonl 被意外寫入半行/亂碼,先 repair(會自動備份並清理損壞行),再 validate 確認。日常用 stats 監控規模,臨近萬級時規劃遷移 SQLite。

約束(schema.yaml 示例)

types:
  Task:
    required: [title, status]
    status_enum: [open, in_progress, blocked, done]
relations:
  teaches:
    from_types: [Poem]
    to_types: [KnowledgePoint]

不寫 schema 也能跑(只做基礎校驗:型別存在、id 唯一);寫了則按 required / 列舉 / 關係方向校驗。

多步規劃即圖變換

Plan: 「給《靜夜思》建知識點並排複習任務」
1. CREATE KnowledgePoint { topic:"思鄉", related_poems:["靜夜思"] }
2. RELATE Poem(靜夜思) -> teaches -> KnowledgePoint
3. CREATE Task { title:"複習思鄉主題", assignee:學生, status:open }

每一步變更前先校驗約束,違反即回滾該步。

跨技能共享

  • 默寫技能寫「學生掌握度」→ 進度技能讀取後生成複習計劃
  • 一切共享狀態走 ontology,避免各技能各寫各的散檔案、互相讀不懂

完整案例:從零搭建「詩裡行間拾遺」詩-知識點圖

下面是把已上線小程式「詩裡行間拾遺」的真實詩庫(小學/初中/高中三套 JS 資料)匯入圖譜的完整流程,已在本地實測跑通。

目標:每首詩 → 一個 Poem 實體;每首詩自帶 tags(如「思鄉」「詠物」「田園」)→ 一個 KnowledgePoint 實體;建 Poem -teaches-> KnowledgePoint 關係。最終得到「從知識點反查詩」的能力。

第一步:初始化

mkdir -p memory/ontology && touch memory/ontology/graph.jsonl

第二步:用 Node 把詩庫批次灌進圖(詩庫是 data/*.js 匯出的陣列,每條含 id/title/author/dynasty/stage/grade/text/tags

// build_ontology.js —— 用 ontology.py 的 create/relate 把資料轉成事件日誌
const fs = require('fs');
const { execFileSync } = require('child_process');
const PY = 'python3';
const ONTO = 'scripts/ontology.py';

function run(args){
  return execFileSync(PY, [ONTO, ...args]).toString().trim();
}

const files = ['data/primary.js','data/middle.js','data/high.js'];
const kpCache = {}; // topic -> kp_id

for (const f of files){
  const poems = require('./'+f);
  for (const p of poems){
    const pid = run(['create','--type','Poem','--props',
      JSON.stringify({title:p.title, author:p.author, dynasty:p.dynasty||'', grade:p.grade||'', content:p.text||''})]);
    for (const tag of (p.tags||[])){
      let kid;
      if (kpCache[tag]) { kid = kpCache[tag]; }
      else {
        kid = run(['create','--type','KnowledgePoint','--props', JSON.stringify({topic:tag})]);
        kpCache[tag] = kid;
      }
      run(['relate','--from',pid,'--rel','teaches','--to',kid]);
    }
  }
}
console.log('done');

第三步:查詢驗證

# 反查「思鄉」主題下有哪些詩(平鋪 markdown 做不到的跨連結能力)
python3 scripts/ontology.py query --type KnowledgePoint --where '{"topic":"思鄉"}'

# 按作者聚合
python3 scripts/ontology.py query --type Poem --where '{"author":"李白"}'

# 按卷冊/學段篩選(資料層 grade 存原始值,如「一年級上冊」)
python3 scripts/ontology.py query --type Poem --where '{"grade":"一年級上冊"}'

# 校驗整圖
python3 scripts/ontology.py validate

實測結果:234 首詩 / 44 個知識點 / 468 條關係,全部校驗通過;「思鄉」主題反查出 11 首詩(靜夜思、九月九日憶山東兄弟、泊船瓜洲……);按卷冊 一年級上冊 篩出 6 首。

合規展示對映(重要):「詩裡行間拾遺」為個人主體小程式,按平臺合規要求 UI 層不顯示學段引導字眼。小程式 utils/poem-data.js 在展示時對映:學段 primary/middle/high → 基礎篇/進階篇/提高篇,X年級 → 第X卷(如 一年級上冊第一卷上冊)。圖譜資料層保留原始 grade(如"一年級上冊"),查詢按原始值;對外展示時再對映,二者不衝突——這也是圖譜作為"底層結構化狀態"與"上層展示"解耦的好處。

聯合擴充套件:把文言文子包一起匯入,做跨文體反查(進階)

小蔥技能站7w4.net,專業的AI技能分享平臺。

「詩裡行間拾遺」還有獨立的文言文子包(subpackages/wenyan/data/wenyan_data.js,86 篇,欄位與詩庫同構,含 type:'wenyan'tags、合規對映後的 grade 如「第七捲上冊」)。把它和詩庫匯入同一張圖,價值立刻翻倍:

  • 詩 → Poem 實體 / 文言 → ClassicalText 實體,兩類文本共享同一批 KnowledgePoint(按 tag 去重)
  • 每個知識點加 poem_count / wenyan_count / cross_genre 欄位;cross_genre=true = 詩和文言都覆蓋的主題(如「寫景」「詠物」「愛國」),這是平鋪 markdown 做不到的跨文體聚合

批次灌庫(資料量大時直接拼 jsonl,比逐條 CLI 快):

// build_combined.js —— 詩 + 文言 聯合匯入
// ⚠️ 知識點 id 必須用完整 hex,不可截斷!
// 中文短 hash(hex8)會碰撞:如「樂府/樂府詩/樂天知命」都生成 kp_e4b990e5 被錯誤合併
const kpId = (t) => "kp_" + Buffer.from(t, "utf8").toString("hex");
for (const p of [...poems]) { /* Poem + tagged_with -> kp */ }
for (const w of wenyan)     { /* ClassicalText + tagged_with -> kp */ }

跨文體反查演示(demo_query.py 讀 graph.jsonl):

【1】跨文體主題(詩與文言共同覆蓋,共 9 個)
  · 寫景    詩 46 篇 / 文言文  7 篇
  · 詠物    詩 18 篇 / 文言文  1 篇
  · 田園    詩 18 篇 / 文言文  1 篇
  · 愛國    詩 14 篇 / 文言文  2 篇
  · 哲理    詩  7 篇 / 文言文  3 篇
  · 勸學    詩  1 篇 / 文言文  4 篇
  …(神話 / 諷喻 / 敘事詩)

【2】主題「寫景」一次反查 53 篇(詩 46 + 文言 7):
  [詩]   春曉、小池、登鸛雀樓、望廬山瀑布、江雪……
  [文言] 答謝中書書、記承天寺夜遊、小石潭記、
         岳陽樓記、醉翁亭記、赤壁賦、登泰山記

【3】作者「蘇軾」跨文體聚合(詩 12 + 文言 4):
  [詩]   飲湖上初晴後雨(三年級上冊)…水調歌頭·明月幾時有(九年級上冊)
  [文言] 記承天寺夜遊(第八捲上冊)、赤壁賦(必修上冊)、
         書戴嵩畫牛、石鐘山記

注意【3】裡詩用原始 grade(三年級上冊)、文言用合規對映值(第八捲上冊)——正好印證上一節"資料層 vs 展示層"解耦。

聯合實測:詩 234 + 文言文 86 = 320 文本實體,知識點 345 個(含 9 個跨文體),關係 945 條,validate 全部通過(共 665 實體)。完整指令碼見 examples/build_combined.jsexamples/demo_query.py(隨技能提供,可直接跑)。

第四步:備份(釋出前必做)

python3 scripts/ontology.py backup

最佳實踐

  • 追加寫,不覆蓋:保留歷史、可回放、可審計
  • 不存金鑰:Credential 只存 service + secret_ref 間接引用,絕不寫明文 token
  • 型別少而精,關係命名清晰(teaches / has_task / blocks)
  • 圖規模變大時遷移到 SQLite

排錯速查表(快速定位)

現象 原因 解決
entity xxx not found(明明建過) id 是動態生成的(如 poe_1717939200123_8842),不是你傳入的名字 create 列印的真實 id;或 query --where '{"title":"..."}' 反查
relate 報 not found --from/--to 用了靜態佔位 poem_001 改為 create 返回值;不確定先 query 拿 id
validateN malformed line(s) skipped 日誌裡混入了半行/亂碼 repair(自動備份+清理),再 validate
高吞吐下實體"神秘消失" 舊版 id 同毫秒同類型會碰撞(已修復) v1.0.1+ 用 毫秒_隨機 字尾,天然唯一;升級後重跑即可
多程序同時寫偶發丟事件 當前為追加寫,高頻併發不保證原子 單寫者模型,或遷移 SQLite(見下)
圖越用越慢 實體量級接近萬級 stats 檢視;超 2 萬建議遷 SQLite

所有寫入均加檔案鎖 + fsync 刷盤;id 帶隨機字尾杜絕碰撞;repair 可自愈損壞日誌——這是 v1.0.1 可靠性升級的核心。

效能基準(實測)

本地實測(Python 3.13 / Windows,零依賴 CLI):

操作 實測表現
create 單次 CLI 呼叫 ~119 ms / 次(瓶頸是 Python 直譯器冷啟動,非磁碟寫入)
query / validate / stats(20,000 實體) < 0.3 s(0.23–0.28 s)
20,000 實體檔案體積 ~3.8 MB(jsonl)
  • 讀操作極快:20k 實體下 query/validate/stats 全部亞秒級,規模越大僅線性微增;詩裡行間拾遺實測 665 實體的圖查詢是毫秒級。
  • 寫入要注意批次姿勢:逐條調 CLI 會因 Python 冷啟動累積到 ~120ms/條,大批次灌庫(>1k)請直接追加 jsonl 事件行,而不是迴圈 spawn CLI(參考 examples/build_combined.js,它直接拼 jsonl 檔案,234 首詩 + 86 文言文僅秒級完成)。小規模(幾十~幾百)逐條 CLI 完全無感。
  • 遷移時機:jsonl 在 萬級實體以內 流暢;超過 2 萬 建議規劃遷移 SQLite(按相同 schema 建 entities/relations 兩表,CLI 介面可保持不變,stats 會給出遷移建議)。
  • 併發模型:每個 CLI 呼叫是獨立程序,寫入經檔案鎖序列化 + fsync 刷盤,短時併發安全;高頻併發寫請採用「單寫者」模式(一個 agent 負責寫,其餘只讀),或遷 SQLite 帶鎖。程序崩潰不會留半行(事件寫完才返回)。
  • id 唯一性:v1.0.1 起 id = 型別字首_毫秒_隨機,實測 5000 條同毫秒連建 零重複(舊版曾因同毫秒同類型碰撞丟資料,已根治)。
  • 自愈:日誌混入半行/亂碼時,repair 會自動備份並丟棄損壞行、重寫乾淨日誌,validate 可隨時體檢。

常見問題(FAQ)

Q:圖譜檔案損壞或被覆蓋了,怎麼辦? A:用 python3 scripts/ontology.py restore --file <備份路徑> 還原。還原前會自動再備份一次當前狀態,所以不會二次丟失。如果從未手動備份,至少 backup 目錄裡應有初始化後的空狀態;日常養成操作前先 backup 的習慣即可。

Q:建立實體時報 entity xxx not found,但明明建過? A:id 是動態生成的(如 poe_1717939200123),不是你傳入的名字。建完會列印真實 id,請複製它用於 relate/related/get。用 --props 裡的 title/namequery --where 反查更穩妥。

Q:想用的型別(如 Lesson)不在內建列表裡,能加嗎? A:能。直接在 create --type Lesson 用即可,SKILL.md 的型別只是約定示例,不做硬限制。若要強制校驗必填欄位,在 schema.yamltypes: 下加 Lesson: { required: [title] }

Q:資料量很大(上萬實體),還用 jsonl 嗎? A:jsonl 適合中小規模(千級~萬級),好處是可回放、可審計。兩點提醒:① create 單次 CLI 呼叫約 119ms(瓶頸是 Python 冷啟動),所以大批次灌庫請直接追加 jsonl 事件行,不要迴圈 spawn CLI——參考 examples/build_combined.js;② 規模再大(>2 萬)建議遷移到 SQLite(按同樣 schema 建 entities / relations 兩表),CLI 介面可保持不變,stats 會給出遷移建議。讀操作(query/validate)即便 2 萬實體也亞秒級。

Q:日誌檔案損壞 / 混入半行亂碼,怎麼辦? A:先 python3 scripts/ontology.py repair——它會自動備份當前圖,丟棄無法解析的行並重寫乾淨的事件日誌;再 validate 確認。日常用 backup 養成習慣,出錯隨時 restore(還原前還會再備份一次,永不丟資料)。

Q:多 agent / 多程序同時寫會衝突嗎? A:v1.0.1 寫入經檔案鎖序列化 + fsync 刷盤,短時併發安全(不會位元組交錯、不會留半行)。高頻併發寫仍建議:① 單寫者模型(一個 agent 負責寫,其餘只讀);② 或遷移到帶鎖的 SQLite。

Q:這個技能和通用版 ontology 有什麼不同? A:概念同源(受 ClawHub @oswalpalash 啟發、獨立重寫),差異在:① 內建 Poem/Student/KnowledgePoint 中文教育型別;② 自帶 backup/restore/export 容錯命令;③ 提供「詩裡行間拾遺」真實詩庫的完整落地案例。通用 ontology 是平臺已有的中性版本,本技能是教育場景專精版。

來源

受 ClawHub 熱門技能 ontology(@oswalpalash)啟發,獨立重寫實現。已去除 OpenClaw 平臺依賴、對齊 WorkBuddy 記憶體系,並補充中文教育場景(詩裡行間拾遺)型別。原作概念版權歸 @oswalpalash 所有。

🤖 AI 評測

這個技能質量不錯,文件寫得非常詳細,連觸發詞和適用場景都列得很清楚,真實案例「詩裡行間拾遺」也證明了它確實能用在實際專案中。它內建了詩詞、學生、知識點等教育相關的型別,用起來很方便。缺點是它只能通過命令列操作,沒有更簡單的介面或介面;另外它用 JSONL 儲存資料,資料量大時可能會變慢。總體來說,這是一個實用、有真實需求背景的工具包,適合教育類應用使用。

📊 多維度評分

適應性4.8
規範性4.4
有效性4.5
可靠性4.4
可信度5

📁 包含檔案 (4 個)

📄 SKILL.md 18.8 KB
📄 examples/build_combined.js 3.6 KB
📄 examples/demo_query.py 2.9 KB
📄 scripts/ontology.py 13.9 KB