使用GPT模型进行传统命名实体识别任务

释放双眼,带上耳机,听听看~!
本文介绍如何使用GPT模型来进行传统的命名实体识别任务,并探讨了NLP Cloud API和EleutherAI开源的GPT替代品。

基于Transformers的深度生成学习模型已经出现了好几年,目前GPT-3 和 GPT-J 是当今最先进的文本生成模型(目前流行的ChatGPT也在GPT-3和InstructGPT的基础上进行进一步的研发)GPT家族几乎彻底改变了许多NLP的生态环境,今天我们来讨论如何用GPT来进行传统的命名实体识别任务。

这篇文章介绍如何使用GPT模型来进行命名实体识别。使用GPT来做NER任务的优点是不需要再进行额外的标注任务。

1. 传统NER任务实现:SpaCy+NLTK

NER是最原始最古老的NLP任务之一,也是在真实工业任务中被使用次数最多的NLP技术。传统的NER任务可以使用 spaCy 或者 NLTK 这种框架来进行,SpaCy在很长一段时间内成为了NER任务的默认最优工具。

SpaCy是一个Python自然语言处理工具包。SpaCy的易用性很高,它提供了许多pre-trained语言模型,这些NLP模型可以支持提取地址、日期、货币等多种常见的实体类型。除此之外,SpyCy在生产环境部署之后有着很高的运行效率。

NLTK在生产环境中的效率和可用性不如SpaCy,但是它可以满足学术研究的强度。NLTK也提供了许多pre-trained models,但是NLTK支持的默认实体类型要少于SpaCy。

使用SpaCy或者NLTK的pre-trained model进行NER任务的最大问题是,他们仅仅支持有限的少数几种实体类别,通常是那些用于进行训练的实体类别。这些实体类别虽然经常出现,但是对于许多日常NER任务来说是完全不够的(例如提取药品名字、提取职务职位、提取VAT卡号等等)。

许多NER项目只能为此额外创建一个新的数据集(而且规模还挺大的),通过新增标注类型定义、重新进行数据标注、重新训练,来实现针对特殊场景的NER工作。

GPT大语言模型的出现缓解了这种人力开销庞大的场景,我们再也不用花时间去准备语料和标注数据了!

2. GPT模型:OpenAI + NLP Cloud

2020年五月,OpenAI发布了大语言模型GPT-3,GPT-3是一种基于Transformer的语言模型(LM),它有1750亿个参数。作为一种生成式模型,GPT-3最基础的应用场景是根据用户输入的文本,继续生成后续的文本内容,也就是常说的文本生成(text generation)。GPT的文本生成功能可以很好的满足许多传统NLP模型能完成的任务,比如说NER、摘要、翻译、分类等等。

3. 使用NLP Cloud进行NER

GPT-3也有一些缺点,第一个缺点是GPT-3的接口比较贵并且被 OpenAI API 垄断(OpenAI总是不开源,还不如说是CloseAI),第二个缺点是基于云服务的大模型运行速度比较慢,第三个缺点是对于一些场景有点过于杀鸡用牛刀。

2021年,EleutherAI开源了GPT-3的平替产品:GPT-J 和 GPT-NeoX 20B。这些模型不再被大公司的云服务所垄断,可以部署在任意的服务器上。不过EleutherAI的这些方案增加了运维部署方面的工作,也就是我们还需要掌握一些MLOps的技能。

NLP Cloud API公司一方面提供了开放性的GPT服务,一方面又避免了部署运维等内容带来的额外复杂性。我们可以使用它来进行快速的NLP任务。这篇文章使用 NLP Cloud API 提供的GPT-J来进行替代。

3.1 准备工作

注册、选择付费方案,获取API的token,下载Python Client安装包——

pip install nlpcloud

3.2 未使用Prompt提示:失败……

假设我们现在需要提取文本中的工作头衔

我们向GPT提问“Extract job titles from the following sentence”(提取以下文本中的工作头衔),这种提问方式非常直白,没有使用任何的提示技术(Prompt Engineering),在没有使用Prompt技术的情况下,我们很可能无法得到满意的结果。

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
	Extract job titles from the following sentence: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
	""")
print(generation["generated_text"])

Output:

Extract job titles from the following sentence: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.1. Maxime works in the data science team at Auto Dataset.

我们失败的原因是GPT-3或者GPT-J这种生成式模型需要进行一些明显的提示(Prompt)来加深对问题的理解,这种提示也可以理解成一种“few-shot learning”。

3.3 使用Prompt提示:成功!

Prompt没有想的那么玄乎,它就是在我们的正式问题之前提供一些文本模板,下面是一些实例——

Let’s try again with 3 examples in the prompt:

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
	[Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
    [Position]: CEO and CTO
    ###
    [Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
    [Position]: Chief Technology Officer
    ###
    [Text]: François is a Go developer. He mostly works as a freelancer but is open to any kind of job offering!
    [Position]: Go developer
    ###
    [Text]: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
    [Position]:""",
    max_length=500,
    end_sequence="n###",
    remove_end_sequence=True,
    length_no_input=True,
    remove_input=True)
print(generation["generated_text"])

Output:

Data scientist

