← Work
民宿 AI 客服與知識庫平台
以 LINE OA 為入口的多租戶 AI 客服。LangGraph 做意圖路由,向量加 BM25 做混合檢索,沒有證據就轉人工。
- AI / LLM
- RAG
- Agents

Contents
概述
商業專案,工作室負責 AI 應用與後端。這是一套以 LINE 官方帳號為入口的民宿客服:使用者問房型、房間細節、聯絡方式、預約或一般問題;明確要求真人或系統找不到足夠資料時,轉給人工客服,不讓 Agent 硬湊答案。
問題
三件事同時要成立。第一,房型名稱、政策名稱這類專有名詞,只靠向量搜尋不一定抓得準。第二,同一句話在不同民宿有不同答案,租戶不能只在登入時判斷一次。第三,AI 沒有證據時,需要一條安全的退路。
解法
FastAPI 接 LINE Webhook 並處理重複事件。LangGraph 把訊息分到房型、房間詳情、聯絡、預約、一般問題或人工轉接。檢索走向量搜尋加 BM25,再用 Weighted RRF 合併。Tenant Context 沿著整條路由往下傳。
LINE Messaging API ──▶ FastAPI Webhook(驗證、去重)
│
▼
LangGraph Agent ──▶ Intent Routing
│ │ │
民宿資料工具 RAG 人工轉接
│ │
▼ ▼
PostgreSQL pgvector + BM25 + RRF主要功能
- LINE Webhook 接收、驗證與重複事件處理
- 意圖路由:房型、房間詳情、聯絡、預約、一般問題、人工轉接
- 民宿資料工具與知識庫分離,房型與聯絡資訊不塞進 Prompt
- 文件解析、Chunking、PII Masking、Embedding 與索引
- 向量搜尋、BM25 與 Weighted RRF 在同一條檢索流程
- Tenant Context、權限與 Provider 錯誤狀態
架構
PDF / DOCX / Markdown ──▶ Parse ──▶ OCR 噪音過濾 / PII 處理 ──▶ Chunking ──▶ Embedding ──▶ pgvector
└──────────────────────────────────▶ Lexical Index
使用者問題 ──▶ Query Rewrite ──┬──▶ Vector Search ──┐
└──▶ BM25 ───────────┴──▶ Weighted RRF ──▶ Grounded Context ──▶ Agent訊息進來
├─ 要求真人?──────────────────────▶ 人工客服
├─ 房型 / 房間 / 聯絡 / 預約 ──▶ 民宿資料工具 ──▶ 回覆
└─ 一般問題 ──▶ RAG
├─ 證據足夠 ──▶ 回覆(附來源)
└─ 證據不足 / Provider 失敗 ──▶ 安全 fallback ──▶ 人工客服工程決策
混合檢索不是為了好看
向量搜尋對語意好,對精確字詞弱。房型名稱、政策名稱和民宿自己的用語,BM25 抓得比較穩。兩邊各取前 N 再用 RRF 合併,補的正是 semantic search 會漏的那一段。
租戶要跟著每一則訊息走
Webhook 收到訊息後,租戶、使用者、知識來源與工具沿著同一條路由傳到底。少傳一段,就可能拿到另一間民宿的房型或政策。
沒有證據時,轉人工比亂答好
檢索結果不足、Provider 失敗,或使用者直接要求真人,回覆進入安全 fallback。用一段看起來很確定的文字蓋過問題,對民宿來說是負債。
畫面
房源名稱、帳號頭像與其他識別資訊已遮罩。


技術
Python、FastAPI、LangGraph、PostgreSQL、pgvector、BM25、RRF、LINE Messaging API、LLM。
結果與心得
- 文件先切分、處理敏感資料、再 Embedding,查詢流程就不必回頭擔心資料品質。
- 文件匯入規模再增加時,背景處理要改成持久化 Queue 與獨立 Worker。
公開範圍
不含正式流量、第三方 SLA 或客服準確率數字。