基于 LlamaIndex 和 vLLM 的高性能检索增强生成(RAG)系统,专注于计算机网络课程知识问答。
本项目实现了一个完整的 RAG 系统,使用语义分块、混合检索(HyDE + 向量检索 + BM25)和 vLLM 高性能推理,为计算机网络课程提供准确、可靠的问答服务。
- 🎯 语义分块:使用 SemanticSplitterNodeParser 保证知识块的语义完整性
- 🔍 混合检索:融合 HyDE、稠密向量检索和 BM25 稀疏检索
- ⚡ 高性能推理:基于 vLLM 的异步推理引擎,支持 4 卡并行
- 📊 完整评估:使用 RAGAS 框架进行多维度评估
- 🛠️ 统一配置:所有参数集中管理,便于调优
| 组件 | 技术选型 | 说明 |
|---|---|---|
| RAG 框架 | LlamaIndex 0.11+ | 文档加载、分块、索引、检索 |
| 向量数据库 | ChromaDB 0.5+ | 本地持久化向量存储 |
| Embedding 模型 | Qwen3-Embedding-4B | 中文优化,MTEB 排名第 2 |
| LLM 模型 | Qwen2.5-14B-Instruct | 高性能生成模型 |
| 推理引擎 | vLLM | 异步推理,支持张量并行 |
| Web 框架 | FastAPI | 高性能异步 API 服务 |
| 评估框架 | RAGAS | 忠实度、召回率、精度、相关性 |
| 评估模型 | gpt-4o-mini、text-embedding-3-large | 更接近人类评估 |
┌─────────────────────────────────────────────────────────────────┐
│ 数据准备层 │
│ PDF 文档 → 语义分块 → 向量化 → ChromaDB 持久化 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 检索优化层 │
│ 用户查询 → HyDE 增强 → 混合检索 (向量 + BM25) → RRF 融合 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 生成服务层 │
│ 上下文构建 → Prompt 模板 → vLLM 推理 → 答案生成 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 评估层 │
│ RAGAS 评估 → 多维度指标 → 性能分析 │
└─────────────────────────────────────────────────────────────────┘
network-knowledge-rag/
├── README.md # 项目说明文档
├── requirements.txt # Python 依赖
│
└── rag_for_computer_network_knowledge/
├── config.py # 统一配置文件 ⚙️
├── model_load.py # 模型加载模块
├── data_preparation.py # 数据准备和语义分块
├── index_construction.py # 向量索引构建
├── retrieval_optimization.py # 混合检索优化
├── vllm_server.py # vLLM 推理服务端
├── vllm_client.py # 交互式问答客户端
├── evaldata_construct.py # 批量评估数据构建
├── run_ragas_eval.py # RAGAS 评估执行
│
├── data/ # 数据目录
│ ├── books/ # 教材 PDF 文件
│ │ ├── network_book1.pdf # 计算机网络教材 1
│ │ └── network_book2.pdf # 计算机网络教材 2
│ ├── chunks_output.json # 语义分块结果
│ ├── evaluation_data.json # 评估问题集 (根据谢希仁《计算机网络释疑与习题解答》构建,这里只列举前100个)
│ └── evaluation_output.json # 评估结果输出
│
└── chroma_storage/ # ChromaDB 向量数据库
└── (自动生成)
# 克隆项目
git clone https://github.com/your-username/network-knowledge-rag.git
cd network-knowledge-rag
# 安装 Python 依赖
pip install -r requirements.txt编辑 config.py,修改模型路径:
# 根据你的实际路径修改
EMBEDDING_MODEL_PATH = "/your/path/to/Qwen3-Embedding-4B/"
LLM_MODEL_PATH = "/your/path/to/Qwen2.5-14B-Instruct/"第一步:准备教材 PDF
将计算机网络教材 PDF 文件放入 /data/books/ 目录。
第二步:执行数据准备和索引构建
# 加载文档、语义分块、向量化并构建 ChromaDB 索引
python data_preparation.py执行过程:
- 📖 加载 PDF 文档
- ✂️ 语义分块(自动识别语义断裂点)
- 🔢 向量化(使用 Qwen3-Embedding-4B)
- 💾 持久化到 ChromaDB
在 第一个终端 启动 vLLM 服务端:
# 启动 vLLM 推理服务(4 卡并行)
python vllm_server.py服务配置:
- 监听地址:
0.0.0.0:5499 - 张量并行: 4 GPU
- 最大序列长度: 4096 tokens
- GPU 显存利用率: 90%
在 第二个终端 启动 HyDE 查询增强服务 HyDE (Hypothetical Document Embeddings) 用于查询增强,需要单独启动一个轻量级 vLLM 服务:
# 使用 Qwen2.5-7B-Instruct 提供 HyDE 查询转换
CUDA_VISIBLE_DEVICES=1,2 python -m vllm.entrypoints.openai.api_server \
--model “你的模型路径” \
--served-model-name Qwen2.5-7B-Instruct \
--tensor-parallel-size 2 \
--max-model-len 4096 \
--max-num-batched-tokens 2048 \
--enforce-eager \
--host 0.0.0.0 \
--port 1443
启动交互式客户端:
# 启动交互式问答
python vllm_client.py
## 📊 评估流程# 批量生成评估答案(需要先启动 vllm_server.py)
python evaldata_construct.py这将处理 data/evaluation_data.json 中的 个问题,生成答案和上下文,保存到 data/evaluation_output.json。
# 执行 RAGAS 评估(需要 OpenAI API Key)
export OPENAI_API_KEY="your-api-key"
python run_ragas_eval.py评估指标:
- Faithfulness (忠实度): 答案是否基于检索到的上下文
- Context Recall (上下文召回): 上下文是否覆盖标准答案
- Context Precision (上下文精度): 上下文的相关性和信噪比
- Answer Relevancy (答案相关性): 答案是否切题
评估结果:
{'faithfulness': 0.8781, 'context_recall': 0.8764, 'context_precision': 0.9361, 'answer_relevancy': 0.6852}
所有配置集中在 config.py,主要配置项:
EMBEDDING_MODEL_PATH = "/nfs/huggingfacehub/Qwen3-Embedding-4B/"
LLM_MODEL_PATH = "/nfs/huggingfacehub/Qwen/Qwen2.5-14B-Instruct/"
DEVICE = "cuda" # 或 "cpu"
CUDA_VISIBLE_DEVICES = "4,5,6,7" # 使用的 GPU 编号DENSE_TOP_K = 5 # 向量检索 Top-K
BM25_TOP_K = 5 # BM25 检索 Top-K
HYBRID_TOP_K = 10 # 最终返回 Top-K
MAX_CONTEXT_LENGTH = 4000 # 最大上下文长度(字符)VLLM_TENSOR_PARALLEL_SIZE = 4 # 张量并行(GPU 数量)
VLLM_MAX_MODEL_LEN = 4096 # 最大序列长度
VLLM_GPU_MEMORY_UTILIZATION = 0.9 # GPU 显存利用率
VLLM_MAX_NUM_SEQS = 20 # 最大并发数详细配置说明请查看 CONFIG_README.md。
功能:
- 加载 PDF 文档
- 语义分块(SemanticSplitterNodeParser)
- 过滤和清洗
关键技术:
- 语义断点识别:计算相邻句子的向量相似度,在语义剧烈变化处切分
- 自适应阈值:使用第 95 百分位作为断点阈值
- 滑动窗口:buffer_size=3,考虑前后句子的上下文
功能:
- 向量化文本块
- 构建/加载 ChromaDB 索引
- 提供检索接口
特点:
- 持久化存储(避免重复向量化)
- 支持增量更新
功能:
- HyDE(假设性文档嵌入)查询增强
- 稠密向量检索
- BM25 稀疏检索
- RRF(互惠排序融合)
检索流程:
用户查询
↓
HyDE: LLM 生成假设答案
↓
并行检索: [向量检索] + [BM25 检索]
↓
RRF 融合排序
↓
返回 Top-K
功能:
- 加载 LLM 模型
- 提供 FastAPI 接口
- 支持流式/非流式响应
API 端点:
POST /chat: 问答接口- 参数:
prompt,stream,history - 返回: JSON 格式答案
- 参数:
功能:
- 交互式命令行界面
- 混合检索 + 上下文构建
- 调用 vLLM 服务生成答案
- 维护对话历史(最近 5 轮)
本项目采用 MIT 许可证。详见 LICENSE 文件。
本项目使用了以下开源项目:
- LlamaIndex - RAG 框架
- vLLM - 高性能 LLM 推理
- ChromaDB - 向量数据库
- Qwen - 通义千问模型
- RAGAS - RAG 评估框架
如有问题或建议,欢迎提 Issue 或 Pull Request。
⭐ 如果这个项目对你有帮助,请给个 Star!