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 的本质是“检索决定下限,模型决定上限”。检索准了,模型再差也不会胡说;检索不准,模型再强也是编故事。先把检索调好,再谈模型。

发表回复

后才能评论