# RAG系统实战 - 投资方法论知识库 基于 LangChain 构建的检索增强生成(RAG)系统,用于对《疯狂的里海 · 投资方法论》进行智能问答。 ## 功能特性 - **PDF文档加载**:使用 PyMuPDFLoader 快速加载PDF文档 - **数据清洗**:自动清洗PDF解析产生的噪声(换行符、特殊符号、多余空格等) - **智能分块**:使用递归字符分割器,保持语义完整性 - **向量化存储**:使用阿里通义 Embedding 模型进行向量化,存储到 ChromaDB - **智能检索**:基于余弦相似度检索最相关的文档片段 - **答案生成**:使用通义千问大模型生成准确回答 ## 系统架构 ``` 用户问题 ↓ 检索器将问题转为向量 ↓ 在向量库中查找语义最近的文档块 ↓ 返回 Top-K 相关文档 ↓ 拼接上下文 + 问题 → 大模型生成答案 ``` ## 环境要求 ### 1. 安装依赖 ```bash pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple ``` ### 2. 配置 API Key 在项目根目录的 `.env` 文件中配置以下API Key: ```env # DeepSeek API(用于大语言模型) OPENAI_API_KEY=your_deepseek_api_key OPENAI_API_BASE=https://api.deepseek.com/v1 MODEL_NAME=deepseek-chat # DashScope API(用于文本向量化) DASHSCOPE_API_KEY=your_dashscope_api_key EMBEDDING_MODEL=text-embedding-v3 ``` **获取 API Key**: 1. **DeepSeek API Key**: 访问 [DeepSeek官网](https://platform.deepseek.com/) 注册并获取 2. **DashScope API Key**: 访问 [阿里云DashScope控制台](https://dashscope.console.aliyun.com/) 获取 ### 3. 技术栈 - **大语言模型**: DeepSeek(通过OpenAI兼容接口) - **Embedding模型**: 阿里通义 text-embedding-v3 - **向量数据库**: ChromaDB - **框架**: LangChain ## 使用方法 ### 方式1:运行完整系统 ```bash python 02_RAG_task.py ``` 首次运行会自动构建知识库: 1. 加载 PDF 文档 2. 清洗数据 3. 分块处理 4. 向量化并存储 后续运行会直接加载已有的向量数据库。 ### 方式2:在代码中调用 ```python from 02_RAG_task import RAGSystem # 创建 RAG 系统实例 rag = RAGSystem( pdf_path=r"D:\investment\疯狂的里海 · 投资方法论 — 基于 367 篇投资周记提炼.pdf", persist_directory="./investment_knowledge_db" ) # 构建知识库(首次运行) rag.build_knowledge_base() # 或者加载已有知识库 # rag.load_vectorstore() # rag.create_retriever() # 提问 answer = rag.query("什么是价值投资的核心原则?") print(answer) ``` ### 方式3:分步骤调用 ```python # 步骤1:加载文档 pages = rag.load_pdf() # 步骤2:清洗数据 rag.clean_all_pages() # 步骤3:分块 docs = rag.split_documents(chunk_size=800, chunk_overlap=160) # 步骤4:创建向量库 vectorstore = rag.create_vectorstore() # 步骤5:创建检索器 retriever = rag.create_retriever(k=3) # 步骤6:检索相关文档 relevant_docs = rag.retrieve("投资策略有哪些?") # 步骤7:生成答案 answer = rag.generate_answer("投资策略有哪些?", relevant_docs) ``` ## 参数说明 ### 分块参数 - `chunk_size`:每个块的最大字符数(推荐 500-1000) - `chunk_overlap`:相邻块之间的重叠字符数(推荐 chunk_size 的 10%-20%) ```python # 调整分块大小 rag.split_documents(chunk_size=1000, chunk_overlap=200) ``` ### 检索参数 - `k`:返回的最相关文档数量(推荐 3-5) ```python # 返回更多相关文档 rag.create_retriever(k=5) ``` ## 目录结构 ``` 02_RAG_study/ ├── 02_RAG_task.py # RAG系统主程序 ├── README_RAG.md # 本说明文档 ├── investment_knowledge_db/ # 向量数据库存储目录(自动生成) │ ├── chroma.sqlite3 │ └── ... ├── rag_test.ipynb # 测试笔记本 └── 3.RAG系统搭建实战.md # RAG系统搭建教程 ``` ## 常见问题 ### 1. 提示 "未设置 DASHSCOPE_API_KEY" **原因**:环境变量未配置 **解决**:在 `.env` 文件中添加 `DASHSCOPE_API_KEY=your-api-key` ### 2. PDF 文件不存在 **原因**:PDF 路径配置错误 **解决**:修改 `main()` 函数中的 `pdf_path` 变量,指向正确的 PDF 文件路径 ### 3. 向量数据库加载失败 **原因**:向量数据库损坏或版本不兼容 **解决**:删除 `investment_knowledge_db` 目录,重新构建知识库 ### 4. 检索效果不佳 **优化建议**: - 调整 `chunk_size` 和 `chunk_overlap` 参数 - 增加 `k` 值以获取更多相关文档 - 检查数据清洗是否充分 ## 技术栈 - **LangChain**:LLM 应用开发框架 - **PyMuPDF**:PDF 解析库 - **ChromaDB**:向量数据库 - **DashScope**:阿里云大模型服务 - text-embedding-v3:文本向量化模型 - qwen-plus:大语言模型 ## 注意事项 1. **API 密钥安全**:不要将 API Key 提交到代码仓库 2. **成本控制**:向量化过程会产生 API 调用费用,建议复用已有向量库 3. **中文优化**:本系统针对中文文档优化,使用通义千问 Embedding 模型 4. **分块质量**:分块策略对 RAG 效果影响很大,建议根据文档特点调整参数 ## 扩展功能 可以基于此系统扩展: 1. **多文档支持**:加载多个 PDF 文档 2. **对话历史**:添加记忆功能,支持多轮对话 3. **混合检索**:结合关键词检索和语义检索 4. **流式输出**:实现打字机效果的答案输出 5. **Web界面**:使用 Streamlit 或 Gradio 构建 Web 界面 ## 许可证 MIT License