现代知识库聊天机器人的默认架构
传统知识库搜索返回链接,用户自行阅读。RAG 将其变成带引用的一次性对话答案。做得好,用户 2 秒内即可得到答案,而不必翻找 5 份文档。做得不好,聊天机器人会产生幻觉,CTO 可能因此禁止项目一年。本页面说明的就是两者之间的差异。
最低可行的生产技术栈
- 向量数据库:如果已有 Postgres,就使用 pgvector;托管场景使用 Pinecone 或 Qdrant
- 嵌入:text-embedding-3-large,直接调用 OpenAI——Kunavo 不提供嵌入模型,而且无论如何,嵌入调用都与生成调用是分开的请求
- 检索:混合检索(向量 + BM25,并使用 reciprocal rank fusion)
- 生成:在系统提示词上使用 cache_control 的 Claude Sonnet 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 周分别应交付什么
| 周次 | 里程碑 |
|---|---|
| 1 | 100 篇文档、单一分块策略、基础向量搜索、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 的文本块。