# 用 RAG 把 GitHub Markdown 變成智慧問答知識庫  工程團隊有個很常見的痛點:文件寫了,但沒人找得到。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)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.