# 本地 PDF RAG 问答系统
一个基于 Python + LangChain + ChromaDB + 阿里通义 Qwen 的本地 RAG(Retrieval-Augmented Generation)项目,支持上传中文 PDF 文档(尤其是由 Word 转 PDF 的报告类文件),构建知识库后可在浏览器中进行智能问答。
当前切片策略:**每页 PDF 一个 chunk**(26 页 PDF → 26 个 chunk),适合中文企业报告、政策文件等结构化文档,检索准确率高、可追溯页码。
## 功能特性
- 支持中文 PDF(由 Word 转 PDF 的报告最优)
- 使用阿里云 DashScope text-embedding-v4 向量化 + Qwen Plus 生成答案
- ChromaDB 本地持久化向量库
- Streamlit 提供简洁聊天网页界面
- 配置全部通过 `.env` 文件管理
- 提供调试脚本 `query_chroma.py` 查看任意 chunk 完整内容和向量
## 前置要求
- macOS / Linux / Windows(已测试 macOS)
- Python 3.10+(推荐 3.12)
- Homebrew(macOS 用户强烈推荐)
## 安装步骤
### 1. 安装系统依赖
#### macOS(推荐使用 Homebrew)
```bash
# 安装 Poppler(PDF 解析必需)
brew install poppler
# 安装 Tesseract OCR + 中文语言包(消除 Unstructured 警告,提升扫描件识别能力)
brew install tesseract
brew install tesseract-lang # 包含 chi_sim(简体中文)sudo apt update
sudo apt install poppler-utils tesseract-ocr libtesseract-dev tesseract-ocr-chi-sim- 下载安装 Poppler:https://github.com/oschwartz10612/poppler-windows/releases
- 将 bin 目录添加到 PATH
- 下载安装 Tesseract:https://github.com/UB-Mannheim/tesseract/wiki
- 安装中文语言包 chi_sim.traineddata 到 tessdata 目录
mkdir rag-for-pdf && cd rag-for-pdf
# 将本项目的 Python 文件放入当前目录python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install langchain langchain-community langchain-chroma \
dashscope unstructured[pdf] streamlit chromadb \
python-dotenv- 登录阿里云百炼平台:https://dashscope.aliyun.com
- 创建或查看 API Key(免费试用有额度)
- 复制 Key(格式类似
sk-xxxxxx)
在项目根目录创建 .env 文件,内容如下(根据实际情况修改):
# 阿里云 DashScope API Key(必须)
DASHSCOPE_API_KEY=sk-你的真实APIKey
# PDF 文件夹(存放要处理的 PDF)
PDF_FOLDER=docs
# Chroma 向量库保存路径
CHROMA_DB_PATH=chroma_db
# 切片参数(中文报告推荐值,可根据需要调大)
CHUNK_SIZE=2200
CHUNK_OVERLAP=500
# Unstructured OCR 语言设置(优先中文)
UNSTRUCTURED_LANGUAGES=["chi_sim", "eng"]将你的 PDF 文件放入 docs/ 目录(项目会自动创建该文件夹)。
# 删除旧向量库(推荐首次或 PDF 变更时)
rm -rf chroma_db
python build_vectorstore.py脚本会自动:
- 加载 PDF
- 按页合并内容(一页一个大文档)
- 切片(默认约等于页数个 chunk)
- 向量化并保存到本地
python query_chroma.py可交互式搜索 chunk 或查看指定 chunk_id 的完整内容。
streamlit run app.py浏览器会自动打开(通常 http://localhost:8501),即可像 ChatGPT 一样提问 PDF 内容。
build_vectorstore.py:构建向量库主脚本app.py:Streamlit 网页问答界面query_chroma.py:调试用,查看 chunk 内容和向量.env:配置文件docs/:存放 PDF 文件chroma_db/:自动生成的向量库(git 可忽略)
- 警告 “No languages specified, defaulting to English” → 已通过
.env中的UNSTRUCTURED_LANGUAGES解决 - chunk 太碎 → 当前“一页一个 chunk”策略已优化
- 想处理更多 PDF → 直接放进
docs/,删除chroma_db后重新构建即可 - 向量库过大 → 可调大
CHUNK_SIZE,减少 chunk 数量