在检索增强生成(RAG)技术飞速发展的当下,传统一体化链路设计逐渐暴露出灵活性不足、迭代效率低、场景适配难等关键问题,难以满足多样化的业务需求和快速的技术迭代节奏。为解决这一痛点,本项目提出模块化 RAG 链路设计方案,将完整的 RAG 链路解耦为可独立运行、即插即用的子模块,通过标准化接口实现模块间的灵活组合,最终构建兼具稳定性与扩展性的检索增强系统。
模块化解耦的核心思路在于 “拆分复杂系统、明确模块职责、标准化接口交互”。这种设计不仅能让 RAG 链路更好地适应技术迭代(如替换更优的 embedding 模型、检索算法)、业务变化(如适配文档问答、知识库问答等不同场景)和规模化需求(如分布式部署、多数据源接入),也是构建灵活、高效、可扩展检索增强系统的关键基础。
本项目将 RAG 链路分为离线链路(数据预处理与存储)和在线链路(查询处理与生成)两大模块,各模块包含多个可替换的算子,所有算子均遵循统一的输入输出接口规范,确保 “即插即用”。
离线链路主要负责将原始文档转化为可检索的向量数据,存入向量数据库,为在线检索提供数据支撑。
| 算子名称 | 核心功能 | 主流实现方法 | 代码实现与接口规范 |
|---|---|---|---|
| 文档解析 | 将多种格式的原始文档(如 PDF、Word、TXT、Markdown 等)解析为结构化文本数据 | MinerU(多格式文档解析工具)、 DeepSeek-OCR(图文混合文档 OCR 解析)、 PaddleOCR(开源 OCR 工具)、 PyPDF2(PDF 解析)等 | 文档解析模块目录 输入:原始文档文件路径 / 二进制流 输出:结构化文本(JSON 格式,包含段落 ID、文本内容、页码等元信息) |
| 文档切片 | 将长文本拆分为适合 embedding 的短文本片段(Chunk),平衡检索精度与召回率 | 递归切片(Recursive Chunking,按段落 / 句子递归拆分)、 语义切片(基于语义相似度拆分,如 Sentence-BERT、LumberChunk)、 固定长度切片(按字符 /token 数拆分) | 文档切片模块目录 输入:结构化文本(文档解析模块输出) 输出:切片列表(JSON 格式,包含切片 ID、文本内容、所属文档 ID 等元信息) |
| 文本向量化 | 将切片后的文本转化为低维稠密向量,捕捉文本语义信息 | Bge-embedding(开源高效 embedding 模型)、 Qwen-embedding(通义千问系列 embedding 模型)、 OpenAI Embeddings(闭源 API) | 文本向量化模块目录 输入:切片列表(文档切片模块输出) 输出:向量列表(JSON 格式,包含切片 ID、向量数据、文本内容等) |
| 向量数据库存储 | 将文本向量与元信息存入向量数据库,支持高效的相似性检索 | Elasticsearch(搜索引擎,支持向量检索与关键词检索混合)、 FAISS(Facebook 开源向量检索库,适合单机场景)、 Milvus(分布式向量数据库,适合大规模场景)、 Chroma(轻量级开源向量数据库) | 向量存储模块目录 输入:向量列表(文本向量化模块输出) 输出:存储成功 / 失败状态(含索引 ID、存储耗时等元信息) |
| ... | ... | ... | ... |
在线链路主要负责接收用户查询(Query),通过检索、重排序等操作获取相关上下文,最终结合 LLM 生成精准回答。
| 算子名称 | 核心功能 | 主流实现方法 | 代码实现与接口规范 |
|---|---|---|---|
| Query 优化 | 对用户原始 Query 进行改写、拆解或扩展,提升后续检索的召回率与精度 | Query 改写(基于 LLM 优化表述,如 “怎么用 RAG?”→“如何构建检索增强生成(RAG)系统并应用于文档问答场景?”)、 Query 拆解(将复杂 Query 拆分为子 Query,如 “RAG 和 Fine-tuning 的区别与适用场景”→拆分为 “RAG 和 Fine-tuning 的区别”“RAG 的适用场景”“Fine-tuning 的适用场景”)、 关键词提取(提取 Query 中的核心关键词,辅助关键词检索) | Query 优化模块目录 输入:用户原始 Query(字符串) 输出:优化后的 Query 列表 / 关键词列表(JSON 格式) |
| 文本召回 | 根据优化后的 Query 从向量数据库中检索相关文本切片,获取候选上下文 | 关键词检索(基于 Elasticsearch 等搜索引擎的全文匹配)、 向量化检索(基于向量相似度的近邻检索,如 FAISS 的 IVF_FLAT、Milvus 的 HNSW)、 混合检索(融合关键词检索与向量化检索结果,提升召回率); 关键词检索优化(如 BM25 算法、同义词扩展、停用词过滤) | 文本召回模块目录 输入:优化后的 Query / 关键词(Query 优化模块输出) 输出:召回结果列表(JSON 格式,包含切片 ID、文本内容、相似度得分等) |
| 重排序 | 对召回的候选文本进行二次排序,筛选出与 Query 最相关的文本,提升精度 | Bge-rerank(开源重排序模型)、 Qwen-rerank(通义千问系列重排序模型) | 重排序模块目录 输入:召回结果列表(文本召回模块输出)、原始 Query 输出:重排序后的结果列表(JSON 格式,包含排序后的切片、最终得分等) |
| 生成 | 结合重排序后的上下文与 LLM,生成准确、简洁的回答,优化生成策略 | 生成策略(如 “上下文 + Query”prompt 构造、 少样本提示(Few-shot Prompting)、 思维链提示(Chain of Thought)); LLM 支持(如 ChatGLM、Qwen、Llama、GPT 系列) | 生成模块目录 输入:重排序后的结果列表(重排序模块输出)、原始 Query 输出:最终回答(字符串)、生成日志(含 LLM 调用信息、耗时等) |
| ... | ... | ... | ... |
基于上述算子的灵活组合,本项目将实现多种主流 RAG 策略,后续将持续扩展:
| 策略名称 | 核心逻辑 | 适用场景 | 实现代码目录 |
|---|---|---|---|
| 基础 RAG | Query 优化 → 向量化检索 → 重排序 → LLM 生成 | 通用文档问答、知识库查询 | 基础 RAG 策略 |
| 混合检索 RAG | Query 优化 → 关键词检索 + 向量化检索(并行) → 结果融合 → 重排序 → LLM 生成 | 长文档问答、多数据源检索 | 混合检索 RAG 策略 |
| 多轮对话 RAG | 历史对话记忆 → Query 优化(结合历史上下文) → 文本召回 → 重排序 → LLM 生成 | 多轮连续问答、上下文依赖场景 | 多轮对话 RAG 策略 |
| 子 Query 拆分 RAG | 复杂 Query 拆解 → 子 Query 召回 → 子结果汇总 → 重排序 → LLM 生成 | 复杂问题拆解、多维度查询 | 子 Query 拆分 RAG 策略 |
| ... | ... | ... | ... |
...
文本分块模块README—简介、主流文本分块方法调研、对比
开发递归切片算法,支持自定义段落分隔符(如 \n\n、。、;#/##等标题)、支持固定长度
实现语义切片
其他前沿切片策略
...
开发切片效果评估工具,例如,计算切片的语义完整性
补充切片模块的接口文档,明确各参数的默认值、可选范围及使用场景(如长文档用递归切片,短文档用固定长度切片)、不同切片方法与向量数据库的配合等
...
...
...
...
...
...
...
...
...
RAG策略持续更新...
Awesome_RAG/
├── offline/ # 离线链路模块
│ ├── document_parsing/ # 文档解析(MinerU、DeepSeek-OCR等)
│ │ ├── __init__.py
│ │ ├── mineru_parser.py # MinerU解析实现
│ │ └── ...
│ ├── document_chunking/ # 文档切片(递归、语义等)
│ ├── text_embedding/ # 文本向量化(Bge-embedding等)
│ └── vector_storage/ # 向量数据库存储(FAISS、Elasticsearch等)
├── online/ # 在线链路模块
│ ├── query_optimization/ # Query优化(改写、拆解等)
│ ├── text_retrieval/ # 文本召回(关键词、向量化等)
│ ├── text_reranking/ # 重排序(Bge-rerank等)
│ └── text_generation/ # 生成(LLM调用、prompt策略等)
├── strategies/ # RAG策略实现
│ ├── basic_rag/ # 基础RAG策略
│ ├── hybrid_retrieval_rag/ # 混合检索RAG策略
│ ├── multi_turn_rag/ # 多轮对话RAG策略
│ └── subquery_rag/ # 子Query拆分RAG策略
├── common/ # 通用工具模块
│ ├── log_manager.py # 日志管理
│ ├── config_center.py # 配置中心
│ └── data_cleaner.py # 数据清洗
├── docs/ # 项目文档
│ ├── api_docs/ # API文档
│ ├── dev_guide/ # 开发指南
│ ├── faq.md # 常见问题
│ └── interface_specification.md # 接口规范
├── tests/ # 测试代码
│ ├── test_offline/ # 离线链路测试
│ ├── test_online/ # 在线链路测试
│ └── test_strategies/ # 策略测试
├── config/
│ ├── ...
├── requirements.txt # 项目依赖
└── README.md # 项目说明(本文档)
# 克隆项目
git clone https://github.com/xxx.git
cd xxx
# 安装基础依赖
pip install -r requirements.txt
# 安装可选依赖(根据使用的算子选择,如xxx)
修改 config.yaml 关键配置(根据实际需求调整):
# 离线链路配置
offline:
document_parsing:
parser_type: "mineru" # 可选:mineru、paddle_ocr、deepseek_ocr
batch_size: 10 # 批量解析文档数量
text_embedding:
model_name: "BAAI/bge-base-zh" # embedding模型
device: "cuda" # 可选:cuda、cpu
vector_storage:
db_type: "faiss" # 可选:faiss、elasticsearch、milvus
faiss_index_path: "./vector_index/faiss_index" # FAISS索引存储路径
# 在线链路配置
online:
query_optimization:
enable_rewrite: True # 是否开启Query改写
enable_split: True # 是否开启Query拆分
text_retrieval:
top_k: 20 # 召回数量
similarity_threshold: 0.5 # 相似度阈值
text_generation:
llm_type: "qwen" # 可选:qwen、chatglm、openai
qwen_model_path: "./models/qwen-7b-chat" # 本地LLM路径
42 commits
Python
99.8%
在检索增强生成(RAG)技术飞速发展的当下,传统一体化链路设计逐渐暴露出灵活性不足、迭代效率低、场景适配难等关键问题,难以满足多样化的业务需求和快速的技术迭代节奏。为解决这一痛点,本项目提出模块化 RAG 链路设计方案,将完整的 RAG 链路解耦为可独立运行、即插即用的子模块,通过标准化接口实现模块间的灵活组合,最终构建兼具稳定性与扩展性的检索增强系统。
模块化解耦的核心思路在于 “拆分复杂系统、明确模块职责、标准化接口交互”。这种设计不仅能让 RAG 链路更好地适应技术迭代(如替换更优的 embedding 模型、检索算法)、业务变化(如适配文档问答、知识库问答等不同场景)和规模化需求(如分布式部署、多数据源接入),也是构建灵活、高效、可扩展检索增强系统的关键基础。
本项目将 RAG 链路分为离线链路(数据预处理与存储)和在线链路(查询处理与生成)两大模块,各模块包含多个可替换的算子,所有算子均遵循统一的输入输出接口规范,确保 “即插即用”。
离线链路主要负责将原始文档转化为可检索的向量数据,存入向量数据库,为在线检索提供数据支撑。
| 算子名称 | 核心功能 | 主流实现方法 | 代码实现与接口规范 |
|---|---|---|---|
| 文档解析 | 将多种格式的原始文档(如 PDF、Word、TXT、Markdown 等)解析为结构化文本数据 | MinerU(多格式文档解析工具)、 DeepSeek-OCR(图文混合文档 OCR 解析)、 PaddleOCR(开源 OCR 工具)、 PyPDF2(PDF 解析)等 | 文档解析模块目录 输入:原始文档文件路径 / 二进制流 输出:结构化文本(JSON 格式,包含段落 ID、文本内容、页码等元信息) |
| 文档切片 | 将长文本拆分为适合 embedding 的短文本片段(Chunk),平衡检索精度与召回率 | 递归切片(Recursive Chunking,按段落 / 句子递归拆分)、 语义切片(基于语义相似度拆分,如 Sentence-BERT、LumberChunk)、 固定长度切片(按字符 /token 数拆分) | 文档切片模块目录 输入:结构化文本(文档解析模块输出) 输出:切片列表(JSON 格式,包含切片 ID、文本内容、所属文档 ID 等元信息) |
| 文本向量化 | 将切片后的文本转化为低维稠密向量,捕捉文本语义信息 | Bge-embedding(开源高效 embedding 模型)、 Qwen-embedding(通义千问系列 embedding 模型)、 OpenAI Embeddings(闭源 API) | 文本向量化模块目录 输入:切片列表(文档切片模块输出) 输出:向量列表(JSON 格式,包含切片 ID、向量数据、文本内容等) |
| 向量数据库存储 | 将文本向量与元信息存入向量数据库,支持高效的相似性检索 | Elasticsearch(搜索引擎,支持向量检索与关键词检索混合)、 FAISS(Facebook 开源向量检索库,适合单机场景)、 Milvus(分布式向量数据库,适合大规模场景)、 Chroma(轻量级开源向量数据库) | 向量存储模块目录 输入:向量列表(文本向量化模块输出) 输出:存储成功 / 失败状态(含索引 ID、存储耗时等元信息) |
| ... | ... | ... | ... |
在线链路主要负责接收用户查询(Query),通过检索、重排序等操作获取相关上下文,最终结合 LLM 生成精准回答。
| 算子名称 | 核心功能 | 主流实现方法 | 代码实现与接口规范 |
|---|---|---|---|
| Query 优化 | 对用户原始 Query 进行改写、拆解或扩展,提升后续检索的召回率与精度 | Query 改写(基于 LLM 优化表述,如 “怎么用 RAG?”→“如何构建检索增强生成(RAG)系统并应用于文档问答场景?”)、 Query 拆解(将复杂 Query 拆分为子 Query,如 “RAG 和 Fine-tuning 的区别与适用场景”→拆分为 “RAG 和 Fine-tuning 的区别”“RAG 的适用场景”“Fine-tuning 的适用场景”)、 关键词提取(提取 Query 中的核心关键词,辅助关键词检索) | Query 优化模块目录 输入:用户原始 Query(字符串) 输出:优化后的 Query 列表 / 关键词列表(JSON 格式) |
| 文本召回 | 根据优化后的 Query 从向量数据库中检索相关文本切片,获取候选上下文 | 关键词检索(基于 Elasticsearch 等搜索引擎的全文匹配)、 向量化检索(基于向量相似度的近邻检索,如 FAISS 的 IVF_FLAT、Milvus 的 HNSW)、 混合检索(融合关键词检索与向量化检索结果,提升召回率); 关键词检索优化(如 BM25 算法、同义词扩展、停用词过滤) | 文本召回模块目录 输入:优化后的 Query / 关键词(Query 优化模块输出) 输出:召回结果列表(JSON 格式,包含切片 ID、文本内容、相似度得分等) |
| 重排序 | 对召回的候选文本进行二次排序,筛选出与 Query 最相关的文本,提升精度 | Bge-rerank(开源重排序模型)、 Qwen-rerank(通义千问系列重排序模型) | 重排序模块目录 输入:召回结果列表(文本召回模块输出)、原始 Query 输出:重排序后的结果列表(JSON 格式,包含排序后的切片、最终得分等) |
| 生成 | 结合重排序后的上下文与 LLM,生成准确、简洁的回答,优化生成策略 | 生成策略(如 “上下文 + Query”prompt 构造、 少样本提示(Few-shot Prompting)、 思维链提示(Chain of Thought)); LLM 支持(如 ChatGLM、Qwen、Llama、GPT 系列) | 生成模块目录 输入:重排序后的结果列表(重排序模块输出)、原始 Query 输出:最终回答(字符串)、生成日志(含 LLM 调用信息、耗时等) |
| ... | ... | ... | ... |
基于上述算子的灵活组合,本项目将实现多种主流 RAG 策略,后续将持续扩展:
| 策略名称 | 核心逻辑 | 适用场景 | 实现代码目录 |
|---|---|---|---|
| 基础 RAG | Query 优化 → 向量化检索 → 重排序 → LLM 生成 | 通用文档问答、知识库查询 | 基础 RAG 策略 |
| 混合检索 RAG | Query 优化 → 关键词检索 + 向量化检索(并行) → 结果融合 → 重排序 → LLM 生成 | 长文档问答、多数据源检索 | 混合检索 RAG 策略 |
| 多轮对话 RAG | 历史对话记忆 → Query 优化(结合历史上下文) → 文本召回 → 重排序 → LLM 生成 | 多轮连续问答、上下文依赖场景 | 多轮对话 RAG 策略 |
| 子 Query 拆分 RAG | 复杂 Query 拆解 → 子 Query 召回 → 子结果汇总 → 重排序 → LLM 生成 | 复杂问题拆解、多维度查询 | 子 Query 拆分 RAG 策略 |
| ... | ... | ... | ... |
...
文本分块模块README—简介、主流文本分块方法调研、对比
开发递归切片算法,支持自定义段落分隔符(如 \n\n、。、;#/##等标题)、支持固定长度
实现语义切片
其他前沿切片策略
...
开发切片效果评估工具,例如,计算切片的语义完整性
补充切片模块的接口文档,明确各参数的默认值、可选范围及使用场景(如长文档用递归切片,短文档用固定长度切片)、不同切片方法与向量数据库的配合等
...
...
...
...
...
...
...
...
...
RAG策略持续更新...
Awesome_RAG/
├── offline/ # 离线链路模块
│ ├── document_parsing/ # 文档解析(MinerU、DeepSeek-OCR等)
│ │ ├── __init__.py
│ │ ├── mineru_parser.py # MinerU解析实现
│ │ └── ...
│ ├── document_chunking/ # 文档切片(递归、语义等)
│ ├── text_embedding/ # 文本向量化(Bge-embedding等)
│ └── vector_storage/ # 向量数据库存储(FAISS、Elasticsearch等)
├── online/ # 在线链路模块
│ ├── query_optimization/ # Query优化(改写、拆解等)
│ ├── text_retrieval/ # 文本召回(关键词、向量化等)
│ ├── text_reranking/ # 重排序(Bge-rerank等)
│ └── text_generation/ # 生成(LLM调用、prompt策略等)
├── strategies/ # RAG策略实现
│ ├── basic_rag/ # 基础RAG策略
│ ├── hybrid_retrieval_rag/ # 混合检索RAG策略
│ ├── multi_turn_rag/ # 多轮对话RAG策略
│ └── subquery_rag/ # 子Query拆分RAG策略
├── common/ # 通用工具模块
│ ├── log_manager.py # 日志管理
│ ├── config_center.py # 配置中心
│ └── data_cleaner.py # 数据清洗
├── docs/ # 项目文档
│ ├── api_docs/ # API文档
│ ├── dev_guide/ # 开发指南
│ ├── faq.md # 常见问题
│ └── interface_specification.md # 接口规范
├── tests/ # 测试代码
│ ├── test_offline/ # 离线链路测试
│ ├── test_online/ # 在线链路测试
│ └── test_strategies/ # 策略测试
├── config/
│ ├── ...
├── requirements.txt # 项目依赖
└── README.md # 项目说明(本文档)
# 克隆项目
git clone https://github.com/xxx.git
cd xxx
# 安装基础依赖
pip install -r requirements.txt
# 安装可选依赖(根据使用的算子选择,如xxx)
修改 config.yaml 关键配置(根据实际需求调整):
# 离线链路配置
offline:
document_parsing:
parser_type: "mineru" # 可选:mineru、paddle_ocr、deepseek_ocr
batch_size: 10 # 批量解析文档数量
text_embedding:
model_name: "BAAI/bge-base-zh" # embedding模型
device: "cuda" # 可选:cuda、cpu
vector_storage:
db_type: "faiss" # 可选:faiss、elasticsearch、milvus
faiss_index_path: "./vector_index/faiss_index" # FAISS索引存储路径
# 在线链路配置
online:
query_optimization:
enable_rewrite: True # 是否开启Query改写
enable_split: True # 是否开启Query拆分
text_retrieval:
top_k: 20 # 召回数量
similarity_threshold: 0.5 # 相似度阈值
text_generation:
llm_type: "qwen" # 可选:qwen、chatglm、openai
qwen_model_path: "./models/qwen-7b-chat" # 本地LLM路径
42 commits
Python
99.8%