# 基于 OCR + RAG 的文档智能问答系统(AX650N)
**端到端文档识别与检索问答 | 边缘 AI 部署 | 隐私友好**
基于 **PaddleOCR-VL** + **Qwen3-Embedding** + **Qwen3** + **LangChain RAG** 的文档智能问答系统,支持 PDF、扫描件及常见图片格式的端到端识别与检索问答。专为 **AX650N 边缘 AI 芯片**优化,可在嵌入式设备上实现完整的文档数字化与智能检索能力。
---
## 目录
- [项目背景](#项目背景)
- [应用场景](#应用场景)
- [核心特性](#核心特性)
- [系统架构](#系统架构)
- [快速开始](#快速开始)
- [使用方式](#使用方式)
- [案例演示](#案例演示)
- [硬件资源使用](#硬件资源使用)
- [常见问题](#常见问题)
---
## 项目背景
### 为什么需要边缘端 OCR + RAG?
在日常办公和业务场景中,大量关键信息沉淀在 PDF 文档、扫描件和图片中——合同条款、药品说明书、技术手册、发票凭证等。传统的文档处理方式面临三大痛点:
1. **信息检索低效** — 依靠人工翻阅或关键词搜索,难以快速定位到精确答案,尤其在数百页的技术手册或法律文件中。
2. **隐私合规风险** — 将敏感文档上传至云端 AI 服务存在数据泄露隐患,医疗、金融、政务等领域对数据本地化有严格要求。
3. **云端依赖与成本** — 公有云 OCR/LLM 服务按量计费,大批量处理成本高昂,且网络延迟影响实时交互体验。
### 本项目的解决思路
本项目将 OCR 文字识别、向量检索与大语言模型理解三大能力整合到单一流水线中,完整运行在 **AX650N 边缘 AI 芯片**上,实现:
- 🔒 **数据不出设备** — 文档解析、向量化、推理全流程本地运行,杜绝隐私泄露风险。
- ⚡ **低延迟交互** — 无需网络往返,端到端延迟控制在秒级,支持实时问答对话。
- 💰 **零调用成本** — 一次硬件投入,无限次使用,适合批量文档持续处理。
- 🧠 **语义级理解** — 区别于关键词匹配,RAG 能理解问题语义并从文档中检索最相关的片段作答。
### 技术路线选型
| 环节 | 选型 | 考量 |
|------|------|------|
| OCR 识别 | PaddleOCR-VL-0.9B | 端到端视觉语言模型,OmniDocBench 94.5% 精度,支持版面分析 |
| 文本嵌入 | Qwen3-Embedding-0.6B | 轻量级高性价比嵌入模型,中文语义理解优秀 |
| 大语言模型 | Qwen3-1.7B | 小参数量但推理能力扎实,适合边缘设备部署 |
| RAG 框架 | LangChain | 成熟生态,LCEL 链式编排,多向量数据库支持 |
| 硬件平台 | AX650N | 高能效比 NPU,单芯片承载 OCR + Embedding + LLM 三路推理 |
---
## 应用场景
### 🏥 医疗健康
- **药品说明书问答** — 拍摄药盒或扫描说明书,直接询问「布洛芬的每日最大用量」「禁忌人群」等,系统从说明书中检索并回答。
- **病历/检验报告检索** — 多份检查报告批量入库,按病症、指标名快速检索相关历史记录。
- **医学文献辅助阅读** — 对 PDF 论文进行 OCR 后,支持跨文档检索实验方法、结论等。
### ⚖️ 法律与合规
- **合同条款检索** — 上传合同 PDF,快速定位违约责任、管辖条款、保密义务等关键内容。
- **法规条文问答** — 将法律法规 PDF 入库,通过自然语言查询适用的法条与具体规定。
- **审计底稿检索** — 批量处理审计工作底稿,按科目、事项描述检索相关内容。
### 🏭 工业与制造
- **技术手册查询** — 设备操作手册、维修指南 PDF 入库后,工程师可语音/文字提问,快速获取故障排查步骤。
- **图纸标注识别** — 对工程图纸进行 OCR,提取标注文字并支持检索。
- **SOP 文件管理** — 标准化作业程序文件数字化,新员工通过问答快速了解操作规范。
### 🏛️ 政务与档案
- **档案数字化检索** — 扫描的历史档案、证件、批文经 OCR 后入库,支持按人名、日期、事由等自然语言检索。
- **政策文件问答** — 政府发布的政策文件 PDF 入库后,公众或工作人员可直接提问获取具体条款。
### 🎓 教育与科研
- **课件/教材检索** — 将课程 PDF 教材入库,学生可针对知识点提问,系统定位到相关章节并回答。
- **论文文献管理** — 批量导入论文 PDF,按研究方向、方法、结论等维度跨文献检索。
- **考试资料整理** — 扫描的试卷、笔记经 OCR 后入库,按知识点分类检索。
### 🏢 企业日常
- **发票与凭证处理** — 批量识别发票、报销单中的关键信息,支持按金额、日期、抬头检索。
- **内部文档知识库** — 将公司制度、流程说明、FAQ 等文档入库,构建企业私有知识问答系统。
- **简历筛选** — 批量解析简历 PDF/图片,按技能、经验年限等条件检索匹配候选人。
---
## 核心特性
### 🚀 功能特性
- **多格式支持** — 覆盖 PDF(文字型/扫描版)、PNG、JPG、BMP、TIF 等主流文档与图片格式。
- **端到端流水线** — 上传即用:文档 → OCR 识别 → Markdown 清洗 → 智能分割 → 向量嵌入 → RAG 问答,全自动完成。
- **多轮对话** — 支持带上下文的连续问答,系统记忆对话历史,追问无需重复描述。
- **流式输出** — LLM 回答以 token 级流式返回,提升交互响应感。
- **来源追溯** — 每个回答附带来源引用(文档名、页码、原文片段),可追溯可验证。
- **Web UI** — 基于 FastAPI 的现代化界面,支持上传、预览、OCR 查看、问答一站式操作。
- **Python API** — 提供完整的编程接口,可嵌入到自动化流程或第三方系统中。
- **CLI 工具** — 命令行一键 OCR 识别或问答,适合脚本批处理和远程操作。
### 🔧 技术特性
- **模块化解耦** — OCR 加载器、文本处理器、向量存储、RAG 链各自独立,可单独替换或升级任一环节。
- **多向量数据库** — 支持 ChromaDB(默认)和 FAISS,可按场景灵活切换。
- **多检索策略** — 支持相似度检索、MMR(最大边际相关性)检索、带分数检索三种模式。
- **OpenAI 兼容 API** — LLM、Embedding、OCR 均通过 OpenAI 兼容接口调用,可对接 vLLM、llama.cpp 等任意兼容服务。
- **递归文本分割** — 基于语义边界的中文优化分割器,支持自定义分隔符、块大小与重叠度。
- **即时配置热更新** — Web UI 内修改 API 地址、模型参数等配置,即时生效无需重启。
---
## 系统架构
### 整体架构

### 数据流详解
1. **文档上传** — 用户通过 Web UI、API 或 CLI 提交文档(PDF/图片),文件保存至 `data/uploads/`。
2. **OCR 识别** — PaddleOCR-VL 对文档逐页进行端到端文字识别,支持版面分析、表格识别、公式识别,输出 Markdown 格式文本。
3. **文本清洗与分割** — 清洗 OCR 噪声(多余空格、断行修复),基于中文语义边界递归分割为 800 字符(可配置)的文本块,相邻块间保留 150 字符重叠。
4. **向量嵌入** — Qwen3-Embedding 将每个文本块编码为 1024 维向量,写入 ChromaDB / FAISS 向量数据库。
5. **用户提问** — 用户输入自然语言问题,系统将问题向量化后在数据库中进行语义相似度检索,返回 Top-K 相关文本块。
6. **RAG 生成** — 检索到的上下文与问题拼接后送入 Qwen3 LLM,生成基于文档内容的精准回答,同时标注引用来源。
### 模型栈
| 模型类型 | 模型名称 | 说明 |
|---------|---------|------|
| **OCR** | [PaddleOCR-VL-0.9B](https://huggingface.co/AXERA-TECH/PaddleOCR-VL-1.5) | OCR 识别 |
| **LLM** | [Qwen3-1.7B](https://huggingface.co/AXERA-TECH/Qwen3-1.7B-GPTQ-Int4) | 大语言模型 |
| **Embedding** | [Qwen3-Embedding-0.6B](https://huggingface.co/AXERA-TECH/Qwen3-Embedding-0.6B) | 文本嵌入模型 |
### 支持格式
- PDF(文字型 / 扫描版)
- PNG / JPG / JPEG / BMP / TIF / TIFF
### 文件架构
```
OCR_RAG/
├── requirements.txt # Python 依赖
├── .env.example # 环境变量模板
├── config.py # 全局配置中心
├── ocr_loader.py # PaddleOCR-VL 加载器 (支持多格式)
├── text_processor.py # Markdown 清洗 + 智能分割
├── embeddings.py # Qwen3-Embedding 向量嵌入
├── vector_store.py # 向量数据库管理 (Chroma/FAISS)
├── rag_chain.py # RAG 问答链 (Qwen3)
├── app.py # Web UI
└── data/ # 运行时数据
├── uploads/
├── ocr_output/
├── vector_db/
└── logs/
```
---
## 快速开始
### 1. 环境准备
```bash
pip install -r requirements.txt
```
### 2. 配置环境变量
OCR、LLM、Embedding 均通过环境变量配置,兼容 OpenAI API 格式。
```bash
cp .env.example .env
# 编辑 .env 文件,填入实际模型路径和 API 地址
```
`.env` 配置示例:
```ini
# LLM API(OpenAI API 格式)
LLM_API_KEY=not-needed
LLM_API_BASE=http://127.0.0.1:8013/v1
LLM_MODEL_NAME=AXERA-TECH/Qwen3-1.7B-GPTQ-Int4
LLM_TEMPERATURE=0.1
LLM_MAX_TOKENS=2048
# Embedding API
EMBEDDING_MODEL_NAME=AXERA-TECH/Qwen3-Embedding-0.6B
EMBEDDING_API_BASE=http://127.0.0.1:8014/v1
EMBEDDING_API_KEY=not-needed
EMBEDDING_BATCH_SIZE=4
# OCR API
OCR_ENGINE=api
OCR_API_BASE=http://127.0.0.1:8015/v1
OCR_API_MODEL=AXERA-TECH/PaddleOCR-VL-1.5
OCR_API_KEY=not-needed
OCR_TASK=ocr
```
### 3. 启动模型服务
基于 AX650N 芯片启动各模型服务:
```bash
# LLM 服务 — 端口 8013
axllm serve /root/huangjie/AXERA-TECH/models--AXERA-TECH--Qwen3-1.7B --port 8013
# Embedding 服务 — 端口 8014
axllm serve /root/huangjie/AXERA-TECH/models--AXERA-TECH--Qwen3-Embedding-0.6B --port 8014
# OCR 服务 — 端口 8015
axllm serve /root/huangjie/AXERA-TECH/PaddleOCR-VL-1.5 --port 8015
```
## 使用方式
### 1. Web UI(推荐)
```bash
python app.py
```
浏览器访问 **http://localhost:7860**
**问答界面**

**预览界面**

**设置界面**

### 2. Python API
```python
from rag_chain import PDFRAGPipeline
# 初始化流水线
pipeline = PDFRAGPipeline()
# 处理文档 (支持 PDF/PNG/JPG/BMP/TIF)
pipeline.ingest("document.pdf")
pipeline.ingest("scan.png")
# 问答
result = pipeline.ask("文档主要内容是什么?")
print(result["answer"])
print(result["sources"])
# 多轮对话
result = pipeline.ask_with_history(
"那第二章呢?",
chat_history=[
{"role": "user", "content": "文档主要讲什么?"},
{"role": "assistant", "content": "文档主要介绍了..."},
]
)
# 流式输出
for chunk in pipeline.ask_stream("请总结文档"):
print(chunk, end="", flush=True)
```
### 3. 命令行
```bash
# 直接对文件提问
python rag_chain.py document.pdf "文档主要内容是什么?"
# OCR 识别并输出 Markdown
python ocr_loader.py scan.png --md
# OCR 识别并输出 JSON
python ocr_loader.py document.pdf --json
```
### 4. 分步使用
```python
from ocr_loader import PaddleOCRLoader
from text_processor import TextProcessingPipeline
from vector_store import build_vector_store
from rag_chain import RAGChain
# 1. OCR
loader = PaddleOCRLoader("document.pdf", dpi=300)
documents = loader.load()
# 2. 文本处理
pipeline = TextProcessingPipeline(chunk_size=800, chunk_overlap=150)
chunks = pipeline.process(documents)
# 3. 向量化
manager = build_vector_store(chunks)
# 4. 问答
chain = RAGChain(vector_store_manager=manager)
result = chain.query("文档主要内容?")
```
---
## 案例演示
### 演示视频
[观看演示视频](assets/OCR_RAG2.mp4)
### 使用步骤
**1. 在 AX650N 芯片上启动模型服务**
LLM 服务

Embedding 服务

OCR 服务

运行UI

**2. 上传原始文件**
支持 PDF / PNG / JPG / BMP / TIF

**3. OCR 识别**
OCR 识别并输出文本,支持原始文件和 OCR 结果同时查看:


**4. 智能问答**
根据输入内容检索相关文本片段并返回结果。
例如提问「机动车损失赔款计算方法」,系统在知识库中正确检索到相关的文本片段,并依据该文本进行回答。
AI回答内容:

PDF原始文档内容:

## 硬件资源使用
基于 AX650N 平台运行本项目时,内存(CMM)、Flash 占用情况如下:

| 资源类型 | 占用情况 | 说明 |
|---------|---------|------|
| CMM 内存 | 约 4.36 GB | 三模型(OCR + Embedding + LLM)同时加载 |
| Flash 存储 | 约 5.46 GB | 模型权重文件 + 向量数据库 + 应用数据 |
| NPU 利用率 | 按需调度 | 推理时峰值占用,空闲时释放 |
---
## 常见问题
### Q1: 可以对接云端模型吗?
可以。LLM、Embedding、OCR 均通过 **OpenAI 兼容 API** 调用,修改 `.env` 中的 `*_API_BASE` 和 `*_API_KEY` 即可对接任意兼容服务,例如:
- **云端** — OpenAI、DeepSeek、通义千问、智谱 GLM 等
- **本地** — vLLM、Ollama、llama.cpp、LocalAI 等
- **本芯片** — AX650N 上的 `axllm serve` 服务(本项目默认配置)
### Q2: 如何提高问答准确率?
- **调整分块参数** — 减小 `CHUNK_SIZE`(如 500)提升检索精度,增大 `CHUNK_OVERLAP`(如 200)减少语义断裂。
- **增加检索数量** — 提高 `RETRIEVAL_TOP_K`(如 5)让 LLM 看到更多上下文。
- **优化系统 Prompt** — 在 `config.py` 中定制 `SYSTEM_PROMPT`,引导模型遵循特定的回答风格。
- **文档预处理** — 确保扫描件清晰、文字方向正确、避免严重倾斜或遮挡。
### Q3: 是否支持多文档混合检索?
支持。系统允许连续上传多个文档,所有文档的文本块存入同一向量数据库,问答时跨文档检索。文件列表持久化到磁盘,重启后自动恢复。
### Q4: 内存不足怎么办?
如遇 OOM,可尝试以下优化:
- 将 `LLM_MAX_TOKENS` 减小(如 256),降低 LLM 上下文窗口
- 将 `CHUNK_SIZE` 减小(如 400),降低检索块体积
- 分批处理大文档,处理完一批后手动清理向量库再处理下一批
- 考虑将 Embedding 或 LLM 卸载到另一台设备
---
## 许可证
本项目采用 [MIT License](LICENSE) 开源。
---
## 致谢
- [PaddleOCR-VL](https://github.com/PaddlePaddle/PaddleOCR) — 端到端视觉语言 OCR 模型
- [Qwen3](https://github.com/QwenLM/Qwen) — 通义千问大语言模型与嵌入模型
- [LangChain](https://github.com/langchain-ai/langchain) — LLM 应用开发框架