导读:在第一章中,我们了解了RAG的基本概念和优势。本章将进入实战前的准备工作------设计RAG系统的技术架构。我们将详细拆解系统的两大流程(离线数据处理与在线问答),并介绍本教程所选用的技术栈及其选型理由。通过本章,你将清楚知道整个系统由哪些组件构成,以及它们之间如何协作。
2.1 系统整体架构
一个典型的RAG系统包含两个主要阶段:离线数据处理 (索引构建)和在线问答流程(检索+生成)。下图展示了完整的数据流向:
离线数据处理流程
text
[私有文档]
(PDF/TXT)
↓
[文本加载器]
(读取文件内容)
↓
[文本分割器]
(将长文档切分为语义完整的短片段)
↓
[嵌入模型]
(将每个片段转换为向量)
↓
[向量数据库]
(存储向量及原始文本,构建索引)
步骤详解:
- 文档加载:从本地或云存储读取企业私有文档,支持常见格式如PDF、TXT、Markdown、Word等。加载器负责提取纯文本内容,忽略格式噪声。
- 文本分割:大模型对上下文长度有限制(通常为8K-128K token),且检索系统需要细粒度的片段。因此需将长文档切分为语义完整的短段落或句子,一般每段控制在200-500个词(或按token数分割)。分割策略需避免切断关键信息。
- 向量化:将每个文本片段通过嵌入模型转换为固定长度的向量(如384维或768维)。向量应能捕捉文本的语义信息,使语义相似的文本在向量空间中接近。
- 存入向量数据库:将向量及其对应的原始文本、文档来源、片段序号等元数据存入向量数据库。数据库会为向量建立索引,以便快速进行近似最近邻搜索。
在线问答流程
text
[用户提问]
↓
[嵌入模型] (将问题转为向量)
↓
[向量检索] (在向量数据库中搜索最相似的Top-K片段)
↓
[获取Top-K相关片段]
↓
[构建Prompt] (将问题与检索到的片段组合成提示模板)
↓
[大语言模型] (DeepSeek LLM 根据Prompt生成答案)
↓
[最终回答] (可附带引用来源)
步骤详解:
- 问题向量化:用户输入问题后,使用与离线阶段相同的嵌入模型将问题转换为向量。
- 向量检索:以问题向量为查询,在向量数据库中执行相似性搜索,召回最相关的K个文本片段(通常K取3~5)。这一步快速定位可能包含答案的文档片段。
- Prompt构建:将召回片段作为上下文,与用户问题按照特定模板组合,形成完整的Prompt。模板示例:
- text
- 请基于以下资料回答问题。如果资料中找不到答案,请直接说"无法回答"。 资料: [1] {片段1} [2] {片段2} ... 问题:{用户问题}
- 答案生成:将Prompt发送给大语言模型(如DeepSeek-V3),模型根据上下文生成准确、简洁的回答。若模型认为资料不足以回答,则遵循指令拒绝回答。
- 输出与引用:最终答案可附带来源索引(如[1][2]),增强可信度和可追溯性。
2.2 技术栈选型
为了实现上述架构,我们需要选择合适的技术组件。本教程的选型原则是:轻量、高效、易上手,同时兼顾工业级应用的可能。以下是具体选型及理由。
|-----------------|------------------------------------------|-----------------------------------------------------------------------------------------------|
| 组件 | 选型 | 选型理由 |
| 编程语言 | Python 3.8+ | AI领域事实标准,拥有最丰富的库生态,适合快速开发与教学。 |
| 大语言模型 (LLM) | DeepSeek-Chat (V3) | 中文能力出色,性价比极高(API价格仅为GPT-4的1/10),支持私有化部署,符合企业需求。 |
| 向量数据库 | ChromaDB | 轻量级嵌入式数据库,无需单独部署服务,支持内存和持久化存储,非常适合教学和中小型项目。提供简单的Python API,便于理解核心概念。 |
| 嵌入模型 | Sentence-Transformers (all-MiniLM-L6-v2) | 轻量级开源模型,768维输出,速度快,在语义相似度任务上表现良好。完全本地运行,无数据隐私风险。也可替换为OpenAI的text-embedding-3-small,但需付费且依赖网络。 |
| 开发框架 | 原生Python + Requests | 为了深入理解RAG底层原理,本教程将尽量减少对LangChain等高级框架的依赖。我们将直接调用API和库,展示每一步的实现逻辑,让你真正掌握RAG的精髓。 |
补充说明
- 为什么不用LangChain? LangChain虽然封装了丰富的组件,但隐藏了太多细节,不利于初学者理解RAG的内在机制。在掌握了基础后,你可以轻松迁移到LangChain或LlamaIndex以提高开发效率。
- 嵌入模型的选择:all-MiniLM-L6-v2是MiniLM系列中速度和效果平衡的模型,适合CPU环境。若追求更高精度,可换用bge-large-zh(中文优化)或OpenAI的嵌入模型。
- 向量数据库的扩展:ChromaDB适合原型验证,生产环境可平滑迁移至Pinecone、Weaviate或Milvus等专业向量数据库,代码改动极小。
2.3 环境准备与依赖安装
在开始编码前,我们需要安装必要的Python包。创建一个新的虚拟环境,并执行以下命令:
bash
pip install chromadb sentence-transformers requests python-dotenv
- chromadb:向量数据库客户端。
- sentence-transformers:加载嵌入模型并生成向量。
- requests:用于调用DeepSeek API(如果需要)。
- python-dotenv:管理环境变量(如API密钥)。
此外,如果你选择使用DeepSeek API,需要注册获取API Key,并配置环境变量。我们将在后续章节详细说明。
2.4 架构设计的扩展思考
本节的架构设计虽然简洁,但已经涵盖了RAG的核心要素。在实际生产系统中,你可能还需要考虑:
- 文档解析的鲁棒性:支持更多格式(如扫描件OCR、HTML、Excel)。
- 分块策略优化:根据文档类型调整分块大小和重叠,避免切断语义。
- 混合检索:结合关键词检索(BM25)和向量检索,提高召回率。
- 重排序:对召回片段进行二次排序,将最相关的片段排在前面。
- 对话记忆:在多轮对话中保留历史,实现上下文连贯。
这些进阶主题将在后续章节中逐步展开。