預設的現代知識庫聊天機器人架構
傳統知識庫搜尋會回傳連結;使用者閱讀這些連結。RAG 將其轉變為附帶引用的一次性對話式回答。做得好,使用者可在 2 秒內取得答案,而不必逐一查閱 5 份文件。做得不好,聊天機器人會產生幻覺,CTO 可能因此禁止專案一年。本頁說明兩者的差異。
可投入生產環境的最小技術堆疊
- 向量資料庫:如果已有 Postgres,使用 pgvector;託管服務則使用 Pinecone 或 Qdrant
- 嵌入:text-embedding-3-large,直接呼叫 OpenAI——Kunavo 不提供嵌入服務,而且無論採用哪種方式,嵌入呼叫都與生成呼叫分開
- 檢索:混合式(向量 + BM25,搭配倒數排名融合)
- 生成:Claude Sonnet 5,對 system prompt 啟用 cache_control
- 使用者介面:串流回應、引用呈現、「我不知道」備援
rag_chat.py
from openai import OpenAI
client = OpenAI(api_key="sk-kn-...", base_url="https://api.kunavo.com/v1")
def chat(question: str, history: list[dict]) -> dict:
chunks = hybrid_retrieve(question, k=5) # vector + BM25
context = "\n\n---\n\n".join(
f"[doc:{c['id']}] {c['text']}" for c in chunks
)
resp = client.chat.completions.create(
model="claude-sonnet-5",
messages=[
{"role": "system", "content": [{
"type": "text",
"text": (
"Answer only from Context. Cite [doc:N] for each claim. "
"If Context doesn't answer, say 'I don't have that.' "
"Be concise, no throat-clearing."
),
"cache_control": {"type": "ephemeral"},
}]},
*history,
{"role": "user", "content": f"# Context\n{context}\n\n# Q\n{question}"},
],
max_tokens=600,
)
answer = resp.choices[0].message.content
cited_ids = parse_citations(answer) # extract [doc:N] references
return {"answer": answer, "sources": [c for c in chunks if c["id"] in cited_ids]}生產規模下的成本
- 初始索引:5,000 份、每份 500 個 token 的文件約 $0.25
- 每日 1,000 次查詢:啟用快取後約每月 $210
- 每日 10,000 次查詢:約每月 $2,100
- 若使用 Haiku 4.5 而非 Sonnet:便宜約 4 倍,回答品質約為 85%
完整架構拆解請參閱 RAG 實作指南。各語言的調校說明請參閱 日文 RAG 深入解析與 西文 RAG 指南。
真正能防止幻覺的三種模式
- 為每項主張提供引用:模型輸出中的
[doc:42]標籤。如果引用的 id 不在檢索結果集合中,就代表模型產生了幻覺——封鎖並記錄 - 在 system prompt 中明確拒答:「如果 Context 沒有答案,請說『我沒有相關資訊。』」沒有這項指示時,模型會從世界知識中自行補全
- 輸出上限為 600 個 token:簡短答案通常更準確。較長的輸出更容易偷偷加入額外的虛構內容
第 1 週與第 4 週應交付的內容
| 週次 | 里程碑 |
|---|---|
| 1 | 100 份文件、單一分塊策略、基本向量搜尋、10 題評估集、recall@5 約 70% |
| 2 | 完整語料庫、混合式檢索、100 題評估集、強制引用、內部測試版 |
| 3 | 根據失敗問題調整分塊策略,交付給內部使用者,測量 CSAT |
| 4 | 監控與成本儀表板、每日支出上限、公開測試版或正式上線 |
從 /app/signup 開始
$10 儲值足以完成約 100K 份文件的初始索引與 1,500 次測試查詢——對功能性原型來說綽綽有餘,而且餘額永不過期。接著閱讀 完整 RAG 指南,了解生產環境模式。
常見問題
RAG 聊天機器人每次查詢要花多少錢?
啟用提示詞快取時,使用 Claude Sonnet 4.6 每次查詢約 $0.007;使用 Claude Haiku 4.5 則約 $0.001,品質約有 Sonnet 的 85%,成本僅為七分之一。
如何避免 RAG 聊天機器人產生幻覺?
三種做法最能發揮作用:要求模型對每項主張引用 [doc:N] ID、在 system prompt 中明確要求拒答,並將 max_tokens 上限設為 600。接著,在輸出答案前確認每個引用的 ID 都出現在檢索結果中。
RAG 索引應使用多大的分塊?
每個區塊 1,000–1,500 個字元,重疊 100–200 個字元,使用 RecursiveCharacterTextSplitter 分割,並以 text-embedding-3-large 建立嵌入。
僅使用向量搜尋足以完成 RAG 檢索嗎?
不需要。混合檢索會結合向量相似度和 BM25 關鍵字搜尋,再以倒數排名融合合併結果,取出排名前 5 的區塊。