# 用 RAG 把 GitHub Markdown 變成智慧問答知識庫 ![markdownkb](https://hackmd.io/_uploads/BJMsNdro-x.png) 工程團隊有個很常見的痛點:文件寫了,但沒人找得到。README、架構說明、API 文件散落在十幾個 Repo,新人 onboarding 要翻半天,老人也不見得記得當初寫在哪裡。搜尋?只要關鍵字不精準,結果就是一片空白。 這個問題困擾了我一段時間。週末用 Claude Code 做了一個 side project 嘗試解決它 — **MarkdownKB**,把 GitHub 上的 Markdown 文件整合成一套可以直接「問問題」的知識庫平台。 --- ## 這個專案在做什麼 一句話描述:輸入一個 GitHub Repo,系統自動把裡面的 Markdown 文件建成向量索引,之後就可以用自然語言提問,像問 ChatGPT 一樣問你自己的文件。 回答會附上引用來源(是哪一篇文件、哪一段),不是憑空捏造,也支援多輪對話,可以追問、澄清。 ### 主要功能 - **瀏覽 GitHub Markdown 文件** — 支援 Public 和 Private Repo,透過 GitHub API 抓取內容 - **混合搜尋** — 關鍵字搜尋 + 語意向量搜尋(pgvector),兩者結合後準確率比單獨使用任一種都好 - **RAG 問答** — 自然語言提問,回答附引用來源,支援多輪對話 - **LINE Bot 整合** — 直接在 LINE 聊天室查詢知識庫,不用開瀏覽器 - **GPT Actions 整合** — 讓 ChatGPT 呼叫知識庫 API,把你的文件變成 GPT 的知識來源 --- ## 技術架構 ### 技術棧選擇 | 技術 | 用途 | |------|------| | ASP.NET Core | 後端 API | | PostgreSQL + pgvector | 文件儲存 + 向量索引 | | OpenAI | Embedding 生成、GPT 問答 | | LINE Messaging API | LINE Bot 整合 | | Docker | 容器化部署 | 選 pgvector 而不是獨立的向量資料庫(Pinecone、Qdrant 等),主要是想讓架構簡單一點。既然已經用 PostgreSQL 存資料,能在同一個資料庫做向量搜尋就不想多一個服務。對這個規模的專案來說,pgvector 的效能完全夠用。 ### RAG 流程 整個問答流程大致如下: 1. 使用者輸入問題 2. 呼叫 OpenAI Embedding API,把問題轉成向量 3. 用 pgvector 做向量相似度搜尋,找出最相關的文件片段 4. 同時做關鍵字全文搜尋,兩組結果合併、去重、重新排序 5. 把相關片段當作 context,連同問題一起送給 GPT 6. GPT 根據 context 回答,並標註引用來源 7. 多輪對話時,把對話歷史一起送入,讓 GPT 能理解上下文 ### 混合搜尋的效果 純向量搜尋的問題是對精確名詞不敏感。例如搜尋某個 API 的參數名稱,向量搜尋可能找到語意相近但不包含那個參數名的文件。加入關鍵字搜尋後,這種情況明顯改善。 兩者的權重可以調整,目前設定是向量搜尋佔比稍高,但對於技術文件這類包含大量專有名詞的內容,關鍵字搜尋的權重值得再拉高一點。 --- ## LINE Bot 整合 LINE Bot 的整合相對簡單,主要是 Webhook 接收訊息、呼叫知識庫 API、把回答送回 LINE。 比較有趣的部分是多輪對話的狀態管理。LINE 的每一則訊息都是獨立事件,需要自己維護對話歷史。目前用 PostgreSQL 存對話 session,每個 LINE 使用者有自己的對話脈絡,閒置一段時間後自動清除。 --- ## GPT Actions 整合 這個功能讓 ChatGPT 可以直接呼叫 MarkdownKB 的 API。設定方式是在 ChatGPT 的 GPT 設定裡新增 Action,把 API schema 貼上去,之後這個 GPT 就能在回答問題時主動查詢你的知識庫。 對於想在 ChatGPT 介面使用但又想要回答基於自己文件的情境,這個整合蠻實用的。 --- ## 專案連結 開源在 GitHub,歡迎參考或貢獻: 👉 https://github.com/jeff377/markdown-kb 如果你們團隊也有類似的文件管理問題,或者對 RAG 應用有任何想法,歡迎留言交流。 --- **📢 歡迎轉載,請註明出處** **📬 歡迎追蹤我的技術筆記與實戰經驗分享** [Facebook](https://www.facebook.com/profile.php?id=61574839666569) | [HackMD](https://hackmd.io/@jeff377) | [GitHub](https://github.com/jeff377) | [NuGet](https://www.nuget.org/profiles/jeff377)