RAG 知识库搭建:文档切分、向量检索与问答
大模型不知道你公司的内部文档,RAG 就是给它配一个能查的资料库:用户问问题,先去资料库里检索相关片段,再把片段连同问题一起交给模型回答。有出处、可更新、不用重新训练,是企业用大模型最常见的落地方式。
一、RAG 长什么样
流程分两段:离线先把文档切成片段、算成向量、存进向量库;在线用户提问时,先把问题也算成向量,去库里找最相似的片段,再把片段和问题一起发给模型生成答案。效果好不好,一半看切分,一半看检索。
# 装依赖:向量模型 + 向量库 + 大模型客户端
pip install sentence-transformers faiss-cpu openai
二、文档切分:chunk 大小是关键
切分就两个参数:chunk 大小和重叠。chunk 太大,检索回来的片段里废话多,模型容易被带偏;太小,关键信息被切散,检索时凑不齐。经验值:中文文档 500 字左右一块,重叠 50 到 100 字;有标题结构的按标题切,别把一个章节拦腰切断。表格和代码块尽量整块保留,别切碎。
# 文档切分:按段落切,块大小约 500 字,重叠 100 字
def split_text(text, chunk_size=500, overlap=100):
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunks.append(text[start:end])
start = end - overlap
return chunks
with open("manual.txt", encoding="utf-8") as f:
chunks = split_text(f.read())
print(f"切出 {len(chunks)} 个片段")
三、向量库选型
- FAISS:本地库,速度快,适合单机、数据量百万级以内,不用额外部署服务。
- Chroma:轻量,容易上手,适合做原型和小规模应用。
- Milvus:分布式,适合数据量大、要高可用的生产环境。
- 向量模型:中文优先选 bge 系列(bge-base-zh),英文用 e5,模型和业务语言要匹配。
# 向量化并建 FAISS 索引
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
model = SentenceTransformer("BAAI/bge-base-zh-v1.5")
emb = model.encode(chunks, normalize_embeddings=True)
index = faiss.IndexFlatIP(emb.shape[1])
index.add(np.array(emb, dtype=np.float32))
faiss.write_index(index, "kb.faiss")
print(f"索引已建,共 {index.ntotal} 条")
四、检索调优
# 检索 + 生成:top-k 找片段,再交给模型回答
from openai import OpenAI
q_emb = model.encode(["ZeBu 编译报错怎么办"], normalize_embeddings=True)
scores, idx = index.search(np.array(q_emb, dtype=np.float32), k=3)
context = "\n".join(chunks[i] for i in idx[0])
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
model="qwen2.5:7b",
messages=[
{"role": "system", "content": "只根据下面资料回答,资料里没有就直说不知道。\n" + context},
{"role": "user", "content": "ZeBu 编译报错怎么办"},
],
)
print(resp.choices[0].message.content)
- top-k:一般取 3 到 5 个片段,太多噪音大,太少信息不够。
- 重排序:检索回来先用 reranker 再排一次序,效果提升明显,成本也不高。
- 混合检索:向量检索加关键词检索(BM25)一起上,专业术语多的场景效果更好。
- 防幻觉:系统提示里写死“只根据资料回答,没有就直说不知道”,比事后纠错管用。
五、效果评估与坑
上线前准备 50 到 100 个真实问题,人工看答案对不对、有没有出处、答非所问的有多少。常见坑:文档更新了索引没更新(建个定时任务定期重建)、切分把表格切碎(表格单独处理)、用户问的是文档里没有的东西(这时候“不知道”就是正确答案)。
RAG 的本质是“检索决定下限,模型决定上限”。检索准了,模型再差也不会胡说;检索不准,模型再强也是编故事。先把检索调好,再谈模型。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。






