从 0 到 1 构建企业级 RAG:一个中小企业可落地版本的完整架构

1. 引言

大语言模型(LLM)的兴起让企业看到了知识管理自动化的曙光。然而,通用大模型无法直接访问企业内部私有的、实时的知识库,导致回答往往“一本正经地胡说八道”。检索增强生成(Retrieval-Augmented Generation,RAG)技术正是为了解决这一痛点而生。

对于资源有限的中小企业而言,构建一套“能用、好用、可维护”的 RAG 系统,并非简单地将文档扔给向量数据库。本文将从 0 到 1,拆解一个企业级 RAG 的完整架构,提供一套可直接落地的技术选型与实现思路。

2. 核心架构总览

一个生产级的 RAG 系统,远不止“检索 + 生成”两步。它需要一套完整的流水线来保证数据的质量、检索的准确性和回答的可靠性。下图展示了我们即将构建的架构:

多源文档
(PDF/Word/网页/数据库)

文档解析与清洗

文档分块
(Chunking)

向量化嵌入
(Embedding)

向量数据库
(Milvus/Chroma)

用户查询

查询改写与路由

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

重排序
(Reranker)

LLM 生成回答

输出与引用

整个流程可以分为两大阶段:数据预处理(离线)在线推理

3. 数据预处理:知识库的基石

这是 RAG 系统中最容易被忽视,但也是最重要的环节。垃圾进,垃圾出。

3.1 文档解析与清洗

企业数据源多样,包括 PDF、Word、Markdown、HTML 以及数据库记录。

  • 技术选型
    • PDF:推荐使用PyMuPDF(fitz)或pdfplumber,它们能较好地提取文本和表格。
    • Word/HTMLpython-docxBeautifulSoup是成熟的选择。
    • 通用方案Unstructured库是一个强大的工具,能处理多种格式并自动识别文档元素。
  • 清洗要点
    • 去除页眉页脚、水印、无关的导航栏。
    • 统一编码(UTF-8)。
    • 对 OCR 识别出的文本进行纠错。

3.2 文档分块(Chunking)

分块策略直接影响检索效果。块太小,语义不完整;块太大,噪声多且容易超出 LLM 上下文窗口。

  • 推荐策略语义分块
    • 首先,按 Markdown 标题(###)或文档的段落结构进行初步分割。
    • 然后,使用LangChainLlamaIndexRecursiveCharacterTextSplitter,以段落(\n\n)为分隔符,设置chunk_size=512(token)和chunk_overlap=128
    • 进阶:对于代码或表格,可以单独定义分块逻辑,避免被截断。
fromlangchain.text_splitterimportRecursiveCharacterTextSplitter text_splitter=RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=128,separators=["\n\n","\n","。",","," ",""],length_function=len,)chunks=text_splitter.split_text(cleaned_document)

3.3 向量化嵌入(Embedding)

将文本块转换为向量,是语义检索的基础。

  • 技术选型
    • 开源首选BAAI/bge-large-zh-v1.5BAAI/bge-m3。它们在中文语义理解上表现优异,且支持本地部署,无数据泄露风险。
    • 商业 API:OpenAItext-embedding-3-small或阿里DashScope的 embedding 模型,效果稳定但需付费。
  • 部署:使用Sentence-Transformers库加载模型,并封装成微服务,供后续流程调用。

4. 在线推理:从查询到答案

当用户提问时,系统需要快速、准确地找到相关信息并生成答案。

4.1 查询改写与路由

用户的原始问题往往不够精确。直接检索效果不佳。

  • 查询改写:利用一个小型 LLM(如 GPT-3.5-turbo 或 Qwen-7B)将用户问题改写成更适合检索的形式。例如,将“它怎么用?”改写成“XX产品的使用方法是什么?”。
  • 查询路由:根据问题类型,路由到不同的检索策略。例如,事实性问题走向量检索,总结性问题走全文搜索。

4.2 混合检索

单一向量检索可能遗漏关键词完全匹配但语义相似度不高的结果。

  • 实现:同时进行向量检索(语义相似度)和关键词检索(BM25 算法)。
  • 融合:使用Reciprocal Rank Fusion (RRF)算法,将两种检索结果按排名加权合并,得到最终的候选文档列表。

4.3 重排序(Reranker)

向量检索返回的 Top-K 结果中,前几个可能并不相关。重排序模型能对候选结果进行更精细的交叉编码打分。

  • 技术选型BAAI/bge-reranker-v2-m3是一个优秀的轻量级重排序模型。
  • 作用:将 Top-50 的结果重排序,只取 Top-5 作为 LLM 的上下文。这一步能显著提升最终回答的准确性。
# 伪代码示例fromsentence_transformersimportCrossEncoder reranker=CrossEncoder('BAAI/bge-reranker-v2-m3')pairs=[[query,doc]fordocincandidate_docs]scores=reranker.predict(pairs)# 按 scores 排序,取 Top-5

4.4 LLM 生成与引用

将用户问题与重排序后的文档片段拼接成 Prompt,交给 LLM 生成最终答案。

  • Prompt 设计:明确要求 LLM 基于上下文回答,如果找不到答案则说“不知道”,并强制要求给出引用来源(如文档块 ID 或文件名)。
  • 技术选型:对于中小企业,推荐使用Qwen2.5-7B-InstructDeepSeek-V2-Lite等开源模型,通过vLLMOllama部署,成本可控。

5. 技术栈与部署建议

组件推荐方案说明
文档解析Unstructured+PyMuPDF处理多格式文档
向量数据库Milvus(推荐) /ChromaMilvus 更适合生产,Chroma 适合原型
Embedding 模型BAAI/bge-m3本地部署,兼顾效果与安全
Reranker 模型BAAI/bge-reranker-v2-m3轻量级,效果显著
LLMQwen2.5-7B-Instruct通过 vLLM 部署,支持高并发
编排框架LangChain/LlamaIndex快速搭建流水线,降低开发成本
部署Docker Compose将所有服务容器化,一键部署

6. 总结与展望

本文从 0 到 1 拆解了一个企业级 RAG 系统的完整架构,涵盖了数据预处理、在线推理、技术选型等核心环节。对于中小企业而言,关键在于:

  1. 重视数据质量:花 80% 的精力在文档清洗和分块上。
  2. 引入重排序:这是提升准确率性价比最高的手段。
  3. 拥抱开源:使用BAAI系列模型和Milvus,在保证效果的同时控制成本。

RAG 技术仍在快速发展,未来多模态 RAG、Agentic RAG 等方向值得持续关注。希望本文能为你的企业知识库建设提供一个清晰的起点。