iT邦幫忙

0

用 RAG 把 GitHub Markdown 變成智慧問答知識庫

  • 分享至 

  • xImage
  •  

markdownkb

工程團隊有個很常見的痛點:文件寫了,但沒人找得到。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 應用有任何想法,歡迎留言交流。


📘 HackMD 原文筆記:
👉 https://hackmd.io/@jeff377/markdown-kb

📢 歡迎轉載,請註明出處
📬 歡迎追蹤我的技術筆記與實戰經驗分享
FacebookHackMDGitHubNuGet


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言