返回使用情境
知識庫

RAG 聊天機器人 API——生產環境中的 Claude 知識庫助理

多數內部知識庫都是死文件——沒有人找得到內容。由 Claude 驅動的 RAG 聊天機器人能將其轉化為真正的助理,引用來源,並在不確定時拒絕回答。以下是生產環境模式。

最後審核於 。

預設的現代知識庫聊天機器人架構

傳統知識庫搜尋會回傳連結;使用者閱讀這些連結。RAG 將其轉變為附帶引用的一次性對話式回答。做得好,使用者可在 2 秒內取得答案,而不必逐一查閱 5 份文件。做得不好,聊天機器人會產生幻覺,CTO 可能因此禁止專案一年。本頁說明兩者的差異。

可投入生產環境的最小技術堆疊

  1. 向量資料庫:如果已有 Postgres,使用 pgvector;託管服務則使用 Pinecone 或 Qdrant
  2. 嵌入:text-embedding-3-large,直接呼叫 OpenAI——Kunavo 不提供嵌入服務,而且無論採用哪種方式,嵌入呼叫都與生成呼叫分開
  3. 檢索:混合式(向量 + BM25,搭配倒數排名融合)
  4. 生成:Claude Sonnet 5,對 system prompt 啟用 cache_control
  5. 使用者介面:串流回應、引用呈現、「我不知道」備援
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 週應交付的內容

週次里程碑
1100 份文件、單一分塊策略、基本向量搜尋、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 的區塊。