✏️ 作者介绍:
梁天新博士,Milvus 用户
1. 应用背景
大中型企业通常会聘用上万名具备不同技能的员工,将他们分配在不同工作岗位上。人力资源部门在人员配置时需要先遍历公司内部职员的简历。当没有员工满足岗位需求时,则需要再遍历已收藏的上万份求职简历。先不论如何收藏管理海量简历,人工筛选简历非常耗时耗力,且容易出错。如何低投入地搭建一套易用、易维护的人力资源管理系统是长期困扰管理人员的难题。
搭建一套人力资源系统并非难事,但为每一份简历找到匹配的岗位并不容易。此过程主要面临以下几个难点:
个人简历写作格式不统一。为了使自己的简历更美观、更具吸引力,候选人会在简历中使用多种模版或添加图片。
个人简历文件格式不统一。Word 文档和 PDF 格式较为常见。还有大量以图片形式保存的简历。
首先,Word 文档和 PDF 格式文件无法直接存入数据库,即便经过人工录入也需要重新组织格式以满足现有系统的要求。其次,依赖 SQL 正则表达式检索语义相近的简历时不够准确。最后,传统数据库需要长期维护,包括人工整理、统一格式、规范化入库等步骤。
因此,我们尝试利用深度学习方法和 Milvus 向量搜索引擎搭建一套简便易行的人力资源查询管理系统。
2. 技术流程
图:技术流程图
2.1 提取 PDF 格式简历信息
本项目使用 pdfplumber 处理 PDF 文件。pdfplumber 可以:
获取 pdf 文件中的文字
提取表格内容:使用 pdfplumber 轻松提取简历中的教育背景等表格中的信息。
进行图形调整:PDF 页面截图中的文字或表格会被框起,因此我们能够判断 PDF 文件识别情况,以便及时调整配置。
2.2 简历中信息类型的划分
虽然简历格式不同,但所含信息大体类似。本项目将数万份简历中的信息进行如下划分:
基础信息:姓名、出生年月、学历、性别、电话、籍贯
教育经历:学位、毕业时间、毕业院校
工作经历:工作单位、工作时间、职务职位
项目经历:项目名称、项目时间、项目责任
个人技能:证书情况、个人荣誉、兴趣爱好
整理信息时需要合并相似类型的信息,例如:
“工作经历”、“工作经验”均属于“工作经历”
“教育经历”、“教育背景”均属于“教育背景”
“自我评价”、“个人信息'”、“证书情况”、“个人技能”、“个人荣誉”、“兴趣爱好”等均属于“个人技能”
2.3 构建信息抽取模型
在构建信息抽取模型前,我们需要将此前使用 pdfplumber 提取整理的信息制作成训练信息抽取模型的数据集。样例如下:
本项目使用 BERT-PointerNet 阅读理解式文档抽取模型。我们需要先确定抽取信息的类型,如“项目责任”,然后将信息类型同 BERT 模型进行二次合并,再用 PointerNet 抽取具体信息,如”主要负责为客户提供一手或二手房咨询、租赁买卖等相关业务的全程代理服务"。
图:BERT-PointerNet 模型[1]
我们使用训练过的 BERT-PointerNet[1]模型将非结构化的简历数据转换为向量,以便储存在 Milvus 向量搜索引擎中。
图:BERT-PointerNet 的测试效果
2.4 将数据存储在 Milvus 向量搜索引擎中
本项目中只有文本类型的数据才能被输入进数据库中。我们先搭建了 bert-serving-server 作为数据入库的 encoder 服务端,在 T4 下服务稳定,QPS 至少可以达到 16 条/秒。我们使用 Simbert 作为入库的 encoder 预训练词向量,准确率在本项目中比 bert-base 的高 10%。我们也尽量将年龄、工龄等信息转换成向量存储在数据库中。对难以转换成向量的内容信息,我们则选择进行数字化映射。
如学历的数字化映射: ['博后','博士','硕士','学士','大专','高中','其他']映射为 ['1','2','3','4','5','6','7']
每份简历具有唯一的 human_id。任意一条描述语句都作为一条 embedding 进入 Milvus 数据库,并且对应一个唯一的 unique_id。因此,每份简历都有数十个 unique_id 和一个唯一的 human_id。unique_id 对应的 embedding 代表了候选人的相关信息。这种数据入库方式有利于后续的数据查找和结果返回。
本项目中我们构建了两个collection,分别是项目经历 collection(Collection_Project)和工作经历 collection(Collection_Work)。每个候选人的两个 collection 中除了转换后的项目经历和工作经历 embedding 以外其余的都相同,特别是 human_id 完全一致。由于工作经历和项目经历在描述候选人历史的时候数据维度不同,因此需要分开存储,更利于精确寻找候选人。如下图:
2.5 查询方式
我们利用 Milvus 向量搜索引擎查询数据库中的简历信息。任意信息组合的查询均可在 20 毫秒内完成。例如:查找年龄在 20 至 40 岁之间、本科以上学历、精通策划项目、擅长编写 Java 和 Python 代码的候选人。
我们将“精通策划项目”和“擅长编写 Java 和 Python 代码“分别映射为两条向量输入到数据库中进行检索。样例如下:
通常我们选择前 topk=10 名,然后通过 human_id 进行去重,最后留下合适的候选简历。我们采用全量更新的策略:每次出现新简历入库或者无效简历删除,我们都会对库里的所有向量重新分配 ID。
3. 项目总结
本文详细介绍了如何利用 Milvus 搭建人力资源查询管理系统。我们搭建的人力资源查询管理系统具有低运营成本、高并发、易维护等优点。无需掌握 SQL 语句也可以轻松查询符合岗位需求的候选人。使用这个系统能够显著节省 IT 和人力成本。在当前这个文本、图像、音频等非结构化数据爆炸式增长的时代,通过 embedding 技术将非结构化数据映射成多维向量后再进行检索已成为趋势。Milvus 作为分布式向量检索引擎,具有高性能、易部署的特性。Milvus 极大地节省了项目开发成本,显著提高了系统检索性能,并很好地满足了本项目的技术和业务需求。
参考文献
[1] 王炳乾,梁天新,宿邵勋.基于BERT的多层标签事件抽取模型[J].中文信息学报,2020.
欢迎加入 Milvus 社区
github.com/milvus-io/milvus | 源码
milvus.io | 官网
milvusio.slack.com | Slack 社区
zhihu.com/org/zilliz-11| 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili
转载:https://blog.csdn.net/weixin_44839084/article/details/114362393