我们可以看出,运行上面的代码之后,我们成功提取了工作职务“Data scientist”。现在我们来解释一下,上面的Prompt是如何运作的。

在我们询问正式的问题之前,我们给GPT输入了三个例子,每个例子都由文本和答案组成——

###
[Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
[Position]: Chief Technology Officer

之所以在Text和Position这两个单词外面加上中括号,是因为使用一些明显的标点符号可以强化Prompt的提示作用,把GPT模型的重点凝聚到这些重点词语附近。

除此之外,我们还设置了一些参数——

  • max_length 限制GPT模型最多只能再输出500个单词。
  • end_sequence="n###" 限制GPT在遇到字符串n###之后停止文本输出。再观察一下前面的Prompt提示文本,我们每个Prompt案例都以换行###结束,按照GPT强大的学习能力来说,在抽取了NER内容之后,GPT也会输出换行###。此时已经可以停止GPT文本生成了,因为我们并不需要后面的内容。如果没有设置这个选项,那么GPT就会滔滔不绝的输出内容知道最大文本上限(即前面设置的500个单词)。GPT-3和GPT-J这些模型在学习这些格式上的能力很强,这也再次证明了在Prompt提示文本中使用标点符号和特殊字符进行格式设计的重要性。
  • remove_end_sequence 移除最末尾的 n###
  • remove_input 移除前面的Prompt提示文本内容
  • length_no_input means that the maximum length value should not take the input text into account.

3.4 高阶Prompt提示技巧

还有一些Prompt设置可以进一步地提高GPT的输出效果。

调整P值

P值是一个非常基础的统计学概念,如果P值比较高,那么GPT模型趋向于输出原创内容。GPT原创的实体结果可能并不是我们想要的,我们希望GPT可以在不同的文本中统一地提取出尽可能统一的NER实体,尽可能不要随意发挥。一个比较好的实践法则是把top_p设置为0.10.1

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
	......
    """,
    top_p=0.1, # 额外增加这一条 其余内容不变    
    )
print(generation["generated_text"])

处理空输出与多输出

在有些情况下,输入的文本内容中可能没有我们需要的NER标签,或者可能有多个NER标签,我们需要修改Prompt提示文本来针对性地处理这两个场景(这并不是罕见的场景)。

处理多个输出NER的Prompt文本如下,注意Position中的and

[Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
[Position]: CEO and CTO
###

处理空输出NER的Prompt文本如下,我们使用None来表示空输出:

[Text]: The second thing we should care about is the ability to handle empty responses.
[Position]: none
###

进过上述的两个补齐之后,我们的提取Demo变成了如下形式——

import nlpcloudclient = nlpcloud.Client("gpt-j", "<your_token>", gpu=True)

generation = client.generation("""
    [Text]: Helena Smith founded Core.ai 2 years ago. She is now the CEO and CTO of the company and is building a team of highly skilled developers in machine learning and natural language processing.
    [Position]: CEO and CTO
    ###
    [Text]: Tech Robotics is a robot automation company specialized in AI driven robotization. Its Chief Technology Officer, Max Smith, says a new wave of improvements should be expected for next year.
    [Position]: Chief Technology Officer
    ###
    [Text]: François is a Go developer. He mostly works as a freelancer but is open to any kind of job offering!
    [Position]: Go developer
    ###
    [Text]: The second thing we should care about is the ability to handle empty responses.
    [Position]: none
    ###
    [Text]: Maxime is a data scientist at Auto Dataset, and he's been working there for 1 year.
    [Position]:
    """,
    max_length=500,
    top_p=0.1,    
    end_sequence="n###",
    remove_end_sequence=True,
    remove_input=True)
print(generation["generated_text"])

通过以上Prompt提示工程,我们就完成了在SpaCy和NLTK中无法实现的NER任务,再也不需要耗费数天甚至数个星期去准备垂直领域数据集和组织标注人员了。

NLP Cloud的其他文档可以看: NLPCloud Generation

总结

通过上面的案例,我们发现使用GPT进行命名实体识别任务可以节省大量的语料准备、数据标注的工作。但是天下没有免费的午餐,使用GPU进行NER任务有着比较高的性能开销,这些开销包括本地使用GPU的压力,也包括网络API延迟的压力(每个实体可能需要花费0.5秒钟,这些时间在SpaCy中可能已经提取了几百个实体了),甚至包括租用付费云端GPU的时长费。

所以我们需要对NLTK、SpaCy和GPT的使用场景做一些权衡。如果你现在的NER任务数量不多,而且只是一锤子买卖,那么花费几十块钱租用云端GPT服务器进行NER是非常合适的,而且计算时间也不会很长。如果你现在的NER任务需要处理非常多的数据(百万级别),那么以GPT每个实体0.5秒的龟速,无论是时间成本还是机房租用成本都是难以承受的,这是还不如把预算给标注人员和数据处理团队来进行SpaCy传统训练。

希望这篇文章可以帮到你。

相关资料:

Press (English)
OpenAI vs NLP Cloud
Hugging Face vs NLP Cloud
Google Cloud Natural Language vs NLP Cloud

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

AI绘画技术原理解析:如何生成和控制画面内容

2023-12-9 22:17:14

AI教程

人像matting数据集介绍和下载

2023-12-10 0:47:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索