从 0 到 1 构建企业级 RAG:一个中小企业可落地版本的完整架构
1. 引言
大语言模型(LLM)的兴起让企业看到了知识管理自动化的曙光。然而,通用大模型无法直接访问企业内部私有的、实时的知识库,导致回答往往“一本正经地胡说八道”。检索增强生成(Retrieval-Augmented Generation,RAG)技术正是为了解决这一痛点而生。
对于资源有限的中小企业而言,构建一套“能用、好用、可维护”的 RAG 系统,并非简单地将文档扔给向量数据库。本文将从 0 到 1,拆解一个企业级 RAG 的完整架构,提供一套可直接落地的技术选型与实现思路。
2. 核心架构总览
一个生产级的 RAG 系统,远不止“检索 + 生成”两步。它需要一套完整的流水线来保证数据的质量、检索的准确性和回答的可靠性。下图展示了我们即将构建的架构:
整个流程可以分为两大阶段:数据预处理(离线)和在线推理。
3. 数据预处理:知识库的基石
这是 RAG 系统中最容易被忽视,但也是最重要的环节。垃圾进,垃圾出。
3.1 文档解析与清洗
企业数据源多样,包括 PDF、Word、Markdown、HTML 以及数据库记录。
- 技术选型:
- PDF:推荐使用
PyMuPDF(fitz)或pdfplumber,它们能较好地提取文本和表格。 - Word/HTML:
python-docx和BeautifulSoup是成熟的选择。 - 通用方案:
Unstructured库是一个强大的工具,能处理多种格式并自动识别文档元素。
- PDF:推荐使用
- 清洗要点:
- 去除页眉页脚、水印、无关的导航栏。
- 统一编码(UTF-8)。
- 对 OCR 识别出的文本进行纠错。
3.2 文档分块(Chunking)
分块策略直接影响检索效果。块太小,语义不完整;块太大,噪声多且容易超出 LLM 上下文窗口。
- 推荐策略:语义分块。
- 首先,按 Markdown 标题(
#,##)或文档的段落结构进行初步分割。 - 然后,使用
LangChain或LlamaIndex的RecursiveCharacterTextSplitter,以段落(\n\n)为分隔符,设置chunk_size=512(token)和chunk_overlap=128。 - 进阶:对于代码或表格,可以单独定义分块逻辑,避免被截断。
- 首先,按 Markdown 标题(
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.5或BAAI/bge-m3。它们在中文语义理解上表现优异,且支持本地部署,无数据泄露风险。 - 商业 API:OpenAI
text-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-54.4 LLM 生成与引用
将用户问题与重排序后的文档片段拼接成 Prompt,交给 LLM 生成最终答案。
- Prompt 设计:明确要求 LLM 基于上下文回答,如果找不到答案则说“不知道”,并强制要求给出引用来源(如文档块 ID 或文件名)。
- 技术选型:对于中小企业,推荐使用
Qwen2.5-7B-Instruct或DeepSeek-V2-Lite等开源模型,通过vLLM或Ollama部署,成本可控。
5. 技术栈与部署建议
| 组件 | 推荐方案 | 说明 |
|---|---|---|
| 文档解析 | Unstructured+PyMuPDF | 处理多格式文档 |
| 向量数据库 | Milvus(推荐) /Chroma | Milvus 更适合生产,Chroma 适合原型 |
| Embedding 模型 | BAAI/bge-m3 | 本地部署,兼顾效果与安全 |
| Reranker 模型 | BAAI/bge-reranker-v2-m3 | 轻量级,效果显著 |
| LLM | Qwen2.5-7B-Instruct | 通过 vLLM 部署,支持高并发 |
| 编排框架 | LangChain/LlamaIndex | 快速搭建流水线,降低开发成本 |
| 部署 | Docker Compose | 将所有服务容器化,一键部署 |
6. 总结与展望
本文从 0 到 1 拆解了一个企业级 RAG 系统的完整架构,涵盖了数据预处理、在线推理、技术选型等核心环节。对于中小企业而言,关键在于:
- 重视数据质量:花 80% 的精力在文档清洗和分块上。
- 引入重排序:这是提升准确率性价比最高的手段。
- 拥抱开源:使用
BAAI系列模型和Milvus,在保证效果的同时控制成本。
RAG 技术仍在快速发展,未来多模态 RAG、Agentic RAG 等方向值得持续关注。希望本文能为你的企业知识库建设提供一个清晰的起点。
