1.背景
在当前就业形势严峻的情况下,很大一部分学生毕业即失业,分析市场招聘行情并辅助高校及时调整专业,是确保教育资源有效配置和提高学生就业率的关键。
专业设置与市场需求对接:
通过分析当前市场上的岗位需求与国家职业大典的对应关系,高校可以更准确地了解哪些专业和课程设置更符合市场需求,从而调整和优化专业结构,培养更符合市场需求的毕业生。
职业发展趋势预测:
通过长期跟踪和分析市场岗位招聘情况,高校可以预测未来职业发展的趋势,提前调整教学内容和方法,培养学生的未来职业技能。
学生职业规划指导:
高校可以通过招聘市场数据分析,为学生提供更具体的职业规划指导,帮助他们了解不同专业对应的职业路径,以及如何根据自身兴趣和能力选择合适的专业和职业方向。
教学内容更新:
了解企业招聘岗位与职业大典的对应关系,有助于高校及时更新教学内容,确保课程内容与实际工作需求相匹配,提高教学的实用性和针对性。
校企合作深化:
通过对招聘数据的分析,高校可以更深入地了解企业对人才的具体需求,从而加强与企业的合作,开展实习实训、项目合作等,提高学生的实践能力和就业竞争力。
政策制定参考:
高校还可以将这些分析结果作为政策制定的参考,比如调整招生计划、优化资源配置等,以更好地服务社会和经济发展。
2.大模型
目前各大招聘网站上的公开招聘数据,岗位名称普遍都由招聘人员自行填写,相同职责的岗位存在很多种不同的岗位名称,这对数据分析带来很大困难。如何把这些不同平台非标准化岗位名称映射到国家标准职业大典上来,对于招聘分析就是一项很重要的且困难工作,以猎聘数据为例,北京地区招聘岗位名称去重之后有20多万不重复数据。
大语言模型因为具备强大的自然语言处理和理解能力,这一能力可以帮助标准化数据,提高数据质量和准确性。招聘岗位到职业大典关系映射,本质上就为每一个非标准化岗位名称找到一个对应标准职业大典名称,这刚好是大预言模型擅长的能力。
3.解决方案
当前主流的RAG流程,基于上图做轻微调整,应用到岗位名称数据标准化处理方面,数据处理流程如下图所示:
对职业大典做embedding,结果存入向量数据库,使用招聘平台获取到的岗位名称和岗位职责文本了内容,使用相同的embedding模型,转向量,使用这个结果与职业大典向量结果做相似度计算,取相似度前20的20个职业作为候选结果数据。把这20个候选结果与岗位信息一同输入到大模型,让模型从20个候选结果里选出一个最合适的标准职业名称,作为这个岗位的标准职业名称,完成非标准岗位名称到职业大典名称的自动映射。
4.代码实现
职业大典数据embedding:
from text2vec import SentenceModel, semantic_search
def compute_embedding(self):
self.embedder = SentenceModel(r'./text2vec-base-chinese-paraphrase',
device="cpu")
self.corpus_embeddings = self.embedder.encode(self.zhiyedadian)
使用招聘平台岗位名称搜索20个相似职业名称:
def similar_search(self, jobname):
'''
利用本地embedding模型匹配出最相似的20个职业
:param query:
:return:
'''
query_embedding = self.embedder.encode(jobname)
hits = semantic_search(query_embedding, self.corpus_embeddings, top_k=20)
hits = hits[0]
standardjob = ""
for hit in hits:
standardjob += self.zhiyedadian[hit['corpus_id']]
standardjob += ","
return standardjob
借助AI大模型从上述20个候选结果中选出一个最符合该岗位名称的职业大典名称作为结果输出:
构造提示词:
def get_prompt(job_name,standard_job_list):
'''
组合提示词:提示词可以优化调整,测试不同提示词输出效果
:param job_name:岗位名称
:param standard_job_list:候选职业列表
:return:
'''
prompt = '''我需要映射某个职业到一个我提供的职业列表以及职业描述,给我从职业列表中挑出与查询职业最相似的映射。给你个例子:{{"查询职业":"照明设计”}},
{{"职业列表":[照明设计师,照明工,照明工程施工员,灯具设计师,光源与照明工程技术人员,照明器具制造人员,园林绿化工程技术人员L,灯光师,风景园林工程技术人员L,绿化与园艺服务人员]}},你需要给我返回{{"照明设计":"照明设计师"}},如果找不到,给我返回{{“照明设计”:None}}
下面是我提供的{{"查询职业":"{}"}}。 {{"职业列表":[{}] }},给我返回类似{{"xxxx":"xxxx"}}的结果,只需要输出最符合的一个职业名称,不要输出无关的多余内容'''.format(
job_name, standard_job_list)
return prompt
调用大模型API选取一个职业名称
def call_ai(job_name,standard_job_list):
'''
调用大模型优化结果,从20个候选结果中选出最优的1个结果数据
:param job_name:岗位名称
:param standard_job_list:相似度筛选的结果集
:return:
'''
#自己的AIP-key
API_KEY = 'sk-XXXXXXX'
client = OpenAI(
api_key=API_KEY,
base_url="https://api.xxx.cn/v1",
)
#获取提示词
prompt = get_prompt(job_name,standard_job_list)
#调用大模型API优化结果,得到最符合岗位名称的职业大典名称
completion = client.chat.completions.create(
model="xxx-v1-8k", #模型
messages=[
{"role": "system",
"content": "你是人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。"},
{"role": "user", "content": prompt}
],
temperature=0.3,
)
result = completion.choices[0].message.content
return result
5.数据处理结果
经过以上的数据处理流程,我们从结果数据集中随机抽取了50条记录,如下图所示:
数据分析显示,岗位名称与职业大典之间的映射准确率极为出色
6.总结:
模型选择问题
在处理数据时,我们发现诸如chatgpt、智谱AI、千问、kimi、文心一言等大型AI模型在处理这类任务时表现相似,差异不大。即便是一些开源模型,虽然它们的准确率稍逊一筹,但仍能胜任基本的处理需求。
API费用问题
考虑到我们面临的实际挑战——不同平台汇总之后岗位名称去重后的数据量高达千万级别,这意味着频繁调用大型AI模型的API将产生显著的成本。为了有效控制成本,我们可以巧妙利用各大AI模型公司为个人用户提供的每日免费调用量。通过合理规划和分配这些免费资源,我们不仅能够完成大规模的数据处理任务,还能在保证质量的同时,实现成本的最优化。