# RAG系统 **Repository Path**: gitgxs/rag-system ## Basic Information - **Project Name**: RAG系统 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-15 - **Last Updated**: 2025-10-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 一、整体架构设计 **项目结构** ``` flask_rag_app/ ├── app.py # Flask 主程序 ├── static/ │ └── style.css # 页面样式 └── templates/ └── index.html # 前端页面 ├── bge-m3 # 向量模型 ├── bge-reranker-v2-m3 # 重排模型 ├── chatglm3-6b # 生成模型 ├── faiss_index # 向量后的数据 ``` 系统采用 前后端分离 的架构,后端使用 Flask 提供 REST API 服务。整体分为以下几个模块: 1. **数据加载与预处理模块** - 负责读取 PDF 或文本文件,使用 PyPDFLoader 将其分段并清洗文本。 - 采用 RecursiveCharacterTextSplitter 将长文本按语义边界进行分块,以便后续向量化。 2. **向量化与向量数据库模块** - 使用本地 bge-large-zh-v1.5 模型生成文本向量。 - 使用 FAISS 作为向量数据库,用于高效的相似度搜索。 - 每个文档的段落向量及元数据存储在 FAISS 索引中。 3. **检索与重排序模块** - 检索阶段:通过向量相似度检索出最相关的若干文档片段。 - 重排序阶段:采用 bge-reranker 模型进一步优化候选文档的排序,提高结果精度。 4. **生成回答模块** - 简单 RAG:直接将检索出的文本拼接后作为上下文输入至生成模型。 - 高级 RAG:结合重排序结果、BM25 传统检索结果、上下文压缩和 query 改写,实现更精细的知识增强生成。 5. **API 服务模块** - 提供ask接口,用于生成回复内容。 - 支持 JSON 格式的请求和响应,方便与前端交互。 6. **可视化界面** - 通过简单的前端页面,用户可上传文件、输入问题并查看回答。 - 同时展示简单 RAG 与高级 RAG 的回答对比。 | 模块 | 技术选型 | 选型原因 | | ------------ | -------------------------------------------------- | -------------------------------------------- | | 文档加载 | `langchain_community.document_loaders.PyPDFLoader` | 稳定、支持多页 PDF 解析,集成便捷 | | 文本切分 | `RecursiveCharacterTextSplitter` | 可保持语义连贯,防止切分断句造成语义丢失 | | 向量模型 | `bge-large-zh-v1.5` | 中文表现优异,兼容 HuggingFace,适合本地部署 | | 向量数据库 | `FAISS` | 支持高维向量检索、内存高效、查询速度快 | | 重排序模型 | `bge-reranker` | 能在多候选结果中优化排序,提高检索精度 | | 文本检索算法 | `BM25Okapi` | 提供传统基于关键词的检索,用于对比与融合 | | 后端框架 | `Flask` | 轻量、易扩展、便于快速原型开发 | | 语言模型 | ChatGLM | 方便进行本地问答生成,保证隐私与响应速度 | #### 二、运行环境 **硬件环境要求** | 资源类型 | 推荐配置 | 说明 | | ----------- | ---------------- | ----------------------------------------------- | | CPU | ≥ 4 核 | 向量化与模型推理需要较强计算力 | | 内存 | ≥ 16 GB | 文档向量化和索引构建阶段占用较高内存 | | GPU(可选) | NVIDIA 8GB+ 显存 | 若启用 GPU 加速向量化与生成模型,可显著提升性能 | | 磁盘空间 | ≥ 10 GB | 存储模型权重、索引文件、缓存数据 | **软件要求** | 软件名称 | 版本 | | --------- | ------- | | python | >= 3.10 | | anaconda3 | 无 | 以上软件环境准备其一即可 使用anaconda3时需要先创建并激活conda环境命令如下: 1. 创建conda环境:`conda create -n 环境名称 python=3.10` 2. 激活环境:`conda activate 环境名称` **依赖安装** 1. 首先进入到 [pytorch](https://pytorch.org/) 官网,来到下图位置执行pip安装命令来安装torch。 ![./images/](./images/wechat_2025-10-15_184853_308.png) 2. 接着进入项目找到`requirements.txt`文件,执行`pip install -r requirements.txt`来安装相关依赖包。 **项目运行** 进入项目根目录后运行:`python app.py` 若正常启动则会显示如下图: ![](./images/wechat_2025-10-15_185410_186.png) #### 三、成果展示 ##### **简单RAG** ![](./images/rag/wechat_2025-10-15_181308_037.png) ![](./images/rag/wechat_2025-10-15_181345_054.png) ##### **高级RAG(混合检索 + 重排)** ![](./images/rag+rerank/wechat_2025-10-15_182031_026.png) ![](./images/rag+rerank/wechat_2025-10-15_182100_071.png) ##### **差异**对比 **整体表现差异** | 对比维度 | 简单 RAG | 高级 RAG | | ------------ | ------------------------------------------------ | ------------------------------------------------------------ | | 检索方式 | 仅向量检索(语义相似度) | 混合检索 + 重排(语义 + BM25 + reranker) | | 检索片段内容 | 内容相关但集中于介绍性描述(如模型规模、用途等) | 内容更全面,涉及模型结构、训练数据、优化器、学习率等技术细节 | | 回答内容 | 概括性较强,偏向宏观总结 | 细节更丰富,包含具体技术改进点 | | 回答逻辑 | 逻辑清晰但信息层次单一 | 信息结构化更好、逻辑递进更自然 | **二、检索阶段的差异分析** 简单 RAG(仅向量检索) - 检索片段主要来自论文前言部分,内容集中在: - 模型总体介绍(Llama 2 的规模、性能、对话能力等); - 对比 Llama 1 时的总体提升描述。 - 局限:向量检索偏重语义相似度,导致召回片段多为“语义接近问题表述”的句子,但不一定包含“关键改进点”的细节信息。 举例:模型只检索到“Llama 2 scales to 70B parameters, performs better on benchmarks”,缺乏“GQA、数据清洗、优化器”等细节。 高级 RAG(混合检索 + 重排) - 通过先混合 BM25 与向量召回,再使用 reranker 重排,检索片段包含: - 模型结构改进(GQA、上下文长度); - 数据清洗与数据来源; - 优化器与学习率调度。 - 结果:召回内容更精确地覆盖了“Llama 2 相比 Llama 1 的改进点”,为生成层提供了高质量证据。 **三、生成阶段的差异分析** 简单 RAG - 优点: - 内容简洁、逻辑清晰; - 能正确总结出三个核心改进方向(规模、微调、性能)。 - 缺点: - 信息层次较浅; - 缺乏数据与训练方法的细节; - 回答偏“概述型总结”,像百科条目而非技术分析。 这说明模型在生成时主要依赖通用知识与高层语义,而非具体检索证据。 高级 RAG - 优点: - 回答包含更多具体技术细节(如 GQA、AdamW 参数、学习率方案等); - 信息结构更丰富,逻辑递进自然(从规模→数据→训练→优化→学习率); - 生成内容明显结合了检索片段中的具体词汇与术语。 - 缺点: - 信息略显繁杂,少部分细节如 AdamW 超参可能对非技术读者过深。 | 原因类型 | 具体影响 | | ------------------ | ------------------------------------------------------------ | | **检索策略差异** | 高级 RAG 引入混合检索与 reranker,使得召回的片段更精准、覆盖度更广,从而支撑了细节更完整的回答。简单 RAG 的纯向量召回在语义上贴合问题,但忽略了关键词匹配的重要性。 | | **证据质量差异** | 高级 RAG 的检索结果中包含了训练细节(如数据清洗、GQA、AdamW 等),这些都是模型生成更技术化答案的关键。 | | **生成上下文差异** | 高级 RAG 模型在构造提示(prompt)时可能使用了更强的“基于证据生成”模板,引导模型引用检索内容,而非依赖内部知识库。 | | **重排序机制** | reranker 在得分排序时能过滤掉语义相似但信息空洞的段落,优先选出“信息密度高”的文本,为生成层提供更具解释力的依据。 |