結論先行
我為中文健康衛教問答做過一個 RAG MVP:把團隊審核的文章切成片段,用 pgvector 檢索,再讓模型根據取回的內容組織答案。它已在本地開發與測試,尚未正式部署,也沒有正式使用者數據。這段經驗讓我最在意的不是「AI 能不能回答」,而是:找不到可靠依據時,系統能不能停下來?
pgvector 負責找相近的內容;該不該進入回答流程,由應用程式決定。向量索引不是安全護欄,也不能保證模型只使用知識庫裡的事實。
flowchart LR
D[已審核的衛教文章] --> C[依標題切片、保留來源]
C --> V[Embedding + PostgreSQL/pgvector]
Q[使用者問題] --> G[同意、額度與成本門檻]
G --> R[向量檢索;必要時改寫追問]
V --> R
R --> E{檢索分數足夠嗎?}
E -- 否 --> N[固定拒答;不呼叫回答模型]
E -- 是 --> A[根據片段生成答案]
A --> O[檢查引用與輸出規則]
最重要的設計:先檢索,再決定要不要生成
文章按標題與小節切片,每塊帶著標題與來源,再轉成向量。查詢時用 PostgreSQL 和 pgvector 找候選片段。索引改善檢索效率,分數門檻才決定是否呼叫回答模型;兩者不是同一回事。pgvector 文件
低於門檻時,程式直接回固定說明,不把問題交給回答模型。但這不等於整輪沒有模型呼叫:問題向量化會使用 embedding 模型,有上文的追問也可能先經過改寫模型。把「不生成答案」說成「完全不呼叫 AI」會不準確。
門檻也不是越高越安全。真實提問常是「我最近總是很累」,不像文章標題或教科書問題;太高會錯拒,太低則可能把不相干的片段送進模型。我用可回答、離題與口語追問組成測試題,調整成「拒答、低信心、較有把握」三種處理,而不是只靠一條線。檢索分數代表相似程度,不等於醫療正確性。
多輪對話與回答檢查
「那怎麼辦?」只拿這句去搜尋,很可能找到錯的主題。我在原句檢索信心不足、又有對話脈絡時,才把追問改寫成能獨立理解的問題,再檢索一次。這比每次把上一輪直接拼上去更謹慎,因為拼接也會把已換話題的問題拉回舊主題。
進入生成後,回答必須帶可對應到本輪取回片段的來源標記;程式會檢查標記是否存在。這能擋下捏造來源,卻不能證明每一句話都真正被來源支持。因此還要用題庫測試回答內容、拒答行為與惡意輸入,而不能把一次測試通過寫成「不會幻覺」或「不會被注入」。OWASP RAG Security Cheat Sheet、Microsoft RAG 評估指南
同意、訪客額度與每日成本限制則放在模型前的伺服器流程,不交給 prompt 判斷。共用知識庫只放經審核的文章;個人對話與健康資訊走另一條按身分讀取的路,不能為了「讓 AI 記住人」就混進共用向量索引。
這個 MVP 證明了什麼
它證明了這套流程可以在本地跑通,也能用測試題檢查檢索、拒答、追問和引用規則。它沒有證明正式環境的穩定性、真實使用者的接受度,或健康問答的法律與醫療合規性;那些需要部署驗證、持續監測與專業審查。
我的收穫是:RAG 的關鍵不是讓模型「看過」多少文章,而是讓系統能說清楚它為什麼取回這些內容、何時停止,以及答案能回到哪個來源。這是可以帶到其他知識庫應用的工程設計,不必把原型包裝成已上線產品。