为了解决传统 RAG 在处理长文档时常见的“断章取义”问题,本项目实现了以下核心逻辑:
- 递归父子分块 (Recursive Parent-Child Chunking)
子块检索 (300字/50字重叠):利用递归切分算法,将文档切分为带有 50 字重叠的 300 字子块。较小的切片能让向量模型(BGE-M3)更精准地捕捉核心特征,提升召回率。
父块关联:每个子块在入库时都与其所属的父块(即 Markdown 标题下的完整章节)进行关联。
- 结果去重与父块还原 (Deduplication & Context Restoration)
上下文还原:当系统检索到最相关的子块后,不会直接将其丢给大模型,而是通过其携带的 ID 找回背后的完整父块(Parent Block)。这确保了 LLM 接收到的是逻辑连贯的完整技术条款,而非支离破碎的片段。
智能去重:在检索过程中,如果多个子块同时指向同一个章节,系统会根据 parent_id 自动去重,确保发给大模型的内容既全面又简洁,有效节省 Token 消耗。 本项目是一个基于 Docling 结构化解析、Elasticsearch 存储以及 BGE 系列本地化模型的 RAG(检索增强生成)系统。采用“父子块”检索策略,兼顾检索精度与上下文完整性。
- 结构化深度解析:集成 IBM 的 Docling 引擎,将 PDF/Word/PPT 转换为 Markdown,精准保留标题层级与文档逻辑。
- 父子块检索策略 (Parent-Child Strategy):使用 300 字符的短子块进行高精召回,返回对应的完整父块(章节)给大模型,彻底解决碎片化文本导致的“断章取义”问题。
- 双重检索架构:结合向量检索(BGE-M3)与二次重排(BGE-Reranker),在保证召回率的同时极大提升了结果的准确性。
- 本地化推理极致优化:支持显卡硬件加速。
- 工业级 Prompt 约束:针对技术参数设计的严谨回复准则,强制要求格式规范、拒绝幻觉、禁止路径转义。
- 解析清洗:Docling 解析 -> 正则清洗 -> Markdown 结构化。
- 分层切片:按标题层级切分父块 -> 递归切分子块(300字/50字重叠)。
- 向量入库:本地 BGE-M3 批量生成向量 (Batching) -> Elasticsearch 稠密向量存储。
- 检索流水线:向量初筛 (Recall) -> 交叉编码重排 (Rerank) -> 父块去重与还原。
- LLM 生成:检索内容注入 -> 阿里 DashScope 推理回答。
- 文档解析:Docling
- 向量模型:BAAI/bge-m3 (本地部署)
- 重排模型:BAAI/bge-reranker-base (本地部署)
- 数据库:Elasticsearch 8.x
- LLM API:Aliyun DashScope (GLM/Qwen)
- 硬件支持:NVIDIA RTX 5070 (支持 CUDA 加速)
.
├── src/
│ ├── config.py # 环境变量与配置中心
│ ├── loader.py # 文档解析与入库模块 (Parent-Child 逻辑)
│ └── searcher.py # 检索与 Rerank 核心逻辑
├── models/ # 存放本地 BGE 模型文件 (bge-m3, bge-reranker)
├── file/ # 存放待处理的源文档 (.docx, .pdf, .pptx)
├── .env # 环境变量配置 (API Key, IP等)
├── main.py # 项目启动入口 (对话模式)
└── requirements.txt # 依赖列表
⚙️ 快速开始
1. 环境准备
建议使用 Python 3.10 并在 Conda 环境下运行:
conda create -n rag_env python=3.10
conda activate rag_env
pip install -r requirements.txt
在根目录下创建 .env 文件:
2. 环境配置
# 阿里 DashScope 配置
DASHSCOPE_API_KEY=你的API_KEY
DASHSCOPE_BASE_URL=[https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)
LLM_MODEL=glm-5.1
# Elasticsearch 配置
ES_HOST=[http://192.168.10.2:9200](http://192.168.10.2:9200)
INDEX_NAME=rag_prod_v1
# 本地模型路径
BGE_MODEL_PATH=./models/bge-m3
RERANK_MODEL_PATH=./models/bge-reranker-base
3. 文档入库
将文件放入 file/ 文件夹,修改 src/loader.py 中的路径并执行:
python src/loader.py
4. 启动对话
python main.py