# Local_Pdf_Chat_RAG **Repository Path**: shenxiaoming77/Local_Pdf_Chat_RAG ## Basic Information - **Project Name**: Local_Pdf_Chat_RAG - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-04 - **Last Updated**: 2025-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

📚 本地化智能问答系统 (FAISS版)

Python版本 证书 RAG类型 界面 向量存储 LLM支持

**一个帮助RAG入门者理解核心组件和流程的本地化智能问答项目**
## 🎯 项目目标与定位 本项目旨在为希望学习和理解RAG(Retrieval-Augmented Generation,检索增强生成)技术的初学者提供一个清晰、可动手实践的起点。在接触如 [Dify](https://dify.ai/)、[RAGFlow](https://github.com/infiniflow/ragflow) 这类高度封装的RAG框架之前,通过本项目的源码和实践,你可以: * **熟悉RAG核心组件**:亲身体验文本加载、切分、向量化、向量存储与检索(本项目使用FAISS)、大模型集成等关键环节。 * **理解RAG基本流程**:从底层脚本层面观察数据如何在RAG系统中流转和处理。 * **进行初步优化与测试**:尝试调整参数、替换模型、优化提示词等,直观感受不同策略对结果的影响。 掌握这些基础后,能更有的放矢地使用高级RAG框架的API进行针对性调优或定制开发。 ## 🌟 核心功能 * 📁 **PDF文档处理**:上传并处理多个PDF文档,自动分割和向量化。 * 🧠 **智能问答**:基于本地文档的精准问答能力。 * 🔍 **混合检索**:结合FAISS进行语义检索和BM25进行关键词检索,提高检索召回率和准确性。 * 🔄 **结果重排序**:支持交叉编码器(CrossEncoder)和LLM对检索结果进行重排序,优化相关性。 * 🌐 **联网搜索增强 (可选)**:通过SerpAPI获取实时网络信息,增强回答的时效性(需配置API密钥)。 * 🗣️ **多LLM支持**:可选择使用本地Ollama大模型(如DeepSeek-R1系列)或云端SiliconFlow API进行推理。 * 迭代式深度检索(递归检索):通过LLM分析当前结果,自动生成后续查询,深入探索问题。 * 📄 **来源标注与矛盾检测 (初步)**:尝试在回答中提供信息来源,并识别潜在信息矛盾。 * 🖥️ **用户友好界面**:基于Gradio构建交互式Web界面,方便文档上传、提问和结果查看。 * 📊 **分块可视化**:在UI上展示文档分块情况,帮助理解数据处理过程。 * 🔒 **本地化优先**:核心数据处理和LLM推理可完全在本地进行,保障数据隐私。 ## 🔧 系统架构 ```mermaid graph TD subgraph "用户交互层" A[Gradio网页界面] --> |用户上传PDF| B(PDF处理模块) A --> |用户提问| C(问答处理模块) end subgraph "数据处理与存储层" B --> |文本提取与分割| D{向量化} D --> E[FAISS向量索引] D --> F[文档内容与元数据存储] C --> |问题向量化| E C --> |获取文档片段| F end subgraph "检索与重排层" E --> |FAISS语义检索| S[检索结果初步筛选] F --> |用于BM25的内容| T[BM25关键词检索] S --> |语义结果| U[混合检索与重排序模块] T --> |BM25结果| U U --> |最终相关上下文| G end subgraph "增强与生成层" C --> |时间敏感或需外部知识| K{联网搜索模块 SerpAPI} K --> |网络信息| G G[LLM推理模块 Ollama/SiliconFlow] --> |生成回答| C C --> |递归查询判断| G end C --> |回答| A ``` ## 🚀 使用方法 ### 环境准备 1. **创建并激活虚拟环境** (推荐使用Python 3.9+): ```bash python -m venv rag_env # Windows rag_env\Scripts\activate # Linux/macOS source rag_env/bin/activate ``` 2. **安装依赖项**: ```bash pip install -r requirements.txt ``` 3. **安装并启动Ollama服务** (如果希望使用本地大模型): * 访问 [https://ollama.com/download](https://ollama.com/download) 下载并安装Ollama。 * 启动Ollama服务: `ollama serve` * 拉取所需模型,例如: `ollama pull deepseek-r1:1.5b` 或 `ollama pull deepseek-r1:7b` (根据您的硬件配置选择)。本项目默认尝试使用`deepseek-r1:1.5b` 和 `deepseek-r1:7b`。 4. **配置API密钥 (可选)**: 在项目根目录创建 `.env` 文件,并按需添加以下内容: ```env # 用于联网搜索 SERPAPI_KEY=您的SERPAPI密钥 # 用于SiliconFlow云端大模型 SILICONFLOW_API_KEY=您的SiliconFlow API密钥 # SILICONFLOW_API_URL=https://api.siliconflow.cn/v1/chat/completions (不需要修改) ``` ### 启动服务 ```bash python rag_demo_pro.py ``` 服务启动后,通常会自动在浏览器中打开 `http://127.0.0.1:17995` (或自动选择的其他可用端口)。 ### 运行日志示例与解读 当您运行 `python rag_demo_pro.py` 并开始使用(例如上传PDF并提问)后,终端会输出详细的运行日志。这些日志对于理解系统内部工作流程至关重要。 一个典型的成功运行片段可能如下所示(已省略部分重复内容和时间戳): ```log INFO:root:成功清理历史FAISS数据和BM25索引 Batches: 100%|██████████| 1/1 [00:02<00:00, 2.71s/it] # 文本块向量化 INFO:root:FAISS索引构建完成,共索引 9 个文本块 Building prefix dict from the default dictionary ... Loading model cost 6.168 seconds. Prefix dict has been built successfully. INFO:root:BM25索引更新完成,共索引 9 个文档 INFO:root:递归检索迭代 1/3,当前查询: 发动机冒蓝烟的故障原因分析 INFO:root:网络搜索返回 5 条结果,这些结果不会被添加到FAISS索引中。 Batches: 100%|██████████| 1/1 [00:00<00:00, 3.53it/s] # 查询向量化 INFO:sentence_transformers.cross_encoder.CrossEncoder:Use pytorch device: cpu INFO:root:交叉编码器加载成功 Batches: 100%|██████████| 1/1 [00:07<00:00, 7.42s/it] # 交叉编码器重排序 INFO:root:使用SiliconFlow API分析是否需要进一步查询 INFO:root:生成新查询: 新查询(如果需要): 1. 涡轮增压器故障是否会引起发动机冒蓝烟? ... INFO:root:递归检索迭代 2/3,当前查询: 新查询(如果需要):... ... INFO:root:递归检索迭代 3/3,当前查询: 新查询:... ...(后续为LLM整合上下文生成最终答案的过程) ``` **日志关键点解读:** * **FAISS与BM25索引构建**:显示了文档处理后向量索引和关键词索引的成功创建。 * **递归检索迭代**:清晰展示了系统如何通过多轮查询(此处配置为3轮)来逐步深化对用户问题的理解和信息召回。 * **模型加载与使用**:包括SentenceTransformer(用于向量化和交叉编码器)、Jieba(用于BM25分词)的加载,以及与LLM(此处为SiliconFlow API)的交互。 * **中间过程**:如网络搜索结果的获取、交叉编码器重排序的时间消耗等,都为性能分析和流程理解提供了线索。 * **LLM生成新查询**:当LLM(如SiliconFlow或Ollama)分析后认为需要更深入的信息时,它会主动生成更具体的新查询点,驱动下一轮的检索,这是高级RAG能力的体现。 建议通过观察这些日志,直观地感受到RAG系统中各个组件是如何协同工作的。 ## 📦 核心依赖 * `gradio`: 构建交互式Web界面。 * `sentence-transformers`: 用于文本向量化和交叉编码器重排序。 * `faiss-cpu`: 高效的向量相似性搜索引擎。 * `langchain-text-splitters`: 仅用于文本分割功能,更加轻量。 * `pdfminer.six`: 从PDF文件中提取文本。 * `rank_bm25`: 实现BM25关键词检计算法。 * `jieba`: 中文分词,用于BM25索引和可能的文本预处理。 * `python-dotenv`: 管理环境变量 (如API密钥)。 * `requests`, `urllib3`: 进行HTTP请求 (如调用SerpAPI, SiliconFlow API, Ollama API)。 * `numpy`: FAISS等库的基础依赖,进行数值计算。 * (可选API服务) `fastapi`, `uvicorn`, `python-multipart`: 如果您想独立运行`api_router.py`提供API服务。 ## 💡 进阶与扩展方向 本项目作为一个入门级的RAG实现,为后续的迭代和功能扩展提供了良好的基础。以下是一些可以考虑的进阶方向: 1. **更精细化的文本切分策略**: * **解释**:当前的`RecursiveCharacterTextSplitter`是通用策略。可以研究并实现基于语义的切分(如使用模型判断句子边界或主题连贯性)、或针对特定文档类型的结构化切分(如解析Markdown标题、表格等)。 * **难度**:中等。 2. **高级FAISS索引与管理**: * **解释**:目前使用的是基础的`IndexFlatL2`。可以尝试更高级的FAISS索引类型,如`IndexIVFPQ`,以优化大规模数据下的检索速度和内存占用。同时,研究如何更优雅地支持对FAISS中向量的删除和更新(例如,使用`IndexIDMap`)。 * **难度**:中等至困难。 3. **多元数据源接入**: * **解释**:目前主要处理PDF和可选的网络搜索。可以扩展支持导入其他格式的本地文档(如`.txt`, `.md`, `.docx`),或者接入外部API(如Notion、Confluence等知识库)。 * **难度**:中等。 4. **查询改写与意图识别**: * **解释**:在进行检索前,使用LLM对用户的原始查询进行改写(如纠错、同义词扩展、澄清模糊表述)或识别用户真实意图,可以提高检索的精准度。 * **难度**:中等。 5. **上下文管理与压缩**: * **解释**:当检索到的相关片段过多,超出LLM的上下文窗口限制时,需要有效的上下文压缩策略(如筛选最重要片段、总结次要片段)来保证信息质量。 * **难度**:中等。 6. **更复杂的重排序模型/策略**: * **解释**:除了当前的交叉编码器和基于LLM打分,可以尝试集成更先进的重排序模型,或实现多阶段重排序策略。 * **难度**:中等至困难。 7. **答案生成效果评估与追溯**: * **解释**:引入简单的评估机制(如用户反馈、答案与来源的相似度计算)和更清晰的答案来源追溯展示,帮助分析和改进系统表现。 * **难度**:中等。 欢迎大家基于此项目进行探索和贡献! ## 🚀 进一步学习与交流 本项目旨在提供一个RAG入门的练手平台。如果你对企业级RAG的深入实践、复杂场景应用、性能优化以及最新技术进展感兴趣,欢迎加入我的知识星球 **"企业RAG从入门到落地"** 进行更深入的学习和交流。
公众号

公众号: 韦东东

小红书

小红书: 韦东东

知识星球

知识星球: 企业RAG从入门到落地

## 📝 许可证 本项目采用MIT许可证。