sumith3629-afk/RedRob
GitHub: sumith3629-afk/RedRob
基于语义检索与启发式重排序的候选人发现与排名系统,能在 CPU 环境下快速从十万候选人中筛选出最佳匹配并过滤异常档案。
Stars: 0 | Forks: 0
# Redrob AI 候选人发现与排名系统
这是我们为 Redrob 智能候选人发现与排名挑战赛提交的作品。我们构建了一个轻量级、快速且高度针对性的 pipeline,旨在为创始团队高级 AI 工程师职位检索前 100 名候选人。
我们的主要重点是在准确的语义搜索与严格的计算限制(在 5 分钟内仅使用 CPU 运行)之间取得平衡,并过滤掉数据集中嵌入的合成“honeypot”档案。
## 如何运行排名工具
你可以使用以下命令端到端地运行脚本:
```
# 1. 安装 dependencies
pip install -r requirements.txt
# 2. 运行 ranking script
python rank.py --candidates ./candidates.jsonl --out ./submission.csv
```
### 关于预计算 Embeddings 的说明
为了遵守 5 分钟的沙盒时间限制,我们使用 `all-MiniLM-L6-v2` 模型预计算了候选人档案的 sentence embeddings,并将其保存为 `candidate_embeddings.npy`。
如果根目录下存在 `candidate_embeddings.npy`,脚本将立即加载它并在 **约 10 秒内** 完成排名。如果缺失,脚本会自动回退到实时编码,这在 CPU 上大约需要 3 分钟。
## Pipeline 的工作原理
我们将排名 pipeline 划分为不同的阶段,以处理检索、清理和启发式重排序。
### 1. 过滤 Honeypot
挑战赛规范指出,数据集包含大约 80 名带有合成异常的 honeypot 候选人(例如,声称对使用了 0 个月的技能具有“专家”水平,或者列出的工作持续时间与开始和结束日期在数学上存在矛盾)。
为了防止这些档案进入我们的前 100 名,我们在 `rank.py` 中编写了一个检测代理,用于检查:
* 零持续时间的专家或高级技能 ($\ge 3$ 个实例)。
* 时间顺序上的工作冲突(所述持续时间比开始和结束日期之间的日历差值长 $> 6$ 个月)。
* 经验虚高(所述档案经验比所有工作持续时间的实际总和长 $> 3$ 年)。
在运行向量相似度搜索之前,该代理成功标记并从 10 万人的池子中移除了 **65 个 honeypot**,确保我们最终的前 100 名列表具有 0% 的 honeypot 率。
### 2. 语义检索
我们将候选人的职位、标题、摘要、技能和前 2 份工作描述组合成一个文本块。然后,我们使用 `all-MiniLM-L6-v2` 来计算职位描述与候选人档案之间的余弦相似度。这作为我们的基准语义分数。我们从此步骤中提取前 1,000 名候选人进行细粒度的重新排名。
### 3. 重排序启发式规则
A 轮初创公司的创始团队职位具有语义搜索可能无法单独捕捉到的特定要求。我们对前 1,000 名候选人应用以下规则:
* **产品公司与服务公司经验对比:** 我们奖励有产品公司(如 Google、Microsoft、Swiggy、Paytm)工作历史的候选人,并对只在传统 IT 服务/咨询公司(TCS、Wipro、Infosys、Accenture、Cognizant 等)工作过的候选人施加严厉的惩罚 ($-0.15$)。
* **地点与搬迁:** Noida 或 Pune 当地的候选人将获得 $+0.1$ 的奖励。愿意搬迁的候选人获得 $+0.05$。由于签证限制,印度以外的候选人将受到惩罚。
* **通知期:** 我们奖励能快速入职的候选人(通知期 $\le 30$ 天),给予 $+0.05$ 的奖励,并惩罚通知期 $> 90$ 天的候选人。
* **工作稳定性:** 我们惩罚频繁跳槽的行为(平均任期 $< 18$ 个月),并奖励稳定的职业发展路径(平均任期 $\ge 36$ 个月)。
* **评估:** 我们会根据他们在相关技术评估(NLP、Pinecone、Milvus、Vector Search 等)中的得分给予少量奖励。
### 4. 单调分数校准与平局判定
验证规范要求分数严格按排名非递增。我们校准最终分数以确保满足此条件,并通过按 `candidate_id` 升序排序来确定性地解决任何平局。
### 5. 自定义推理生成
为了通过人工审查检查,我们的脚本会为每位排名候选人生成一段自然的 1-2 句话的理由。它会动态插入具体事实(经验年限、当前职位、公司、技能和通知期),而不是使用静态模板,从而确保文本准确反映候选人的档案。
## 性能指标
* **总运行时间:** 在 CPU 上约 10 秒(使用 embedding 缓存)。
* **内存使用:** 约 1.2 GB RAM。
* **验证器状态:** 在官方 `validate_submission.py` 脚本上本地通过验证。
标签:SentenceTransformers, 人工智能, 候选人排序, 启发式算法, 招聘系统, 用户模式Hook绕过, 语义检索, 逆向工具