Configuration Parsing Warning:Invalid JSON for config file config.json

YAML Metadata Warning:empty or missing yaml metadata in repo card

Check out the documentation for more information.

基于 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 地址、模型参数等配置,即时生效无需重启。

系统架构

整体架构

alt text

数据流详解

  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 OCR 识别
LLM Qwen3-1.7B 大语言模型
Embedding 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. 环境准备

pip install -r requirements.txt

2. 配置环境变量

OCR、LLM、Embedding 均通过环境变量配置,兼容 OpenAI API 格式。

cp .env.example .env
# 编辑 .env 文件,填入实际模型路径和 API 地址

.env 配置示例:

# 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 芯片启动各模型服务:

# 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(推荐)

python app.py

浏览器访问 http://localhost:7860

问答界面

alt text

预览界面

alt text

设置界面

alt text

2. Python API

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. 命令行

# 直接对文件提问
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. 分步使用

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("文档主要内容?")

案例演示

演示视频

观看演示视频

使用步骤

1. 在 AX650N 芯片上启动模型服务

LLM 服务

alt text

Embedding 服务

alt text

OCR 服务

alt text

运行UI

alt text

2. 上传原始文件

支持 PDF / PNG / JPG / BMP / TIF

alt text

3. OCR 识别

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

alt text

alt text

4. 智能问答

根据输入内容检索相关文本片段并返回结果。

例如提问「机动车损失赔款计算方法」,系统在知识库中正确检索到相关的文本片段,并依据该文本进行回答。

AI回答内容: alt text

PDF原始文档内容:

alt text

硬件资源使用

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

alt text

资源类型 占用情况 说明
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 开源。


致谢

  • PaddleOCR-VL — 端到端视觉语言 OCR 模型
  • Qwen3 — 通义千问大语言模型与嵌入模型
  • LangChain — LLM 应用开发框架
Downloads last month
70
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support