「从 0 到 1 搭建企业级 RAG 系统」选型与架构

3 阅读10分钟

一、为什么你的 AI 知识库"不好用"?

去年帮一家法律咨询所搭建知识库时,客户上来就说:"我们之前买过一套 AI 知识库,但律师们都不愿意用——问它问题,回答全是套话,根本不能帮他们省时间。"

这不是 AI 不够聪明。

是那套系统从架构上就错了——它把一堆法律文档扔给 GPT,让它"自己理解"。没有检索、没有上下文、没有质量控制。AI 是在闭着眼睛回答。

这篇文章,我会把搭建企业级 RAG 系统的完整流程、核心选型和真实踩坑经验全部展开。无论你是想自己搭、还是想找人来搭,看完这篇就能避开 80% 的坑。


二、什么是 RAG?

RAG,全称 Retrieval-Augmented Generation(检索增强生成),是当前企业构建知识库最主流的技术方案。

说人话就是:先让 AI 在你的文档里找到相关内容,再基于这些内容生成答案。

这和直接让 AI "凭记忆回答" 有什么本质区别?

方案原理优点缺点
直接 PromptAI 靠训练记忆回答简单不知道你的业务、数据过时
Fine-tuning用你的数据微调模型效果较好成本高、周期长、数据更新麻烦
RAG ✅先检索再生成成本低、可实时更新、可溯源需要搭一套检索系统

RAG 的核心价值:让 AI 的回答有据可查,而不是胡说八道。


三、RAG 系统全架构

先上一张全景图,后文逐个拆解:

文档输入(PDF/Word/网页/Markdown)
     ↓
文档解析(提取文字、表格、图表)
     ↓
文本分块(Chunking)
     ↓
Embedding 向量化
     ↓
存入向量数据库
     ↓
用户提问
     ↓
Query Embedding(问题向量化)
     ↓
向量检索(Top-K 匹配)
     ↓
上下文组装(问题 + 检索结果)
     ↓
LLM 生成回答
     ↓
返回答案 + 标注参考来源

六个核心组件,个个有坑。我们逐个说。


四、核心组件深度拆解

4.1 文档解析:PDF 是最大的坑

很多人以为文档解析很简单——读进去不就完了?

实际上,文档格式决定了 40% 的后期工作量

  • Markdown / Word:解析最干净,直接读取文字和基本结构
  • PDF:噩梦开始——文字排版、表格合并、图表嵌入、乱码问题
  • 扫描件(图片转 PDF) :完全不可直接解析,必须先做 OCR

真实踩坑案例:

某制造企业的产品手册是 10 年前的扫描 PDF,里面还有手写批注。 第一版直接用库解析,一半内容是乱码,召回率只有 40%。 后来上了 PaddleOCR 预处理,才把召回率拉到 85%。

推荐工具:

  • 通用解析:Unstructured
  • 扫描件 OCR:PaddleOCR
  • 复杂 PDF:Marker

4.2 文本分块:这是 RAG 的灵魂

"把文档切成小块"听起来简单,但块大小和切法直接决定召回质量

常见切分策略
策略原理适用场景
固定长度按 token 数切分简单文档、快速验证
递归字符切分按段落、换行递归切大多数场景
语义切分按句子/段落语义切质量要求高的文档
按结构切分按标题、章节切手册、报告
关键参数:块大小 & 重叠

这是最容易出问题的地方。

块太大:上下文信息过多,LLM 容易忽略关键细节块太小:上下文不连贯,丢失段落间关联重叠太小:块之间的上下文断裂,检索容易丢失

我的实战数据: 某电商产品知识库,最初按 500 字切分,召回率 62%。 调整到 256 字 + 重叠 64 字后,召回率提升到 91% 。 这个改动没有任何算法优化,就是调了参数。

推荐起始参数(中文文档):

chunk_size = 256      # 中文字符数,约等于 300-400 token
chunk_overlap = 64    # 重叠字符数

4.3 Embedding 模型:中文选错模型,召回率直接腰斩

Embedding(向量化)是把文字变成一串数字,让机器能理解"哪些内容是相似的"。

英文场景:OpenAI text-embedding-3-large / Cohere embed-v3 闭眼选

中文场景:模型效果差异极大,必须测!

模型维度中文效果部署方式推荐度
BGE-large-zh1024⭐⭐⭐⭐⭐HuggingFace / 本地首选
M3E1536⭐⭐⭐⭐开源可部署备选
text2vec1024⭐⭐⭐开源可部署轻量场景
OpenAI Embedding1536⭐⭐⭐API国内不推荐

我的选择:BAAI/bge-large-zh

中文效果最好的开源 Embedding 模型,支持本地部署,客户数据不出网,符合大多数企业安全要求。


4.4 向量数据库:四个主流选型对比

数据库优点缺点推荐场景
Qdrant性能强、API 友好、支持混合检索社区比 Milvus 小生产首选,我实际交付用得最多
Milvus功能全、社区大部署复杂、资源占用高超大规模数据、大型企业
FAISS轻量、快速不支持云原生轻量级本地 / POC 演示
Chroma上手最快,5 分钟跑通不适合生产环境快速验证(绝对不要上生产)

客户最常问的一个问题:"能部署在我们自己的服务器吗?"

这个问题决定了你选哪个方案。Qdrant 和 Milvus 支持完全私有化部署,Chroma 不行。


4.5 检索策略:召回率是根本

检索是 RAG 效果的天花板——如果检索不到相关内容,LLM 再强也没用

基础:向量检索(Top-K)
results = vectorstore.similarity_search(
    query="劳动合同最长期限是多久?",
    k=3  # 返回最相关的3个块
)

K 的选择:通常 3-5。太多干扰上下文,太少容易漏掉相关信息。

