返回使用场景
知识库

RAG 聊天机器人 API——生产环境中的 Claude 知识库助手

大多数内部知识库都是沉睡的文档——没人找得到任何内容。由 Claude 驱动的 RAG 聊天机器人会把它们变成真正的助手,引用来源,并在不知道答案时拒绝回答。本文介绍生产环境模式。

最后审核于 。

现代知识库聊天机器人的默认架构

传统知识库搜索返回链接,用户自行阅读。RAG 将其变成带引用的一次性对话答案。做得好,用户 2 秒内即可得到答案,而不必翻找 5 份文档。做得不好,聊天机器人会产生幻觉,CTO 可能因此禁止项目一年。本页面说明的就是两者之间的差异。

最低可行的生产技术栈

  1. 向量数据库:如果已有 Postgres,就使用 pgvector;托管场景使用 Pinecone 或 Qdrant
  2. 嵌入:text-embedding-3-large,直接调用 OpenAI——Kunavo 不提供嵌入模型,而且无论如何,嵌入调用都与生成调用是分开的请求
  3. 检索:混合检索(向量 + BM25,并使用 reciprocal rank fusion)
  4. 生成:在系统提示词上使用 cache_control 的 Claude Sonnet 5
  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 不在检索结果集中,说明模型产生了幻觉——拦截并记录
  • 在系统提示词中明确要求拒答:“如果 Context 无法回答,就说‘我没有这方面的信息。’”没有这一要求时,模型会从世界知识中自行补全
  • 将输出上限设为 600 个 token:简短回答通常更准确。多余内容往往会在较长输出中悄悄出现

第 1 周与第 4 周分别应交付什么

周次里程碑
1100 篇文档、单一分块策略、基础向量搜索、10 个问题的评测集、recall@5 约 70%
2完整语料库、混合检索、100 个问题的评测集、强制引用、内部测试版
3根据失败问题调优分块,向内部用户发布,衡量 CSAT
4监控与成本仪表板、每日支出上限、公开测试版或正式上线

从 /app/signup 开始

充值 10 美元即可完成约 10 万篇文档的初始索引和 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 的文本块。