版权声明: 本项目遵循 MIT 开源协议
RAGPlus Reader 是一个智能文档阅读系统,结合了 RAG(检索增强生成)技术和概念提取功能,让您可以通过自然语言对话的方式深入理解文档内容。
- 🚀 双模式运行:基础模式(快速问答)和增强模式(深度理解)
- 📚 多格式支持:PDF、TXT 文档
- 🧠 本地嵌入:使用本地模型,保护数据隐私
- 💡 智能分块:SAT(语义自适应分块)技术
- 🔍 概念提取:自动提取文档关键概念(增强模式)
- 🌐 API 灵活:支持 Deepseek 和 OpenRouter API
RAG(Retrieval-Augmented Generation)是一种结合了信息检索和文本生成的AI技术。简单来说,它能:
- 将您的文档切分成小块并建立索引
- 当您提问时,找到最相关的文档片段
- 基于这些片段生成准确的回答
打开终端(Windows 用户使用 PowerShell 或 CMD),执行以下命令:
# 克隆项目
git clone https://github.com/AHIJLN/RAGPlus_reader.git
cd RAGPlus_reader
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
## Windows:
venv\Scripts\activate
## macOS/Linux:
source venv/bin/activate
# 运行智能安装脚本(推荐)
python install_requirements.py安装脚本会自动:
- ✅ 检查 Python 版本
- ✅ 安装所有依赖
- ✅ 创建项目目录结构
- ✅ 配置兼容层
- ✅ 生成配置文件模板
编辑项目根目录下的 .env 文件,选择并配置一个 API 服务:
- 访问 https://platform.deepseek.com/api_keys
- 注册并获取 API 密钥
- 在
.env文件中配置:
OPENAI_API_KEY="your-deepseek-api-key-here"
OPENAI_API_BASE="https://api.deepseek.com/v1"
CHAT_MODEL="deepseek-chat"将您要阅读的 PDF 或 TXT 文件放入 data/documents/ 目录:
RAGPlus_reader/
├── data/
│ └── documents/
│ └── your_document.pdf # 在这里放置您的文档python main.py data/documents/your_document.pdfpython main_enhanced.py data/documents/your_document.pdf程序启动后,您可以:
- 直接输入问题进行查询
- 输入
info查看文档信息 - 输入
help查看帮助 - 输入
quit退出程序
示例对话:
> 这篇文档的主要内容是什么?
> 作者提出了哪些关键观点?
> 第三章讲了什么?
RAGPlus_reader/
├── src/ # 源代码目录
│ ├── contextgem_compat/ # ContextGem 兼容层
│ │ ├── __init__.py
│ │ └── core.py # 概念提取核心实现
│ ├── document_loader.py # 文档加载器
│ ├── sat_text_splitter.py # SAT 智能分块器
│ ├── embedding_manager.py # 本地嵌入管理
│ ├── vectorstore_local.py # 向量存储管理
│ ├── rag_chain.py # 基础 RAG 链
│ └── enhanced_rag_chain.py # 增强 RAG 链
├── data/documents/ # 文档存放目录
├── output/ # 输出目录
│ ├── cache/ # 向量存储缓存
│ └── logs/ # 日志文件
├── models/ # 本地嵌入模型
│ └── all-MiniLM-L6-v2/ # 默认嵌入模型
├── main.py # 基础模式入口
├── main_enhanced.py # 增强模式入口
└── .env # 配置文件
文档加载 (document_loader.py)
↓
SAT智能分块 (sat_text_splitter.py)
↓
本地嵌入 (embedding_manager.py)
↓
向量存储 (vectorstore_local.py)
↓
RAG问答 (rag_chain.py / enhanced_rag_chain.py)- 语义识别:识别标题、段落、列表、代码块等结构
- 重要性评分:基于类型、位置、长度计算重要性
- 智能组合:根据语义边界和大小限制组合块
| 特性 | 基础模式 | 增强模式 |
|---|---|---|
| 启动速度 | 快 | 稍慢 |
| 内存占用 | 低 | 中等 |
| 回答质量 | 良好 | 优秀 |
| 概念提取 | ❌ | ✅ |
| 文档洞察 | ❌ | ✅ |
| 适用场景 | 快速查询 | 深度理解 |
编辑 .env 文件:
CHUNK_SIZE=1000 # 目标块大小(字符数)
# 建议值:
# - 技术文档:800-1200
# - 文学作品:1500-2000
# - 学术论文:1000-1500# 清除特定文档的缓存
rm -rf output/cache/your_document_vectorstore
# 禁用缓存运行
python main.py data/documents/your_document.pdf --no-cache在代码中修改:
logging.basicConfig(level=logging.DEBUG) # 详细日志- 使用缓存:第二次加载同一文档会使用缓存,速度提升 10x
- GPU 加速:如果有 NVIDIA GPU,会自动启用 CUDA 加速
- 批量处理:可以修改代码支持目录批量加载
在 enhanced_rag_chain.py 中添加新的概念定义:
@staticmethod
def get_custom_concept():
return JsonObjectConcept(
name="技术术语",
description="文档中的专业术语及其定义",
structure={
"terms": list, # 术语列表
"definitions": dict, # 术语:定义 映射
"categories": list # 术语分类
}
)在 document_loader.py 中添加新的加载器:
def _load_docx(self, file_path: str) -> List[Document]:
"""加载 Word 文档"""
from docx import Document as DocxDocument
doc = DocxDocument(file_path)
text = '\n'.join([paragraph.text for paragraph in doc.paragraphs])
return [Document(page_content=text, metadata={"source": file_path})]
# 注册新格式
self.supported_extensions['.docx'] = self._load_docx替换默认的 all-MiniLM-L6-v2 模型:
- 下载新模型到
models/目录 - 修改初始化参数:
self.vector_manager = LocalVectorStore(
embedding_model="your-custom-model"
)from src.enhanced_rag_chain import EnhancedRAGChain
from src.vectorstore_local import LocalVectorStore
class MyApp:
def __init__(self):
self.vector_store = LocalVectorStore()
self.rag_chain = EnhancedRAGChain(
vectorstore=None,
model_name="deepseek-chat"
)
def process_document(self, file_path):
# 自定义处理逻辑
pass# HTTP 代理
HTTP_PROXY="http://your-proxy:port"
HTTPS_PROXY="http://your-proxy:port"# 在代码中直接配置
llm = ChatOpenAI(
openai_api_base="https://your-custom-endpoint.com/v1",
openai_api_key="your-key",
model_name="custom-model"
)创建 batch_process.py:
import os
from pathlib import Path
from main_enhanced import EnhancedDocumentReader
def batch_process_documents(directory: str):
reader = EnhancedDocumentReader()
for file_path in Path(directory).glob("*.pdf"):
print(f"\n处理文档: {file_path}")
reader.load_document(str(file_path))
# 自动提取关键信息
insights = reader.rag_chain.get_document_insights()
# 保存结果
output_file = f"output/{file_path.stem}_insights.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(insights, f, ensure_ascii=False, indent=2)
if __name__ == "__main__":
batch_process_documents("data/documents")添加性能监控代码:
import time
from functools import wraps
def timing_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗时: {end - start:.2f}秒")
return result
return wrapper
# 应用到关键函数
@timing_decorator
def load_document(self, file_path: str):
# 原有代码A: 首次运行需要下载嵌入模型(约 90MB),之后会使用本地缓存。
A: 建议使用增强模式并启用缓存,处理过的文档会保存向量索引。
A: 检查网络连接和 API 密钥,确保 .env 配置正确。
A: 可以减小 CHUNK_SIZE 或使用基础模式。
- 初学者:使用 Deepseek API + 基础模式开始
- 日常使用:增强模式 + 缓存,获得最佳体验
- 专业分析:自定义概念提取 + 批量处理
- 隐私优先:完全本地化部署(使用本地 LLM)
本项目遵循 MIT 协议,欢迎贡献代码、报告问题或提出建议。
Happy Reading with RAGPlus! 🚀