企业知识库与 RAG
企业知识库问答(RAG)用三类模型:Embeddings 把文档和问题转成向量,Rerank 给检索结果重新排序,对话模型根据检索到的资料写出回答。按下面的假设(2,000 篇文档入库、每月 3 万次提问),用各模型最低价分组的实时价格计算,每月模型费用约 ¥389。
价格更新于 2026年11月12日 20:17|
01
业务问题
产品手册、内部制度、合同模板、历史工单散落在不同系统里,员工和客户想找一个答案,往往要翻好几份文档或者找人问。
直接问大模型,它不了解你们的内部资料,容易一本正经地编答案;把所有文档塞进提示词,费用高,也很快超出上下文长度。
RAG(检索增强生成)先从知识库里找出和问题相关的几段原文,再让模型只根据这几段作答。资料更新后重新入库即可,不需要训练模型,每次回答也能附上出处,方便核对。
02
推荐模型组合
向量化(Embeddings)
text-embedding-3-largeOpenAI输入 ¥0.26 / 输出 ¥0.26 每百万 tokens· 标准分组把文档块和用户问题转换成向量,用来做语义检索。同一个知识库的入库和查询必须使用同一个向量模型。
重排序(Rerank)
qwen3-reranker-8b通义千问输入 ¥0.00308 / 输出 ¥0.00308 每百万 tokens· 国产模型分组向量检索召回的候选段落里常混有不相关的内容。重排模型按问题和段落的相关性重新打分,只把最相关的几段交给对话模型,回答更准,输入 tokens 也更少。
生成回答(对话模型)
deepseek-v4.1-flashDeepSeek输入 ¥2.8 / 输出 ¥11.2 每百万 tokens· 国产模型分组读取检索到的资料并组织成回答。知识库问答的输入长、输出短,选输入单价低的模型最划算;对答案质量要求更高时,可以换成备选里的模型。
推荐模型按实时目录自动选取,价格取各模型最低价分组,更新于 2026年11月12日 20:17。点模型名可查看全部分组价格。
03
参考架构
- 1
解析与切块
把 PDF、Word、网页、工单等资料转成纯文本,按 300 到 800 字切成块,每块保留标题、来源链接和更新时间。
- 2
向量化入库
调用 Embeddings 接口把每个文本块转成向量,连同原文一起写入向量数据库,例如 pgvector、Milvus、Qdrant 或 Elasticsearch。
- 3
召回候选
用户提问时,用同一个向量模型把问题转成向量,取最相近的 20 到 50 个文本块;也可以同时做关键词检索,再合并结果。
- 4
重排筛选
调用 Rerank 接口给候选文本块打相关性分数,保留前 5 个左右。
- 5
生成回答
把保留的文本块编号后连同问题一起交给对话模型,要求它只依据资料作答、用 [1] 这样的编号标注出处,资料不足时直接说不知道。
- 6
评估迭代
记录用户的点赞点踩和答不上来的问题,定期补文档、调整切块大小和提示词。
04
成本估算
假设:知识库 2,000 篇文档、平均每篇 2,500 tokens;每月 3 万次提问(约每天 1,000 次);每次召回 20 个候选块(约 6,000 tokens)重排,最终给对话模型约 3,000 tokens 资料,回答约 400 tokens。
| 项目 | 模型 | 用量假设 | 费用 |
|---|---|---|---|
| 文档首次向量化(一次性) | text-embedding-3-large | 2,000 次 × 输入 2,500 tokens | ¥1.3 |
| 问题向量化 | text-embedding-3-large | 30,000 次 × 输入 40 tokens | ¥0.312 |
| 候选段落重排 | qwen3-reranker-8b | 30,000 次 × 输入 6,000 tokens | ¥0.554 |
| 生成回答 | deepseek-v4.1-flash | 30,000 次 × 输入 3,000 + 输出 400 tokens | ¥386.4 |
| 合计(每月) | ¥388.57 | ||
按各模型最低价分组的实时价格计算,价格更新于 2026年11月12日 20:17。
只含模型调用费用,不含向量数据库和服务器成本。文档首次入库是一次性费用,之后只需对新增或修改的文档重新向量化。系统提示词较长且模型支持上下文缓存时,命中缓存的部分按更低的缓存读取价计费,实际费用会更低。
05
示例代码
用 OpenAI SDK 调用向量和对话接口,用 HTTP 请求调用重排接口。向量数据库部分换成你自己的实现。
import os
import requests
from openai import OpenAI
API_KEY = os.environ["TUTUJIN_API_KEY"]
client = OpenAI(base_url="https://open.tutujin.com/v1", api_key=API_KEY)
def embed(texts):
"""Turn document chunks or a question into vectors."""
resp = client.embeddings.create(model="text-embedding-3-large", input=texts)
return [d.embedding for d in resp.data]
def rerank(query, docs, top_n=5):
"""Re-score retrieved chunks and keep the most relevant ones."""
r = requests.post(
"https://open.tutujin.com/v1/rerank",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": "qwen3-reranker-8b", "query": query, "documents": docs, "top_n": top_n},
timeout=30,
)
r.raise_for_status()
return [docs[x["index"]] for x in r.json()["results"]]
def answer(question, chunks):
context = "\n\n".join(f"[{i + 1}] {c}" for i, c in enumerate(chunks))
resp = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[
{"role": "system", "content": "Answer only from the given sources and cite them like [1]. If the sources do not say, reply that you do not know."},
{"role": "user", "content": f"Sources:\n{context}\n\nQuestion: {question}"},
],
temperature=0.2,
)
return resp.choices[0].message.content
# candidates = your_vector_db.search(embed([question])[0], k=20)
# print(answer(question, rerank(question, candidates)))常见问题
企业知识库问答每月大概花多少钱?
取决于提问量和每次带入的资料长度。按 2,000 篇文档入库、每月 3 万次提问、每次给模型约 3,000 tokens 资料的假设,用最低价分组计算,每月模型费用约 ¥389。提问量翻倍,费用大致也翻倍。
一定要用 Rerank 吗?
不是必须。文档少、问题比较固定时,只用向量检索就够了。文档多、同一件事有好几种问法时,加一步重排通常能明显减少答非所问,交给对话模型的无关段落也更少,输入 tokens 跟着下降。
中途更换向量模型,要重建索引吗?
要。不同向量模型生成的向量不能混用,换模型后需要把全部文档重新向量化入库,查询时也要用新模型。所以上线前最好先用一小批文档对比几个向量模型的检索效果再定。
可以全部用国产模型吗?
可以。向量、重排和对话都有国产模型可选,例如向量用 qwen3-embedding-8b、重排用 qwen3-reranker-8b、对话用 deepseek-v4.1-flash,调用方式不变,只需要改 model 参数。
怎么让回答附上出处?
切块时给每块保存来源链接和标题;交给模型时按 [1]、[2] 编号,并在系统提示词里要求按编号标注出处;前端再把编号映射回原文链接。