探索GPT-3中用于搜索,分类和提取任务的快速工程
介绍
虽然GPT-3已经发布了很长一段时间,因为它在编写类似人类的故事和诗歌方面的卓越能力而受到广泛关注,但我从来没有想到它附带的API能够为构建具有广泛应用程序的数据产品提供如此大的灵活性和方便性。
在本文中,我试图探索一些与我在就业市场中看到的问题相关的用例,并试图理解构建基于语言的数据产品在未来可能只是围绕着“即时工程”。
与此同时,本文并不试图解释GPT-3是如何工作的,也不试图解释它如何能够完成它正在做的事情。关于这些话题的更多细节已经在Jay Alammar1和Max Woolf2等文章中写得很详细。GPT-3论文本身可以在3中引用。
在GPT-3的API中,’ prompt '是提供给API的一个参数,以便它能够识别要解决的问题的上下文。根据提示的编写方式,返回的文本将尝试匹配相应的模式4。
下面是一个提示的例子,我们试图通过编程API来在银行部门的范围内提供答案。“Q:”和“A:”格式,连同问题文本和它的回答,提示模型,我们正在寻找的存在于银行领域(或至少,这是我如何理解它:))
def call_openapi(question):
response = openai.Completion.create(
engine="davinci",
prompt="""
This is a banking expert.
Q: What is interest rate?
A: The interest rate is the amount a lender charges for the use of assets expressed as a percentage of the principal.
Q: What is PD?
A: Probability of default.
Q: {question}?
A:""".format(question=question),
temperature=0.3,
max_tokens=60,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
return response
一旦设置了提示,我们现在就可以自由发送我们的文本(或问题,如果你愿意的话)。
如上所述,我们可以看到我们得到的回答确实听起来合理(如果不是一个准确的答案本身)。
关于如何配置提示的其他创造性方法,请参阅其GPT-3 API页面5的示例部分。或者,您也可以参考我的代码来检查文本分类和产品命名任务的提示示例。
回到我们的议程,让我们看一下可以应用GPT-3的就业市场领域的一些现有用例。
免责声明:虽然我以前在一个工作网站公司工作过,但我并没有直接参与下面提到的大多数用例。因此,在现实生活中,所演示的问题的解决方案可能与我解决它的方式完全不同。这意味着我的解决方法可能存在明显的漏洞。
案例1:工作的分类匹配
问题
客户提供的招聘广告。(雇主),我们(作为工作市场)想要帮助他们快速分类他们的广告到正确的工作类别,从而帮助工作广告在稍后的工作门户发现。
虽然这个问题可能由我们的客户/客户经理(即。我们帮助我们的客户填写表单),这种方法(由我们的客户自己或客户经理填写表单)经常容易出错,而且从长远来看无法扩展(更不用说,归因于错误的数据收集)。
解决方案
根据职位标题和描述,我们尝试根据根据配置的提示出现的单词的可能性来推断职位类别。
我们通过GPT-3来提示职位名称、描述和类别是什么样子的。我们将保留最后一个作业专业为空,作为一种向API发出信号的方式,表明这是它接下来需要填充的位置。’ ### '关键字被定义为该配置中的停止字符。
def call_openapi(title, desc):
response = openai.Completion.create(
engine="davinci",
prompt="""This is a job specialization classifier
Job title: Account Executive
Job description: Handle full set of accounts.\n
Familiar with Income Tax filing.\n
Maintain daily cash flow and reporting.\n
Prepare monthly and annual financial reports.\n
Maintain proper records of all accounting transactions.\n
Perform general administrative and other accounting duties from time to time.
Job specialization: Accounting/Finance
###
Job title: Senior Accounts Executive
Job description: To handle a full set of Accounts.\n
To be responsible for monthly closing of accounts with relevant supporting schedules in an accurate and timely manner.\n
Preparation of any financial ad-hoc reports.\n
Reviewing all invoices and payment instructions and preparing creditors’ payment for payment processing.\n
To prepare invoices for approval by the relevant Head of Department.\n
To ensure that the Account Payable records are updated accurately and timely for management reporting purposes.\n
To review and process staff claims.\n
Liaison with Auditors, Company Secretary, Tax Agent and Bank Officers
Job specialization: Accounting/Finance
###
Job title: Account Executive
Job description: Compiling and analyzing data to find trends.\n
Developing sales strategies and setting quotas.\n
Staying current on company offerings and industry trends.\n
Maintaining a database of contact information.\n
Building long-lasting, mutually beneficial relationships with external contacts and internal departments to create a better customer experience.
Job specialization: Sales/Marketing
###
Job title: Sales Consultant (General)
Job description: Develop and formulate strategic and tactical plans in a sizeable market portfolio. Ensure KPI and goals of the assigned accounts are met.\n
Build market position by identifying potential business deals and close relationship with existing and new customers;\n
Develop and formulate strategies to acquire new business.\n
Provide and screen data/information for potential business deals by analysing market strategy, examining risks and financial accuracy for business decision making;\n
Grow account depth and breadth\n
Develop Account plans for all KPI customers.\n
Accountable on driving every opportunity to closure with a close plan.\n
Keeping track of all post sales activities with daily sales report.
Job specialization: Sales/Marketing
###
Job title: {job_title}
Job description: {job_desc}
Job specialization:""".format(job_title=job_title, job_desc=job_desc),
temperature=0.3,
max_tokens=60,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["###"]
)
return response
def extract_ans(response):
return print('Job specialization: ', response.choices[0].text.partition('\n')[0])
我们为GPT-3提供了很少的关于“会计/财务”和“销售/市场”职位类别的例子。在下面的图片中,我们可以看到,在这两种情况下,它都能够为输入返回正确的答案。
在下面的例子中,我们试图测试属于完全不同类别的招聘广告,从原始提示(即。会计/财务和销售/营销”)。虽然测试样本很小,但结果响应也是积极的。
关于最后一个例子,让我惊讶的是,模型本身能够处理马来语输入,而不需要首先将文本翻译成英语。
案例2:工作的搜索排序
问题
在这个问题中,一个客户试图找到市场上最相关的工作。招聘广告应该按什么顺序展示给他/她?
现实中解决这个问题的现有方法实际上比我提出的要复杂得多。在个性化时代,向用户展示的内容在很大程度上取决于一些因素,如最近的浏览行为、个人资料等。
为了将问题空间限制在一个更易于管理的范围内,我们首先集中精力确定我们认为广告可能属于哪一种工作类别。如果不是因为单词会根据使用的上下文有不同的意思,这个任务一开始看起来很简单。
解决方案
基于提供的职位名称,我们试图根据职位分类的语义相似度得分的顺序对固定数量的职位分类进行排序。
正如前面所做的,第一步是为API配置正确的提示符。
# based on job classification on jobstreet.com
job_classification = [
"accounting/finance",
"admin/human resources",
"sales/marketing",
"arts/media/communications",
"services",
"hotel/restaurant",
"education/training",
"computer/IT",
"engineering",
"manufacturing",
"building/construction",
"science",
"healthcare"
]
def call_openapi(query, documents=job_classification):
response = openai.Engine("ada").search(
documents = documents,
query=query,
max_rerank=5
)
return response
def sort_score(response,documents=job_classification):
response_scores = [i.score for i in response.data]
zipped_list = zip(response_scores,documents)
sorted_zipped_lists = sorted(zipped_list, reverse=True)
return sorted_zipped_lists
对于这个任务,我们使用GPT-3中的’ search ‘模块(与前面的’ completion '模块相反)。这将确保我们不是试图完成前面给出的提示(如前面的用例),而是要求API返回查询之间的语义相似度评分(即。职位名称)及参考文件(如:工作分类清单)。
一旦出现提示,我们就可以继续测试API。下面的示例演示了一般情况下,只需使用GPT-3就可以对作业分类进行开箱即用的分类,而不需要任何进一步的微调。但是,请注意,这是基于当前的测试设置和小样本,因此,里程可能会有所不同。
案例3:从简历中解析技能上下文
问题
我们希望在提供的招聘广告或简历的基础上,能够从中提取出某些信息,以帮助我们更好地匹配求职者和招聘广告。
虽然我们可以从一份简历/广告中提取很多信息(比如技术技能、工作经历、过去的教育经历等),但在这个用例中,我们将专注于提取软技能。
解决方案
解决这个问题最简单的方法是依靠一个软技能字典,并基于精确匹配或某种形式的字符串相似度算法在一组阈值内提取关键字。虽然一开始很有效,但很快就会被这些问题包围:
所提取的软技能与我们想要的内容并不匹配(这并不是一种真正的技能,因此存在精确度问题)。
我们无法用很多方式来描述他们的软技能(回忆问题)。
在我们提出的解决方案中,我们的目标是通过一些简历中典型的经历部分的例子来解决这个问题,并向它提供一些提取的软技能的例子。
def get_skills_context(resume):
response = openai.Completion.create(
engine="davinci",
prompt="""This is a resume parser that extracts skills context from resume.
resume: {resume1}
parsed_contextual_skills: {extract1}
###
resume: {resume2}
parsed_contextual_skills: {extract2}
###
resume: {resume3}
parsed_contextual_skills: """.format(resume1 = resume_1,
extract1 = extract_1,
resume2 = resume_2,
extract2 = extract_2,
resume3 = resume),
temperature=0.2,
max_tokens=60,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["###"]
)
return response
def extract_ans(response):
return print(response.choices[0].text)
从高层次的角度来看,它似乎能够提炼出简历中提到的大部分技能。特别有趣的是标准化“配置”而不是使用“管理”(源自“管理”)的能力。它还能在列表中添加“配置防火墙”——这是一项在简历中根本没有提到的技能,但可能从F5、McAfee等其他工具的存在中有所暗示。
之前不得不构建一些类似的东西(使用Spacy、Databricks和许多手动维护的字典等工具的组合),解决方案构建的简单性(比如。记事处理)结合输出导出的质量-使我更欣赏GPT-3。
总结
本文首先简要介绍了即时工程,然后快速转移到可能适用于GPT-3的就业市场行业中的一些相关用例。
每个数据产品构建的简易性(通过提示),以及我们从中得到的结果——证明了GPT-3在成为解决基于语言的任务的通用工具方面具有巨大的潜力。
话虽如此,与构建任何数据产品一样,仍然需要更彻底和全面的验证测试来确定GPT-3可能存在的差距和错误。然而,这不是本文的范围。
本文中使用的代码可以在我的git repo6中找到。
引用
作者:Hafidz Zulkifli