进阶:混合检索(向量 + 关键词)

向量检索擅长语义理解,关键词检索(BM25)擅长精确匹配。

两者结合,召回率比单纯向量检索提升 15-25%

进阶:重排序(Re-rank)

用更精准的模型对初筛结果二次排序,比如 Cohere Rerank。

流程:向量检索(20条) → Re-rank → 返回(Top-3)

进阶:元数据过滤

按文档类型、时间、部门等维度过滤,大幅提升精准度。


4.6 LLM 生成:选对模型省 80% 的钱

不是每个场景都需要 GPT-4o。

模型效果成本适用场景
GPT-4o / Claude-3.5最佳高端场景、复杂推理
DeepSeek Chat良好 ⭐大多数企业场景首选
Qwen(通义千问)良好国内场景,中文优化好
本地开源模型一般极低数据安全要求极高

我的经验:大多数企业知识库场景,用 DeepSeek 或 Qwen 足够了。省下的 80% 成本干点别的不香吗?

核心 Prompt 模板

你是一个企业知识库助手,职责是根据提供的参考资料,准确回答用户问题。

【回答规则】
1. 只基于参考资料中的信息回答,不要编造
2. 如果资料中没有相关信息,明确告知用户
3. 回答时标注参考来源(文档名或来源段落)

【参考资料】
{context}

【用户问题】
{question}

【回答】

五、实战:从 0 搭建最小可运行 RAG 系统

以"帮助律所搭建法规知识库"为背景,完整代码演示。

5.1 环境准备

pip install langchain langchain-community langchain-openai \
  qdrant-client sentence-transformers \
  unstructured pypdf

5.2 文档解析

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("劳动合同法.pdf")
pages = loader.load_and_split()

# 查看解析结果
print(f"共解析 {len(pages)} 页")
print(pages[0].page_content[:200])

5.3 文本分块

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=256,
    chunk_overlap=64,
    separators=["\n\n", "\n", "。", ","]  # 优先级从低到高
)

chunks = splitter.split_documents(pages)
print(f"共切分 {len(chunks)} 个块")

5.4 向量存储(Qdrant 示例)

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Qdrant

# Embedding 模型
embedding = HuggingFaceBgeEmbeddings(
    model_name="BAAI/bge-large-zh",
    model_kwargs={"device": "cpu"},
    encode_kwargs={"normalize_embeddings": True}
)

# 初始化 Qdrant(本地模式)
client = QdrantClient(":memory:")

# 创建 collection
client.create_collection(
    collection_name="law_knowledge",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)

# 上传向量
vectorstore = Qdrant.from_documents(
    documents=chunks,
    embedding=embedding,
    host="localhost",
    collection_name="law_knowledge",
)
print("向量入库完成 ✅")

5.5 问答流程

from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

llm = ChatOpenAI(
    model="deepseek-chat",
    base_url="https://api.deepseek.com/v1",
    api_key="your-api-key",
    temperature=0.1  # 偏低,避免幻觉
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True,
)

# 提问
question = "签订劳动合同最长期限是多久?试用期有什么规定?"
result = qa_chain.invoke({"query": question})

print("回答:", result["result"])
print("\n参考来源:")
for doc in result["source_documents"]:
    print(f"  - {doc.metadata.get('source', 'unknown')}")

运行结果示例:

回答:根据《劳动合同法》,劳动合同期限分为固定期限、无固定期限和以完成一定工作任务为期限三种。签订固定期限劳动合同最长期限没有限制,由双方协商确定。试用期最长不超过 6 个月,且试用期工资不得低于合同约定工资的 80%。

参考来源:劳动合同法第十条、第十九条


六、交付前必须检查的 10 项

来自真实项目经验,上线前逐项核对:

#检查项常见问题解决方案
1PDF 解析是否完整扫描件乱码上 OCR 预处理
2块大小是否合适上下文断裂用默认参数先跑通,再调优
3Embedding 模型是否中文优化召回率低换成 BGE-large-zh
4向量数据库性能查询慢检查是否在 GPU 模式
5Prompt 是否有幻觉约束AI 胡说加"不确定时如实说明"
6检索结果是否相关答非所问换 Embedding 或加 BM25
7有无来源引用不可信记录检索来源
8上线后效果监控效果下降不知情定期重建索引
9多语言文档处理召回率低分语言用不同 Embedding
10数据安全合规客户数据泄露私有化部署

七、总结

三个核心要点:

  1. RAG 是企业知识库的正确解法:成本低、可实时更新、回答可溯源
  2. 块大小、Embedding、向量库是三个最影响效果的组件:选对这三个,60% 的坑都能避开
  3. 上线前的踩坑检查比算法调优更重要:很多效果问题不是算法不行,是数据处理不规范

下一步你该做什么:

  • 想搞清楚向量数据库怎么选? → 下一篇《向量数据库怎么选》
  • 想了解文本分割的实战技巧? → 关注后回复"分割",领取《常见文档分割策略对比表》
  • 想接入实际场景? → 关注「林间昭语」,回复"知识库",送你一份《RAG 交付自检清单》

搭建 RAG 系统看起来复杂,但只要架构选对,60% 的坑都能提前避免。

如果你也在为公司或客户规划 AI 知识库项目,欢迎扫码聊一聊。 我目前已帮 3 家企业落地了知识库系统,涵盖法律、电商、制造三个行业。

备注"知识库",送你一份我整理的  《RAG 交付自检清单》 ,包含上文 10 项检查项的详细版 👇


关注「林间昭语」,用技术创造可能,让 AI 走进每个人的工作和生活。

点击上方蓝色公众号名称 → 设为星标 🌟,第一时间收到干货。