自动为本科生寻找方向匹配、有招生意向的博士/硕士导师
MentorRadar 是一个基于 LLM 的自动化导师搜索工具。输入你的毕业年份、研究兴趣和目标学校范围,它会自动爬取院系师资页面、匹配研究方向、查找招生信息,最终生成一份结构化的 Markdown + JSON 推荐报告。
- 自动发现院系:内置 C9/985 高校的计算机、人工智能等院系数据库,无需手动输入链接
- 关键词扩展:LLM 自动将你的研究方向扩展为 40+ 相关关键词(中英文),提升召回率
- 智能匹配:对教师研究方向进行关键词评分,并通过 LLM 深度语义分析
- 招生状态识别:自动搜索并判断导师是否明确招生(✅ 明确招生 / 🟡 可能招生 / ❓ 未知)
- 多维度报告:每位导师附带职称、研究方向、匹配得分、代表论文、邮箱、主页链接
- 反爬处理:自动修正反转邮箱、SSL 兼容回退、JS 渲染页面搜索回退
- 每校配额:多校搜索时自动分配名额,确保各校均有代表性结果
输入 (毕业年份 + 研究方向 + 学校范围)
│
▼
Phase 0: 解析输入,LLM 扩展关键词 (~40个)
│
▼
Phase 1: 从数据库加载目标院系列表
│
▼
Phase 2: 抓取院系师资页面,提取教师名单
(若页面 JS 渲染无法访问,自动搜索回退)
│
▼
Phase 3: 关键词 + LLM 双重匹配,筛选相关教师
│
▼
Phase 4: 爬取教师个人主页,提取详细信息
(职称 / 研究方向 / 论文 / 邮箱)
+ 依据实际方向重新评分,过滤无关教师
│
▼
Phase 5: 搜索招生信息,LLM 判断招生状态
│
▼
Phase 6: 生成 Markdown + JSON 报告(按匹配度排序)
- Python 3.11+
- Windows / macOS / Linux
- 需要能访问 OpenRouter 或 DeepSeek API(国内需要代理或直连 DeepSeek)
- 搜索引擎使用 DuckDuckGo(国内网络可能需要代理)
git clone https://github.com/yourname/MentorRadar.git
cd MentorRadar# Conda
conda create -n dsf python=3.11
conda activate dsf
# 或者 venv
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activatepip install -e ".[search]"复制示例文件并填写 API Key:
cp .env.example .env然后编辑 .env:
# ── LLM 提供商选择 ──────────────────────────────────────────
# 可选值: openrouter_free | deepseek
DSFINDER_LLM_PROVIDER=openrouter_free
# ── API Keys (按所选 Provider 填写一个即可) ────────────────
# OpenRouter Key (在 https://openrouter.ai/keys 获取,注册即免费)
DSFINDER_OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxx
# DeepSeek Key (在 https://platform.deepseek.com 获取,按量计费)
DSFINDER_DEEPSEEK_API_KEY=
# ── 模型覆盖 (可选,留空则使用 Provider 默认模型) ─────────
# 使用 OpenRouter 时,可指定具体模型,例如:
# deepseek/deepseek-v3.2 (~$0.26/M tokens,推荐)
# google/gemma-3-27b-it:free (完全免费,但有限速)
DSFINDER_LLM_MODEL_LIGHT=deepseek/deepseek-v3.2
DSFINDER_LLM_MODEL_HEAVY=deepseek/deepseek-v3.2
# ── 抓取配置 ────────────────────────────────────────────────
DSFINDER_REQUEST_DELAY=2.0 # 请求间隔(秒),过低可能触发反爬
DSFINDER_MAX_CONCURRENT_SCHOOLS=3 # 并发学校数| 场景 | 推荐配置 | 费用 |
|---|---|---|
| 首次试用 / 测试逻辑 | openrouter_free + google/gemma-3-27b-it:free |
免费(有限速) |
| 正式使用(推荐) | openrouter_free + deepseek/deepseek-v3.2 |
~¥0.3/次完整搜索 |
| 国内直连 DeepSeek | deepseek + DeepSeek Key |
同上,延迟更低 |
run.bat
首次运行会提示填写 API Key,填写后再次双击即可进入命令行交互。
基本用法:
python -m src.main --year 2027 --interests "大语言模型" "自然语言处理" --tier C9指定具体学校:
python -m src.main --year 2027 --interests "计算机视觉" "多模态" --schools "清华大学" "北京大学" "上海交通大学"按学校层次搜索:
# C9 高校
python -m src.main --year 2026 --interests "强化学习" "机器人" --tier C9
# 985 高校(范围更广,耗时更长)
python -m src.main --year 2027 --interests "自然语言处理" --tier 985 --max-results 100排除某些学校:
python -m src.main --year 2027 --interests "大语言模型" --tier C9 --exclude "清华大学" "北京大学"控制返回数量:
# 默认 50,每所学校最多 max-results/学校数 位(至少5位)
python -m src.main --year 2027 --interests "大语言模型" --tier C9 --max-results 100run.bat --year 2027 --interests "大语言模型" "自然语言处理" --schools "清华大学" "哈尔滨工业大学"报告保存在 output/ 目录,文件名含时间戳:
output/
├── report_20260331_021219.md # Markdown 格式(可直接阅读)
└── report_20260331_021219.json # JSON 格式(可程序处理)
# MentorRadar 导师推荐报告
## 查询条件
- 目标: 2027年毕业, 方向: 大语言模型, 自然语言处理, 范围: 哈尔滨工业大学
## 搜索统计
- 搜索学校: 1 所 | 搜索院系: 2 个 | 扫描教师: 16 位 | 匹配教师: 13 位
---
### 1. 张伟男 — 哈尔滨工业大学 社会计算与信息检索研究中心
- **职称**: 教授、人工智能学院执行院长、博士生导师
- **研究方向**: 人工智能, 具身智能, 大模型, 人机对话
- **匹配度**: ★★★★☆ (0.85)
- **匹配分析**: 方向标注为DT(对话系统),是LLM的核心应用领域,高度匹配
- **招生状态**: 🟡 可能招生
- **邮箱**: wnzhang@ir.hit.edu.cn
- **主页**: https://homepage.hit.edu.cn/zhangweinan
- **代表论文**: ...| 标识 | 含义 |
|---|---|
| ✅ 明确招生 | 主页或公告中有明确的招生说明 |
| 🟡 可能招生 | 在职博导,有招生可能,未找到明确公告 |
| ❓ 未知 | 未找到足够信息判断 |
| 分数 | 含义 |
|---|---|
| ★★★★★ (0.9+) | 研究方向高度契合,多个核心关键词命中 |
| ★★★★☆ (0.7-0.9) | 研究方向明显相关,核心方向一致 |
| ★★★☆☆ (0.6-0.7) | 研究方向部分重叠 |
| ★★☆☆☆ (0.4-0.6) | 有相关性,建议进一步确认 |
| ★☆☆☆☆ (0.2-0.4) | 相关性较低,需自行判断 |
| 参数 | 必填 | 说明 | 示例 |
|---|---|---|---|
--year |
✅ | 本科毕业年份(用于判断招生时间窗口) | --year 2027 |
--interests |
✅ | 研究方向关键词,可多个 | --interests "大语言模型" "NLP" |
--tier |
三选一 | 学校层次(C9 / 985 / 211 / 双一流) | --tier C9 |
--schools |
三选一 | 指定具体学校列表 | --schools "清华大学" "北大" |
--benchmark |
三选一 | 基准学校(搜索该学校及以上水平) | --benchmark "南京大学" |
--exclude |
❌ | 排除的学校 | --exclude "清华大学" |
--max-results |
❌ | 最多返回教师数(默认50) | --max-results 100 |
| 学校 | 支持院系 | 状态 |
|---|---|---|
| 北京大学 | 信息科学技术学院、计算机学院、智能学院 | ✅ |
| 清华大学 | 计算机科学与技术系、软件学院、人工智能学院 | ✅ |
| 复旦大学 | 计算机科学技术学院、人工智能创新研究院 | ✅ |
| 上海交通大学 | 计算机科学与工程系、人工智能研究院 | ✅(部分页面需搜索回退) |
| 浙江大学 | 计算机科学与技术学院 | |
| 中国科学技术大学 | 计算机科学与技术学院 | ✅ |
| 南京大学 | 计算机科学与技术系、人工智能学院 | ✅ |
| 哈尔滨工业大学 | 计算机科学与技术学院、社会计算与信息检索研究中心 | ✅ |
| 西安交通大学 | 计算机科学与技术学院、人工智能学院 |
说明:浙大和西交的校园网站存在 SSL 协议版本兼容性问题,程序会自动尝试多种回退策略并记录在报告的"未完成项"中。
985 高校数据库中包含 39 所学校,但院系数据库(data/departments.json)目前以 C9 为主。对于 C9 以外的 985 学校,程序会使用搜索引擎回退策略发现相关教师,效果相对有限。
欢迎通过 Pull Request 补充其他学校的院系数据。
检查 .env 文件中是否正确填写了 API Key,注意:
- 使用 OpenRouter 时,Key 应填在
DSFINDER_OPENROUTER_API_KEY - 使用 DeepSeek 时,Key 应填在
DSFINDER_DEEPSEEK_API_KEY - 不要编辑
.env.example,要编辑.env
OpenRouter 上的免费模型会不定期下线。编辑 .env,将 DSFINDER_LLM_MODEL_LIGHT 和 DSFINDER_LLM_MODEL_HEAVY 改为当前可用的免费模型。可在 OpenRouter Models 查看当前所有免费模型。
DuckDuckGo 在部分网络环境下需要代理。建议:
- 配置系统代理后重试
- 程序已内置多引擎回退,实际影响有限
可能原因:
- 该学校院系页面使用 JavaScript 动态加载(程序已有搜索回退,但覆盖率有限)
- SSL 证书版本过旧(程序已尝试 3 种 SSL 策略)
- 网站暂时不可访问
失败的院系会记录在报告末尾的"未完成项"部分。
- 每位教师需约 30-60 秒(包含网页抓取 + 2-3 次 LLM 调用)
- 搜索 C9 全部学校 + 50 名教师约需 30-60 分钟
- 建议先用
--schools "学校A" "学校B"测试 1-2 所学校,确认效果后再扩大范围 - 使用 DeepSeek 直连(国内)比 OpenRouter 延迟更低
部分高校(如哈工大)用 CSS/JS 对邮箱进行反转处理防止爬虫,程序会自动检测并修正。若仍出现异常,可直接访问教师主页确认联系方式。
编辑 data/departments.json,按如下格式添加:
{
"某某大学": [
{
"name": "计算机科学与技术学院",
"url": "https://cs.xxx.edu.cn",
"faculty_url": "https://cs.xxx.edu.cn/jsml/list.htm",
"tags": ["计算机", "AI", "NLP"]
}
]
}其中 faculty_url 是教师列表页的直接链接,tags 用于关键词匹配优先级。
- 使用
google/gemma-3-27b-it:free等免费模型 - 完全免费,但存在速率限制(可能触发 429 错误,程序会自动重试)
- 适合测试和低频使用
以 deepseek/deepseek-v3.2(通过 OpenRouter,$0.26/M input tokens)为例:
| 操作 | 约消耗 tokens | 约费用 |
|---|---|---|
| Phase 0 关键词扩展 | ~500 | <$0.001 |
| Phase 2 教师列表提取(每个院系) | ~3000 | ~$0.001 |
| Phase 3 方向匹配(每批教师) | ~2000 | ~$0.001 |
| Phase 4 教师详情提取(每位) | ~2000 | ~$0.001 |
| Phase 5 招生判断(每位) | ~1500 | <$0.001 |
| 完整搜索 1 所学校(~10位教师) | ~50,000 | ~$0.02(约¥0.15) |
| 完整搜索 C9(~50位教师) | ~200,000 | ~$0.08(约¥0.6) |
实际费用受模型选择、页面内容长度、重试次数等因素影响,以上为粗略估算。
MentorRadar/
├── src/
│ ├── main.py # 命令行入口
│ ├── pipeline.py # 主流程编排(Phase 0-6)
│ ├── config.py # 配置管理(API Key、模型选择)
│ ├── models/
│ │ └── schemas.py # Pydantic 数据模型
│ ├── phases/
│ │ ├── p0_input.py # 输入解析 + 关键词扩展
│ │ ├── p1_department.py # 院系发现
│ │ ├── p2_faculty.py # 教师列表抓取
│ │ ├── p3_match.py # 方向匹配
│ │ ├── p4_detail.py # 教师详情抓取
│ │ ├── p5_recruitment.py# 招生信息搜索
│ │ └── p6_report.py # 报告生成
│ ├── llm/
│ │ └── client.py # LLM 客户端(OpenAI-compatible)
│ ├── scraper/
│ │ └── fetcher.py # HTTP 抓取(SSL 兼容处理)
│ └── search/
│ └── engine.py # DuckDuckGo 搜索封装
├── data/
│ ├── departments.json # 院系数据库(C9 + 部分985)
│ ├── schools.json # 学校层次数据(C9/985/211)
│ └── prompts/ # LLM Prompt 模板
├── output/ # 报告输出目录(自动创建)
├── .env.example # 环境变量示例
├── pyproject.toml # 项目依赖
└── run.bat # Windows 一键运行脚本
MIT