基于 LangChain + ChromaDB + 智谱 AI 构建的轻量级 PDF 知识库问答系统。用户上传 PDF 文件后,系统自动解析、向量化并存入向量数据库,支持自然语言问答并返回参考来源。
┌─────────────────────────────────────────────────────┐
│ Streamlit UI │
│ (app.py) │
├─────────────────────────────────────────────────────┤
│ RAG 核心层 │
│ ┌─────────────┬──────────────┬─────────────────┐ │
│ │document_ │ vector_store │ chain.py │ │
│ │loader.py │ .py │ (检索 + 生成) │ │
│ └─────────────┴──────────────┴─────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 外部服务 │
│ ┌───────────────┬─────────────────────────────┐ │
│ │ 智谱 AI API │ ChromaDB 向量数据库 │ │
│ └───────────────┴─────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
├── app.py # Streamlit Web 界面
├── rag/
│ ├── __init__.py # 模块导出
│ ├── document_loader.py # PDF 加载 + 文本切分
│ ├── vector_store.py # ChromaDB 向量库管理
│ └── chain.py # RAG 链:检索 + 生成
├── tests/
│ ├── __init__.py
│ ├── conftest.py # 共享 fixtures
│ ├── test_document_loader.py # 文档加载测试
│ ├── test_vector_store.py # 向量库测试
│ ├── test_chain.py # RAG 链测试
│ └── test_integration.py # 集成测试
├── .github/workflows/ci.yml # CI 配置
├── .env # 智谱 API Key(需自行配置)
├── .gitignore
├── requirements.txt
└── README.md
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows PowerShell:
.\venv\Scripts\Activate.ps1
# Windows CMD:
.\venv\Scripts\activate.bat
# Linux/macOS:
source venv/bin/activatepip install -r requirements.txt在 .env 文件中配置智谱 AI API Key:
ZHIPU_API_KEY=your_api_key_here
streamlit run app.py浏览器访问 http://localhost:8501 即可使用。
# 运行所有测试
pytest tests/ -v
# 运行测试并生成覆盖率报告
pytest tests/ -v --cov=rag --cov-report=term-missing
# 生成 HTML 覆盖率报告
pytest tests/ --cov=rag --cov-report=html| 模块 | 测试文件 | 测试内容 |
|---|---|---|
document_loader |
test_document_loader.py |
PDF 加载、切分、参数校验 |
vector_store |
test_vector_store.py |
Embedding、向量库 CRUD、Mock 智谱 API |
chain |
test_chain.py |
检索、Prompt 构建、生成、去重、Mock 智谱 API |
| 集成 | test_integration.py |
全流程测试、异常处理、边界情况 |
| 组件 | 技术 | 说明 |
|---|---|---|
| 前端 UI | Streamlit | Python 原生 Web 框架 |
| LLM 框架 | LangChain | RAG 应用开发框架 |
| 向量数据库 | ChromaDB | 轻量级嵌入式向量数据库 |
| Embedding | 智谱 embedding-3 | 2048 维向量,中文优化 |
| LLM | 智谱 glm-4 | 支持长上下文的大模型 |
| PDF 解析 | PyPDF | 纯 Python PDF 解析 |
| 测试 | pytest + mock | 单元测试 + 集成测试 |
| CI/CD | GitHub Actions | 多版本 Python 自动化测试 |
- 文档加载:
PyPDFLoader解析 PDF →RecursiveCharacterTextSplitter按中文标点切分 - 向量化:调用智谱
embedding-3生成 2048 维向量 → 存入 ChromaDB - 检索:用户问题 →
similarity_search检索 Top-K 相关文档块 - 生成:拼接 Prompt(含参考资料来源)→ 调用智谱
glm-4生成回答 - 展示:返回回答 + 参考来源(文档名 + 页码)
- 单元测试:所有外部依赖(智谱 API、ChromaDB)使用 Mock,不调用真实 API
- 集成测试:模拟完整 RAG 流程,验证模块协作
- 覆盖率:核心模块目标 80%+ 覆盖率
- CI 自动化:Push/PR 触发 GitHub Actions,多 Python 版本测试
MIT