AI 智能問答系統 — 從檔案搜尋到對話式知識庫

將公司回報系統從傳統關鍵字搜尋升級為 AI 對話式查詢,透過 Google Gemini Embedding + pgvector 語意快取、中文分詞與 RabbitMQ 非同步處理,實現高效的知識庫問答體驗。

AIRAGGoogle GeminiPostgreSQLpgvectorRabbitMQMeilisearchNode.js

專案背景與挑戰

在公司的內部支援系統(回報系統)中,原本採用傳統的關鍵字搜尋來查詢 QA 知識庫。然而,這種方式存在明顯的痛點:

  • 關鍵字匹配失效:使用者不知道正確的關鍵字,或使用同義詞、口語化問法時,搜尋結果往往一無所獲。
  • 無法理解上下文:使用者追問「那邊怎麼做?」時,系統無法理解「那邊」指的是什麼。
  • 重複查詢浪費資源:相似的問題每次都要重新呼叫 LLM,消耗 API 配額與時間。

為了解決這些問題,我主導規劃並開發了 AI 智能問答系統 (QA AI Service),將傳統的關鍵字搜尋升級為對話式 AI 查詢

核心架構與技術亮點

1. 語意快取 (Embedding Cache)

基於 Google Gemini gemini-embedding-001 生成 768 維向量,並使用 PostgreSQL + pgvector 實現高效的語意相似度搜尋。

  • 雙重驗證機制
    • Step 1:向量相似度 ≥ 0.85 (避免語意不同但相似度高的誤判)。
    • Step 2:關鍵字驗證通過 (確保核心概念一致)。
  • 大幅降低 LLM 呼叫成本:相似問題直接返回快取答案,無需重新推理。

2. 智能關鍵字提取與全文搜尋

針對中文文本處理的特殊需求,整合了 nodejieba 分詞與 Meilisearch 全文搜尋。

  • 中文 TF-IDF 提取:使用 nodejieba 對問題進行分詞,並基於 TF-IDF 算法提取關鍵詞。
  • 停用詞過濾:自動過濾「的」、「是」、「嗎」等無意義詞彙,提升搜尋精準度。
  • 快速全文搜尋:將關鍵詞送往 Meilisearch,從 QA 知識庫中檢索出最相關的文章 (最多 10 篇)。

3. Intent 判斷與上下文追蹤 (Followup)

實作了三種問題類型的自動識別與處理:

  • opinion (主觀問題):如「哪個方案比較好?」→ 返回固定回覆或引導使用者補充背景。
  • followup (追問):如「那邊怎麼做?」→ 自動找到最近的 new_topic,合併上下文後處理。
  • new_topic (新問題):如「如何設定權限?」→ 正常進入 Embedding + 搜尋 + LLM 流程。

4. RabbitMQ 非同步處理架構

為了讓回報系統 (Laravel) 與 AI 服務 (Node.js) 解耦,採用了 RabbitMQ 作為訊息佇列。

  • 非同步拋接:Laravel 後端接收使用者問題後,透過 RabbitMQ 發送到 QA AI Service。
  • 提升 UI 回應速度:前端不需等待 LLM 推理完成,可透過 WebSocket 或輪詢取得結果。
  • 提高系統穩定性:即使 AI 服務暫時故障,問題仍會在佇列中等待處理,不會遺失。

系統流程

  1. 使用者提問 → Laravel 後端接收。
  2. RabbitMQ 拋接 → 問題送入 QA AI Service。
  3. Intent 判斷 → 識別問題類型 (opinion / followup / new_topic)。
  4. 語意快取檢查 → 查詢 pgvector 是否有相似問題 (相似度 ≥ 0.85 + 關鍵字驗證)。
  5. 快取命中 → 直接返回快取答案。
  6. 快取未命中 → 提取關鍵字 → Meilisearch 搜尋 → LLM 生成答案 → 儲存快取。
  7. 返回答案 → 透過 RabbitMQ 或 API 回傳給 Laravel 後端 → 顯示給使用者。

帶來的效益與價值

  1. 查詢成功率大幅提升:從「找不到關鍵字就搜不到」,升級為「理解使用者意圖自動推薦」。
  2. 降低 LLM 成本:相似問題直接命中快取,避免重複呼叫 Gemini API。
  3. 支援上下文追問:使用者可以像與真人對話一樣追問「那個怎麼做?」,系統自動理解指代。
  4. 架構解耦與擴展性:透過 RabbitMQ,AI 服務可獨立擴展、升級或替換模型,不影響主系統。