From 3f2db6285067ab6840a202049b1a4521643f5b99 Mon Sep 17 00:00:00 2001 From: uncle6me-web Date: Wed, 17 Jun 2026 18:21:44 +0800 Subject: [PATCH] =?UTF-8?q?Initial=20commit:=20n8n=20=E7=89=88=20LLM=20Wik?= =?UTF-8?q?i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Karpathy 的 LLM Wiki 觀念,用 n8n + Google Docs + Google Sheets 實作。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 3 + LICENSE | 21 + README.md | 159 ++++++++ index.xlsx | Bin 0 -> 51296 bytes wiki/RAG 檢索增強生成(RAG).docx | Bin 0 -> 10036 bytes workflows/LLM_wiki.json | 614 ++++++++++++++++++++++++++++++ workflows/create_wiki_page.json | 142 +++++++ 7 files changed, 939 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.xlsx create mode 100644 wiki/RAG 檢索增強生成(RAG).docx create mode 100644 workflows/LLM_wiki.json create mode 100644 workflows/create_wiki_page.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78ec9d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +~$* +*.tmp diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c9d643e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 youlinhsieh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c56332e --- /dev/null +++ b/README.md @@ -0,0 +1,159 @@ +# n8n 版 LLM Wiki + +> Andrej Karpathy 的「LLM Wiki」概念,用 **n8n + Google Docs + Google Sheets** 重新實作的可下載版本。 +> 不需要 Obsidian、不需要向量資料庫,人人都有的 Google 工具就能玩這套「新 RAG」。 + +感謝 [Andrej Karpathy](https://github.com/karpathy) 提出這個觀念。原文(gist): + + +--- + +## 這是什麼? + +傳統 RAG 把文件丟進嵌入模型「碎紙化」存進向量庫,查詢時抽幾條碎紙給 LLM,LLM 只看得到那幾條、看不到全局。 + +Karpathy 的 **LLM Wiki** 用的是另一套思路 — **pre-compile(預編譯)**: +把所有原始資料交給 LLM,讓它像「維基百科總編輯」一樣,把內容**整理、改寫、互相連結**後寫進一個結構化的知識庫。你問問題時,它先查**目錄(index)**,再讀對應的 wiki 條目來回答 — 有全局觀,知道來龍去脈,而不是靠碎紙拼湊。 + +| | 傳統向量 RAG | LLM Wiki(本專案) | +|---|---|---| +| 入庫方式 | 切塊 → 嵌入 → 存向量 | LLM 閱讀 → 整理改寫 → 寫成 wiki 條目 | +| 找資料方式 | 向量相似度 | 查**目錄**(像人查索引) | +| 資料成長 | 無限增加(知識**倉庫**) | 結構性整理、更新而非堆疊(知識**庫**) | +| 原稿角色 | 直接被切碎 | 單一事實來源(SSOT),有爭議時回查 | +| 成本 | 嵌入便宜 | Token 燒得較兇,但整理品質高 | + +> **更新而非新增**:給它 1 萬份文件,它不會生成 1 萬篇 wiki,而是整理成一本結構化的「教科書」。內容相近就**更新**既有條目,差很多才**新增**。 + +--- + +## 為什麼用 Google Docs + Sheets? + +- **Obsidian 沒有網路版**,不一定人人習慣 — 重點是觀念,工具不重要。 +- **Google Docs** 當 wiki 條目本體,電腦手機通用、人人都有。 +- **Google Sheets** 當**目錄(index)**:結構化、乾淨、搜尋飛快,n8n 又能直接讀成 JSON。目錄裡不只篇名,還有 `keywords`、`summary`、`last_updated`,讓 AI 好找。 + +--- + +## 倉庫內容 + +``` +. +├── workflows/ +│ ├── LLM_wiki.json # 主工作流(入庫 + 查詢兩條流程) +│ └── create_wiki_page.json # 子工作流:建立 Google Doc 並移到指定資料夾 +├── index.xlsx # 目錄範本(上傳 Google Drive 後轉成 Google Sheets) +├── wiki/ +│ └── RAG 檢索增強生成(RAG).docx # 一篇 wiki 條目範例(轉成 Google Docs) +└── README.md +``` + +> ⚠️ 這是**零件包**,你需要自己組裝(接上自己的 Google 帳號與 LLM 金鑰)。 + +### 為什麼下載的是 `.xlsx` 和 `.docx`? + +這個專案產生的 wiki 原本放在 **Google Drive 的 Docs / Sheets**。為了方便在 GitHub 上發佈下載,匯出成 Office 格式(`.xlsx` / `.docx`)。 + +**👉 你下載後,要把它們上傳到自己的 Google Drive,並轉回 Google 原生格式才能被 n8n 呼叫:** + +| 下載到的檔案 | 上傳後請轉成 | 用途 | +|---|---|---| +| `index.xlsx` | **Google Sheets** | 目錄(index) | +| `wiki/*.docx` | **Google Docs** | wiki 條目(範例,可刪) | + +轉換方式(任一即可): + +- 在 Google Drive 直接用 Google Sheets / Google Docs **開啟** `.xlsx` / `.docx`,再「檔案 → 另存為 Google 試算表 / Google 文件」。 +- 或在 Drive 設定中開啟「上傳時自動轉換為 Google 文件格式」,再上傳。 + +--- + +## 目錄(index)欄位 + +`index.xlsx` 是 wiki 的目錄,AI 靠它找資料。欄位: + +| 欄位 | 說明 | +|---|---| +| `topic` | 主題名稱(也是 wiki 條目的標題) | +| `doc_id` | 對應 Google Doc 的 ID | +| `keywords` | 關鍵字,幫 AI 比對問題 | +| `summary` | 摘要,幫 AI 判斷相關性 | +| `last_updated` | 最後更新日期 | + +--- + +## 運作原理(兩條流程) + +主工作流 `LLM_wiki.json` 內含兩條獨立流程。 + +### 1️⃣ 資料入庫(寫入) + +`On form submission`(上傳 `.md` / `.txt`)→ `Extract from File` → **`AI Agent`(知識寫入助手)** + +寫入 Agent 的邏輯: + +1. **先讀目錄** `get_indexs`(鐵律:沒讀過 index 不准做任何事)。 +2. 把上傳文件拆成一個或多個主題。 +3. 逐一判斷: + - **主題已存在** → `write_wiki`(Append 到既有 Doc)+ `update_wiki`(更新該條目的 keywords / summary)。 + - **主題不存在** → `create_wiki_page`(建新 Doc,呼叫子工作流)+ `write_wiki`(寫入初始內容)+ `write_index`(在目錄新增一行)。 +4. 確認每個主題都完成最後一步(更新過 index)才回報結果。 + +### 2️⃣ 資料查詢(讀取) + +`When chat message received` → **`AI Agent1`(知識查詢助手)** + +查詢 Agent 的邏輯: + +1. `get_indexs` 讀目錄,瀏覽所有 keywords / summary。 +2. 判斷哪個(些)`doc_id` 與問題最相關。 +3. `read_wiki` 讀取對應 Doc 全文。 +4. 根據讀到的內容回答(只讀不寫;目錄裡找不到就老實說「Wiki 尚未收錄此主題」)。 + +### 子工作流 `create_wiki_page.json` + +因為 Google Docs 節點**無法直接在指定資料夾建立文件**,所以拆成子工作流:用 Webhook 觸發 → `Create a document` → `Move file`(移到指定 wiki 資料夾)→ 回傳 `doc_id`。主工作流用 HTTP Request 節點呼叫它。 + +--- + +## 安裝與設定 + +### 需求 + +- 一個可用的 **n8n** 實例(自架或雲端)。 +- **Google 帳號**(Docs / Sheets / Drive 權限)。 +- 一個 **LLM**。本專案範例用 **Google Gemini**(`lmChatGoogleGemini` 節點),可自行換成其他 LLM 節點。 + +### 步驟 + +1. **匯入工作流**:在 n8n 中匯入 `workflows/LLM_wiki.json` 與 `workflows/create_wiki_page.json`。 +2. **準備 Google 檔案**: + - 把 `index.xlsx` 上傳 Google Drive 並**轉成 Google Sheets**。 + - 在 Drive 建一個資料夾放 wiki 條目(例:`wiki/`)。 + - (可選)把 `wiki/*.docx` 上傳並**轉成 Google Docs** 當範例,或直接刪掉從零開始。 +3. **接憑證**:在每個 Google Sheets / Docs / Drive 節點接上你的 Google OAuth 憑證;LLM 節點接上你的金鑰。 +4. **指定目標**: + - 把 `get_indexs` / `get_indexs1` / `write_index` 指向你的 index Google Sheet。 + - 把 `create_wiki_page` 子工作流的「建立文件」與「Move file」指向你的 wiki 資料夾。 + - 主工作流的 `create_wiki_page` HTTP 節點 URL 改成**你自己 n8n 的 webhook 網址**(範本內是作者的網址,務必替換)。 +5. **啟用並測試**: + - 用表單上傳一份 `.md` / `.txt` → 看 index 是否新增、wiki 資料夾是否多出 Doc。 + - 在 chat 觸發器問一個問題 → 看它是否查目錄、讀 Doc、回答。 + +--- + +## 注意事項 + +- **Token 燒得較兇**:因為是讓 LLM 真的去「讀、整理、改寫」資料,比向量法耗 token。處理大量文件前先評估成本。 +- **範本內含作者的 webhook 網址**,請替換成自己的。 +- 這套設計**重整理輕堆疊** — 它整理出來的是一個「知識**庫**」,而不是無限長大的「知識**倉庫**」。 + +--- + +## 致謝 + +觀念來自 **Andrej Karpathy** 的 LLM Wiki([原文 gist](https://gist.github.com/karpathy/442a6bf555914893e9891c11ac484894))。本專案只是把同一個觀念換成人人都有的 Google 工具,方便教學與實際使用。 + +## 授權 + +MIT License,詳見 [LICENSE](LICENSE)。 diff --git a/index.xlsx b/index.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..515542b3c96f9a37f1fbd071717969ddd7a460d9 GIT binary patch literal 51296 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 Of2u*Pw7X#7yZ;06>4|Uv literal 0 HcmV?d00001 diff --git a/wiki/RAG 檢索增強生成(RAG).docx b/wiki/RAG 檢索增強生成(RAG).docx new file mode 100644 index 0000000000000000000000000000000000000000..d2d664adb0bc32eab79297d6396c871e11abd8cd GIT binary patch literal 10036 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