基于检索增强生成(RAG)技术的物流行业智能信息咨询系统,专为处理和检索物流领域专业知识而设计。能够从多种文档格式中提取、向量化信息,并提供精准的问答服务。
本系统采用现代RAG架构,通过LangChain框架将大型语言模型(LLM)的生成能力与向量检索的精准性相结合,为用户提供物流行业的专业知识问答服务。
- 多格式文档处理:支持PDF、Word、Excel、CSV、TXT等多种文档格式
- 向量数据增量更新:智能识别文档变化,仅处理新增或修改的内容
- 向量数据管理:支持按文件粒度删除向量数据,实现灵活管理
- 嵌入向量缓存:缓存已计算的嵌入向量,大幅提升后续处理速度
- 断点续传:支持在大规模处理中断后从断点继续,无需重新开始
- 并发处理:多进程并行处理文档,充分利用计算资源
- 用户友好界面:基于Streamlit的直观问答界面
- 日志完备:详细的处理日志,便于监控和问题排查
┌─────────────┐ ┌──────────────┐
│ 多格式文档库 │────────▶│ 文档处理模块 │
└─────────────┘ └──────┬───────┘
│
▼
┌───────────────┐ ┌───────────────────┐
│ 嵌入模型 │◀──────────▶│ 文本分块与向量化 │
└───────────────┘ └──────┬────────────┘
│
▼
┌───────────────┐ ┌───────────────────┐
│ 向量数据管理 │◀──────────▶│ 向量数据库存储 │
└───────────────┘ └──────┬────────────┘
│
▼
┌───────────────┐ ┌───────────────────┐
│ 大语言模型 │◀──────────▶│ RAG检索与问答链 │
└───────────────┘ └──────┬────────────┘
│
▼
┌───────────────────┐
│ Streamlit用户界面 │
└───────────────────┘
- Python 3.9+
- 50MB以上磁盘空间(不含向量库和模型)
- 推荐8GB以上内存
- 克隆项目并进入目录
git clone https://your-repository/logistics-rag.git
cd logistics-rag
- 创建虚拟环境(推荐)
# 使用venv
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
# 或使用conda
conda create -n logistics-rag python=3.10
conda activate logistics-rag
- 安装依赖
pip install -r requirements.txt
- 安装特定文档处理依赖
根据您需要处理的文档类型,可能需要安装额外依赖:
# 完整文档处理支持
pip install "unstructured[all-docs]"
# 或根据需要安装特定组件
pip install "unstructured[pdf]" # PDF支持
pip install "unstructured[docx]" # Word支持
pip install "unstructured[pptx]" # PowerPoint支持
- 安装Tesseract OCR(用于处理扫描文档,可选)
- Windows: 从此处下载安装,并确保添加到系统PATH
- Linux:
sudo apt-get install tesseract-ocr
- macOS:
brew install tesseract
- 安装并配置Ollama
从Ollama官网下载并安装,然后拉取所需模型:
# 拉取嵌入模型
ollama pull mxbai-embed-large
# 拉取大语言模型
ollama pull llama2-chinese:7b
- 数据准备
在项目根目录创建dataset
文件夹,并放入您的物流领域文档:
mkdir -p dataset
# 将您的PDF、Word、Excel等文档复制到dataset目录
03-物流RAG/
├── run.py # 主入口文件
├── streamlit_app.py # Streamlit直接入口
├── app.py # 兼容性入口
├── config/ # 配置模块
│ ├── __init__.py
│ └── settings.py # 集中配置管理
├── data/ # 数据处理模块
│ ├── __init__.py
│ └── vector_store.py # 向量存储访问
├── prompts/ # 提示词模板
│ ├── __init__.py
│ └── templates.py # 系统提示词
├── rag/ # RAG核心模块
│ ├── __init__.py
│ ├── embedding.py # 嵌入模型管理
│ └── chain.py # 检索问答链
├── tools/ # 工具模块
│ ├── __init__.py
│ ├── vector_builder.py # 向量构建工具
│ └── vector_manager.py # 向量管理工具
├── ui/ # 用户界面
│ ├── __init__.py
│ └── streamlit_app.py # Streamlit应用
├── utils/ # 工具函数
│ ├── __init__.py
│ ├── logging_utils.py # 日志工具
│ └── cache_utils.py # 缓存工具
├── compat/ # 兼容性模块
│ ├── __init__.py
│ └── app_compat.py # 兼容性入口
├── requirements.txt # 项目依赖
└── README.md # 项目文档
推荐使用Streamlit直接启动:
streamlit run streamlit_app.py
或通过统一入口:
python run.py app
启动后,在浏览器中访问 http://localhost:8501
即可使用问答界面。
首次使用前,需要构建向量数据库:
# 基本构建(会覆盖现有向量库)
python run.py build
# 增量追加到现有向量库
python run.py build --append
# 从断点继续构建(中断后重启)
python run.py build --resume
# 清除嵌入缓存并重建
python run.py build --clear-cache
系统提供多种向量库管理命令:
# 查看向量库统计信息
python run.py manage stats
# 列出所有已处理的源文件
python run.py manage list
# 删除特定源文件的向量(支持多文件)
python run.py manage delete file1.pdf file2.docx
主要配置参数位于 config/settings.py
,可根据需要调整:
参数类别 | 参数名 | 说明 | 默认值 |
---|---|---|---|
数据目录 | DATA_DIR | 文档存放目录 | ./dataset |
向量库 | FAISS_SAVE_PATH | FAISS索引保存路径 | ./faiss/multi_format_store |
Qdrant | QDRANT_HOST | Qdrant服务地址 | localhost |
Qdrant | QDRANT_PORT | Qdrant端口 | 6333 |
Qdrant | QDRANT_COLLECTION | Qdrant集合名称 | multi_format_vectors |
模型 | EMBEDDING_MODEL | 嵌入模型名称 | mxbai-embed-large |
模型 | LLM_MODEL | 大语言模型名称 | llama2-chinese:7b |
文本分割 | CHUNK_SIZE | 文本块大小 | 300 |
文本分割 | CHUNK_OVERLAP | 文本块重叠大小 | 50 |
并发 | MAX_WORKERS | 并发处理进程数 | 4 |
缓存 | EMBEDDING_CACHE_DIR | 嵌入缓存目录 | ./cache/embeddings |
其他 | BATCH_SIZE | 批处理大小 | 100 |
系统自动缓存计算过的嵌入向量,显著提高重复处理速度。缓存统计信息会在处理完成后显示在日志中:
[INFO] 嵌入缓存统计: 命中=153, 未命中=47, 命中率=76.50%
对于大规模文档处理,系统支持中断后继续处理:
- 按
Ctrl+C
可安全中断处理过程 - 中断状态会自动保存
- 使用
python run.py build --resume
从断点继续
通过调整 MAX_WORKERS
参数可控制并发处理文档的进程数:
- 增加进程数可提高处理速度,但会占用更多资源
- 对于内存受限系统,建议设置为较小值(如2-4)
系统提供详细日志,可在 logs
目录下查看:
app.log
: 应用运行日志vector_build.log
: 向量构建日志vector_manager.log
: 向量管理日志
问题: 某些文档无法正确解析 解决方案:
- 确保已安装完整的unstructured依赖:
pip install "unstructured[all-docs]"
- 对于复杂PDF,尝试安装额外OCR支持:
pip install pytesseract pdf2image
- 确认文档编码正确,特别是非UTF-8编码文本文件
问题: 向量库操作失败 解决方案:
- 确保Qdrant服务运行:
docker run -p 6333:6333 qdrant/qdrant
- 检查向量维度一致性,更改模型后需重建向量库
- FAISS加载错误可用
--allow-dangerous
参数处理
问题: 嵌入或LLM模型调用失败 解决方案:
- 确认Ollama服务正常运行:
ollama serve
- 验证模型已下载:
ollama list
- 如需更换模型,同时更新
config/settings.py
中的模型名称
问题: 处理大量文档时内存不足 解决方案:
- 减少
MAX_WORKERS
值,降低并发处理数 - 调整
CHUNK_SIZE
减小文本块大小 - 使用
--append
模式分批处理文档
在 tools/vector_builder.py
中的 process_file
函数中添加新的文档类型支持:
elif filename.endswith(".新格式"):
# 实现新格式处理逻辑
docs = YourNewFormatLoader(path).load()
在 prompts/templates.py
中修改 PROMPT_TEMPLATE
可自定义系统提示词。
- 在
config/settings.py
中更新模型名称 - 如使用非Ollama模型,需修改
rag/embedding.py
和rag/chain.py
编辑 ui/streamlit_app.py
可自定义用户界面,添加新功能或改变外观。
本项目采用 MIT许可证