# SmartRecruit
**Repository Path**: giteets/smart-recruit
## Basic Information
- **Project Name**: SmartRecruit
- **Description**: 【唐僧】SmartRecruit项目教学代码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 6
- **Created**: 2026-04-27
- **Last Updated**: 2026-09-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SmartRecruit — 基于 RAG 的智能简历推荐系统
> 一个完整的教学实战项目:用户输入自然语言招聘需求,系统通过多路召回 + 重排 + LLM 审核从简历库中自动匹配候选人。
## 项目简介
SmartRecruit 展示了如何用 **RAG(检索增强生成)** 技术构建一个实用的简历推荐系统。系统并非简单的关键词匹配,而是模拟真实招聘场景:
- 用户像和 HR 聊天一样描述需求("我需要一个5年经验的 Python 后端,最好有分布式系统经验")
- 系统自动理解意图、提取筛选条件(性别/年龄/经验年限),从简历库中检索
- 最终由 LLM 做最后一道审核,只推荐真正匹配的候选人
## 核心技术亮点
| 能力 | 实现方式 |
|---|---|
| **多路召回** | Milvus 稠密向量 + 稀疏向量(BGE-M3 一路出两路)+ ES BM25 关键词,三路合并 |
| **智能重排** | BGE-Reranker CrossEncoder 精排,按语义相关性重排所有召回结果 |
| **结构化过滤** | LLM 提取性别、年龄、经验等参数,转为 Milvus Filter 表达式缩小搜索范围 |
| **父子块策略** | 父块(1000字)保完整语义,子块(400字)提高检索精度,重排时用父块文本 |
| **意图路由** | 7 种意图分类(招聘/修改条件/追问/通用问答/闲聊/元问题/兜底),不同意图走不同处理链 |
| **多轮对话** | 对话历史感知,支持逐步细化需求("男的" "再加个3年以上经验") |
| **LLM 生成推荐** | LLM 根据用人需求和重排后的简历上下文,生成结构化推荐(Prompt 中内置审核筛选逻辑) |
| **去重机制** | 基于 doc_hash 去重,同份简历不会重复推荐 |
## 系统架构
```
用户输入 → 意图识别 → 参数提取 → 查询改写 → 三路召回(Milvus+ES) → 合并去重 → 重排 → LLM生成推荐(含审核筛选) → 推荐结果
```
**数据存储**采用三库架构:
- **Milvus**:存储稠密+稀疏向量,负责语义检索
- **Elasticsearch**:BM25 关键词检索,弥补向量检索在精确匹配上的不足
- **MongoDB**:存储完整简历原文和结构化元数据(姓名、性别、年龄、经验等)
## 整体架构
```mermaid
graph TB
subgraph 交互层
UI["🖥️ Streamlit Web UI
app.py"]
UI -->|"聊天输入"| Agent
UI -->|"上传简历"| DocProc
end
subgraph Agent层["Agent 层(意图路由 + RAG 链)"]
Agent["🧠 SmartRecruitAgent
rag_pipeline.py"]
Intent["意图识别
7 种分类"]
ParamExtract["参数提取
性别/年龄/经验"]
RAGChain["RAG 检索链
chain.py"]
Agent --> Intent
Intent -->|"recruitment / refinement"| RAGChain
Intent -->|"follow_up"| LLMFollowUp["追问处理链"]
Intent -->|"general_qa"| LLMQA["通用问答链"]
Intent -->|"chit_chat / meta"| Preset["预设回复"]
RAGChain --> ParamExtract
end
subgraph 数据层["数据层(三库 + 向量模型)"]
DocProc["📄 文档处理
document_processor.py"]
VecStore["🔍 VectorStore
vector_store.py"]
Milvus[("Milvus
稠密+稀疏向量")]
ES[("Elasticsearch
关键词检索")]
Mongo[("MongoDB
完整简历")]
BGE_M3["BGE-M3
嵌入模型"]
BGE_Rerank["BGE-Reranker
重排模型"]
end
RAGChain --> VecStore
VecStore --> BGE_M3
VecStore --> BGE_Rerank
VecStore --> Milvus
VecStore --> ES
VecStore --> Mongo
DocProc -->|"切块+结构化"| VecStore
```
## 模块说明
| 模块 | 文件 | 职责 |
|---|---|---|
| 文档处理 | `utils/document_processor.py` | 多格式加载、结构化提取、父子块切分 |
| 向量存储 | `utils/vector_store.py` | Milvus/ES/MongoDB 三库管理、混合检索+重排 |
| RAG 链 | `rag/chain.py` | LangChain LCEL 链:查询改写→检索→生成 |
| 意图路由 | `rag/rag_pipeline.py` | Agent 意图识别、参数提取、多轮对话管理 |
| 评估 | `eval/evaluator.py` | Ragas 四指标评估(忠实度/相关性/精确度/召回度) |
| Web 应用 | `app.py` | Streamlit UI:聊天推荐 + 简历上传 |
| 数据初始化 | `system_data_init.py` | 批量扫描简历目录并入库 |
| 配置 | `config.py` | Pydantic 配置:数据库连接、模型路径、切分参数 |
## 技术栈
| 角色 | 技术 | 说明 |
|---|---|---|
| 向量数据库 | Milvus 2.5 | 存储稠密+稀疏向量,支持混合检索 |
| 全文检索 | Elasticsearch 8.x | BM25 关键词检索 |
| 文档存储 | MongoDB 7.x | 完整简历原文 + 元数据 |
| 嵌入模型 | BGE-M3(本地) | 1024 维稠密 + 稀疏向量,一个模型两路召回 |
| 重排模型 | BGE-Reranker-Base(本地) | CrossEncoder 精排 |
| LLM | 通义千问 qwen-plus | 意图识别、参数提取、查询改写、答案生成 |
| 框架 | LangChain 0.3 | LCEL 链式编排 |
| 前端 | Streamlit 1.45 | Web UI 原型 |
| 评估 | Ragas 0.2 | RAG 质量评估 |
## 数据流
```mermaid
flowchart LR
subgraph 写入流程["简历入库流程"]
Resume["📄 原始简历
PDF/DOCX/TXT/MD/图片"]
Resume -->|"加载"| Extract["提取纯文本"]
Extract -->|"MD5 去重"| Hash{"已存在?"}
Hash -->|"是"| Skip["跳过"]
Hash -->|"否"| Struct["LLM 结构化提取
姓名/性别/年龄/经验"]
Struct --> Chunk["父子块切分
父1000字 → 子400字"]
Chunk --> Encode["BGE-M3 编码"]
Encode --> Store["三库写入
Milvus + ES + MongoDB"]
end
subgraph 查询流程["推荐查询流程"]
Query["💬 用户输入
'需要AI产品经理'"]
Query --> Intent{"意图识别"}
Intent -->|"招聘需求"| Rewrite["查询改写"]
Rewrite --> Search["混合检索
稠密+稀疏+关键词"]
Search --> Rerank["BGE-Reranker 精排"]
Rerank --> Dedup["doc_hash 去重"]
Dedup --> Gen["LLM 生成推荐
(含审核筛选)"]
Gen --> Result["📋 推荐结果
候选人卡片"]
end
```
## 目录结构
```
2026-04-22-smartrecruit/
├── app.py # Streamlit 主应用(交互层)
├── config.py # Pydantic 配置类
├── system_data_init.py # 批量简历入库脚本
├── .env # 环境变量(DASHSCOPE_API_KEY)
├── requirements.txt # Python 依赖
│
├── rag/ # Agent 层
│ ├── chain.py # RAG 检索链(LCEL)
│ └── rag_pipeline.py # 意图路由 Agent
│
├── utils/ # 数据层
│ ├── document_processor.py # 文档加载与处理
│ ├── vector_store.py # 向量存储与检索
│ └── model_download.py # 模型下载工具(BGE-M3/BGE-Reranker)
│
├── eval/ # 评估模块
│ └── evaluator.py # Ragas 评估
│
├── models/ # 本地模型文件
│ ├── bge-m3/ # BGE-M3 嵌入模型
│ └── bge-reranker-base/ # BGE-Reranker 重排模型
│
├── mongodb/ # MongoDB 前置学习(基础操作演示)
├── elasticsearch/ # Elasticsearch 前置学习(基础操作演示)
├── milvus/ # Milvus 前置学习(基础操作演示)
├── data/resume/ # 简历文件(支持 PDF/DOCX/TXT/MD/图片)
├── tests/ # 测试脚本
├── logs/ # 运行日志
│
├── deployment/ # Docker 部署文件
│ └── docker-compose.yml # 中间件编排(MongoDB/ES/Milvus/Attu)
│
└── lectures/ # 📚 模块讲义
├── 00-deployment/ # Docker 部署方案
├── 01-document-processor/ # 文档处理模块讲义
├── 02-vector-store/ # 向量存储模块讲义
├── 03-rag-chain/ # RAG 链模块讲义
├── 04-rag-pipeline/ # 意图路由模块讲义
├── 05-evaluator/ # 评估模块讲义
└── 06-app/ # Web 应用模块讲义
```
## 快速开始
> 详细部署方案见 [lectures/00-deployment/](lectures/00-deployment/README.md)
### 环境依赖
- Docker + Docker Compose(用于部署 MongoDB、Elasticsearch、Milvus)
- Python 3.10+
- 通义千问 API Key([DashScope](https://dashscope.aliyuncs.com/))
### 部署步骤
```bash
# 1. 配置 Docker 镜像加速(见 lectures/00-deployment/ 第三节)
# 2. 启动中间件
cd deployment
docker compose up -d
# 3. 创建 Python 环境
# 方式一:venv
python3 -m venv .venv && source .venv/bin/activate
# 方式二:conda
conda create -n smartrecruit python=3.10 -y && conda activate smartrecruit
# 4. 安装依赖
pip install -r requirements.txt
# 5. 配置 API Key
echo 'DASHSCOPE_API_KEY=sk-your-actual-api-key' > .env
# 6. 初始化简历数据【06-app模块完成时会初始化数据】
python system_data_init.py
# 7. 启动应用(如遇 torchvision 警告见 06 讲义)
streamlit run app.py
```
## 讲义目录
| # | 模块 | 讲义链接 | 核心知识点 |
|---|---|---|---|
| 00 | 部署 | [讲义](lectures/00-deployment/) | Docker Compose、镜像加速、环境配置、启动验证 |
| 01 | 文档处理 | [讲义](lectures/01-document-processor/) | 多格式加载、父子块切分、LLM 结构化提取 |
| 02 | 向量存储 | [讲义](lectures/02-vector-store/) | 稠密/稀疏向量、三库架构、混合检索+重排 |
| 03 | RAG 链 | [讲义](lectures/03-rag-chain/) | LCEL 链编排、查询改写、上下文构建 |
| 04 | 意图路由 | [讲义](lectures/04-rag-pipeline/) | 7 类意图识别、参数提取、多轮对话 |
| 05 | 评估 | [讲义](lectures/05-evaluator/) | Ragas 四指标、健全性检查、端到端评估 |
| 06 | Web 应用 | [讲义](lectures/06-app/) | Streamlit UI、Session State、缓存策略、数据初始化 |