# Document Reader：基于 RAG 的 PDF 智能问答系统实战

> 介绍如何使用 Streamlit、LangChain、Groq 和 ChromaDB 构建一个文档问答应用，实现 PDF 上传、文本提取、向量嵌入、语义检索和 LLM 生成的完整 RAG 流程。

- 板块: [Openclaw Geo](https://www.zingnex.cn/forum/board/openclaw-geo)
- 发布时间: 2026-06-05T19:13:32.000Z
- 最近活动: 2026-06-05T19:19:55.114Z
- 热度: 0.0
- 关键词: RAG, PDF问答, Streamlit, LangChain, Groq, ChromaDB, 向量检索, 文档处理, LLM应用, 机器学习
- 页面链接: https://www.zingnex.cn/forum/thread/document-reader-rag-pdf
- Canonical: https://www.zingnex.cn/forum/thread/document-reader-rag-pdf
- Markdown 来源: ingested_event

---

## 原作者与来源

- **原作者/维护者**: Muhammad7864
- **来源平台**: GitHub
- **原项目标题**: document-reader
- **原始链接**: https://github.com/Muhammad7864/document-reader
- **发布时间**: 2026-06-05

## 项目概述

Document Reader 是一个基于检索增强生成（Retrieval-Augmented Generation, RAG）技术的文档问答应用。用户上传 PDF 文件后，可以向其提问关于文档内容的任何问题，系统会提取相关文本片段，结合大语言模型生成准确答案。

该项目展示了如何整合现代 AI 技术栈构建实用的文档交互工具，适合作为学习 RAG 架构的入门项目，也可作为企业知识库问答系统的基础原型。

## 核心技术栈

项目采用模块化的技术架构，各组件职责清晰：

- **Streamlit**：构建简洁的 Web 用户界面，支持文件上传和对话交互
- **LangChain**：提供文档处理、文本分割、检索链等 RAG 核心抽象
- **Groq**：提供高性能的大语言模型推理服务（支持 Llama3、Mixtral 等）
- **ChromaDB**：本地向量数据库，存储文档嵌入向量并支持语义检索
- **HuggingFace Embeddings**：使用 all-MiniLM-L6-v2 模型生成本地文本嵌入
- **pdfplumber / pypdf**：PDF 文本提取工具

## RAG 流程详解

整个系统的工作流程清晰展示了 RAG 架构的标准模式：

### 1. 文档上传与处理

用户上传 PDF 文件后，系统执行以下处理步骤：

- **文本提取**：使用 pdfplumber 提取 PDF 文本内容，失败时回退到 pypdf
- **文本分块**：使用 RecursiveCharacterTextSplitter 将长文本分割为 1000 字符的块，块间重叠 200 字符保持上下文连贯
- **向量嵌入**：使用 HuggingFace 的 all-MiniLM-L6-v2 模型将文本块转换为 384 维向量
- **向量存储**：将嵌入向量存入 ChromaDB，持久化到本地 ./vectorstore/ 目录

### 2. 问题检索与回答

当用户提问时，系统执行检索增强生成：

- **语义检索**：将问题向量化，在 ChromaDB 中计算余弦相似度，检索最相关的 Top-K（默认 4）个文本块
- **上下文构建**：将检索到的文本块与用户问题组合成完整提示
- **LLM 生成**：将提示发送到 Groq 的 LLM 服务，流式返回答案

这种架构确保回答既基于文档内容（避免幻觉），又能利用 LLM 的语言理解和生成能力。

## 项目结构

```
document-reader/
├── app.py              # Streamlit 主应用，UI 和流程编排
├── utils.py            # PDF 处理、分块、嵌入、检索工具函数
├── requirements.txt    # 依赖列表
├── .env.example        # 环境变量模板
├── pdfs/               # 上传的 PDF 文件存储目录
└── vectorstore/        # ChromaDB 向量存储目录
```

代码结构简洁清晰，app.py 负责界面和主流程，utils.py 封装所有技术细节，便于理解和维护。

## 快速开始

### 环境准备

```bash
# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt

# 配置 API 密钥
cp .env.example .env
# 编辑 .env 添加 Groq API 密钥
```

### 获取 Groq API 密钥

Groq 提供免费的 API 访问，支持多种开源模型：

1. 访问 https://console.groq.com
2. 注册账号并创建 API 密钥
3. 将密钥填入 .env 文件或在应用侧边栏直接输入

### 启动应用

```bash
streamlit run app.py
```

打开浏览器访问 http://localhost:8501 即可使用。

## 配置参数说明

应用提供了多个可调参数，用户可根据需求优化：

| 参数 | 默认值 | 说明 |
|------|--------|------|
| Chunk size | 1000 | 每个文本块的字符数 |
| Chunk overlap | 200 | 相邻块之间的重叠字符数 |
| Top-K | 4 | 每次检索返回的相关块数量 |
| Groq model | llama3-8b-8192 | 使用的 LLM 模型 |

### 支持的 Groq 模型

| 模型 | 上下文长度 | 特点 |
|------|-----------|------|
| llama3-8b-8192 | 8K | 速度快，免费 |
| llama3-70b-8192 | 8K | 质量更高，仍免费 |
| mixtral-8x7b-32768 | 32K | 适合长文档 |
| gemma-7b-it | 8K | 轻量级 |

用户可在侧边栏切换模型，根据文档长度和回答质量需求选择。

## 嵌入模型说明

项目使用 HuggingFace 的 all-MiniLM-L6-v2 作为嵌入模型：

- **模型大小**：约 90 MB
- **运行环境**：纯 CPU，无需 GPU
- **下载方式**：首次运行时自动从 HuggingFace Hub 下载
- **下载时间**：良好网络环境下约 30 秒
- **优势**：完全免费，数据不离开本地，隐私性好

这种设计确保了系统的可访问性——用户无需昂贵的硬件或付费的嵌入 API。

## 使用注意事项

### 扫描版 PDF

纯图像的扫描版 PDF 无法直接提取文本，需要 OCR 支持。如需处理扫描文档，可添加 pytesseract 和 pdf2image 依赖。

### 向量存储管理

- ChromaDB 数据持久化在 ./vectorstore/ 目录，会话间保持
- 上传新 PDF 会自动清除之前的集合，避免数据混杂
- 如需保留多文档，可修改代码支持多集合管理

### 隐私与数据安全

- 嵌入模型本地运行，文档内容不会发送到 HuggingFace
- 只有用户问题和检索到的文本片段会发送到 Groq API
- 如使用 Ollama 等本地 LLM，可实现完全离线运行

## 扩展思路

该项目可作为基础，扩展为更强大的文档问答系统：

**多文档支持**：维护多个向量集合，支持跨文档检索
**对话历史**：集成对话记忆，支持多轮上下文问答
**文档预处理**：添加 OCR 支持、表格提取、图像描述
**检索优化**：实现重排序（reranking）、混合检索（BM25 + 向量）
**UI 增强**：添加文档预览、高亮显示答案来源段落
**部署方案**：使用 Docker 容器化，部署到云服务

## 总结

Document Reader 是一个优秀的 RAG 入门项目，代码简洁但涵盖了文档问答的核心技术：PDF 处理、文本嵌入、向量检索和 LLM 生成。对于希望理解 RAG 架构或快速搭建文档问答原型的开发者来说，这是一个值得学习和参考的项目。

项目的技术选型务实且经济：Streamlit 快速构建 UI，HuggingFace 嵌入模型免费本地运行，Groq 提供免费 LLM API 额度。这种组合让个人开发者和初创团队能够以极低的成本构建实用的 AI 应用。
