Está a ter dificuldades com a IA ou com o desenvolvimento full-stack? Os nossos especialistas estão aqui para o orientar: aconselhamento personalizado, integração técnica e muito mais. Entre em contacto com [email protected].

Poucos tiros NER: Extracção de Entidade sem Anotação e Formação com base no GPT

Modelos de extracção de entidades pré-formados baseados em spaCy ou NLTK dão grandes resultados mas requerem um tedioso processo de anotação e formação a fim de detectar entidades não nativas como títulos de emprego, números de IVA, medicamentos, etc. Graças aos modelos de grandes línguas como GPT-3, GPT-J, e GPT-NeoX, é agora possível extrair qualquer tipo de entidades graças a poucos tiros de aprendizagem, sem qualquer anotação e formação. Neste artigo, estamos a mostrar como fazer isso.

NER (extracção de entidade) é basicamente a extracção de informação estruturada a partir de um texto não estruturado. Se é novo no NER, pode ler primeiro a nossa breve introdução: introdução ao NER.

NER com spaCy e NLTK: a forma tradicional

A SpaCy tornou-se praticamente o padrão de facto para o NER nestes últimos anos (ver o website spaCy). A SpaCy é uma estrutura muito atractiva porque é fácil de utilizar, e a sua velocidade torna-a bem adequada para utilização na produção.

A SpaCy é uma estrutura de processamento de linguagem natural Python que propõe muitos modelos pré-formados em várias línguas, pelo que é fácil extrair vários tipos de entidades (empresas, cidades, endereços, datas, etc.) na sua própria língua sem ter de treinar o seu próprio modelo.

NLTK é também uma escolha interessante para a extracção de entidades com Python, mas propõe menos entidades por defeito, e em geral NLTK não é recomendado para a produção (é mais um quadro educacional e de investigação).

No entanto, rapidamente atingirá um limite com estas estruturas: o número de entidades apoiadas nativamente é limitado. A maioria das empresas quer tirar partido do NER para extrair informações comerciais específicas como informações sobre pessoas, dados financeiros, tratamentos médicos, etc. Claro que estas entidades não são suportadas por defeito pelos modelos pré-formados da spaCy, pelo que, para o conseguir, terá de criar o seu próprio conjunto de dados e formar o seu próprio modelo a partir dele.

Treinar o seu próprio modelo spaCy é um longo e tedioso processo de anotação: uma ou várias pessoas precisam de colaborar para criar um enorme conjunto de bons exemplos, e anotá-los. É necessário um volume muito grande de exemplos para que o modelo aprenda correctamente. Existem boas ferramentas de anotação (como Prodigy, por spaCy), mas continua a ser uma tarefa dolorosa que faz com que muitos projectos de PNL sejam abortados.

Ilustração de anotação

Boas notícias: com o aparecimento de grandes modelos linguísticos como GPT-3, GPT-J, e GPT-NeoX, é agora possível extrair quaisquer entidades sem anotar e treinar um novo modelo!

Geração de texto com GPT-3, GPT-J, e GPT-NeoX

Modelos de linguagem de grande dimensão para a geração de texto começaram a aparecer recentemente com o GPT-3 (ver mais sobre o GPT-3 no site do OpenAI). Quando o OpenAI lançou o seu modelo GPT-3, composto de 175 mil milhões de parâmetros, foi uma revolução porque abriu o caminho para muitas aplicações de IA de ponta baseadas no processamento de linguagem natural sem necessidade de qualquer formação adicional.

O objectivo inicial de modelos GPT como o GPT-3 é gerar texto: basta dar uma entrada ao modelo e deixá-lo gerar o resto para si. Com base na geração de texto, praticamente qualquer caso de processamento de linguagem natural pode ser alcançado: classificação, resumo, IA conversacional, paráfrase... e, claro, extracção de entidades!

Uma vez que o GPT-3 não é um modelo de código aberto, a comunidade de código aberto tem trabalhado em alternativas ao GPT-3 e temos agora 2 grandes equivalentes de código aberto: GPT-J e GPT-NeoX. Eles ainda não são tão grandes como o GPT-3, mas sem dúvida que é apenas uma questão de tempo até que a comunidade de código aberto apanhe o OpenAI.

O aproveitamento adequado destes modelos requer uma nova técnica chamada "aprendizagem com poucos disparos".

Poucos tiros de aprendizagem

Estes grandes modelos GPT são tão grandes que podem aprender muito rapidamente consigo.

Digamos que quer que o GPT-3 gere uma breve descrição do produto para si. Aqui está um exemplo sem poucas lições:

Generate a product description containing these specific keywords: t-shirt, men, $50

A resposta que obterá será inútil. Pode ser algo como isto, por exemplo:

Generate a product description containing these specific keywords: t-shirt, men, $50 and short.

The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are

Boas notícias: pode conseguir resultados muito melhores dando simplesmente alguns exemplos ao modelo!

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:

O resultado será algo parecido com isto:

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.

Como podem ver, a resposta do modelo é agora perfeitamente propositada, graças aos 3 exemplos que lhe demos pela primeira vez. No entanto, este modelo nunca foi treinado para este tipo de tarefa de geração de descrição de produtos. É disto que se trata a técnica de "aprendizagem de poucos tiros": executa-se a "aprendizagem de transferência" na mosca com apenas alguns exemplos. Para alcançar este tipo de resultado, normalmente espera-se treinar um modelo de processamento de linguagem natural com toneladas de exemplos, mas não aqui.

Extracção de Entidades com Poucos Tiros de Aprendizagem

Agora vamos realizar a extracção de entidades graças à aprendizagem de poucos tiros.

Digamos que quer extrair títulos de emprego de sítios web. Basta dar alguns exemplos de extracção de títulos de emprego antes de fazer o seu pedido real:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:

O resultado será o seguinte:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO

Como notou, temos de ser espertos sobre como estamos a fazer os nossos poucos exemplos de tiro. Pode acontecer que não seja encontrado qualquer título de emprego, razão pela qual criámos um exemplo que devolve "nenhum" (evita falsos positivos). Talvez queiram extrair vários títulos de emprego ao mesmo tempo? Nesse caso é importante criar exemplos que devolvam também vários títulos de emprego (títulos de emprego separados por vírgula, por exemplo).

Obterá resultados ainda melhores se acrescentar ainda mais exemplos. E é importante que os seus exemplos estejam o mais próximo possível do seu pedido final real. Por exemplo, se souber que vai analisar parágrafos inteiros em vez de simples frases, é melhor criar exemplos também com parágrafos.

Se não tiver acesso a um modelo GPT, pode simplesmente utilizar a NLP Cloud API. Estão disponíveis vários clientes (Python, Go, Node.js, Ruby, PHP...). Vamos mostrar aqui um exemplo usando o GPT-J com o cliente Python:

import nlpcloud

client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.

    Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
    Job title: Linux Engineer
    ###
    Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
    Job title: none
    ###
    Sentence: Marc Simoncini | Director | Meetic
    Job title: Director
    ###
    Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
    Job title: CEO
    ###
    Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
    Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)

O resultado será: CTO

Deixem-me dar-vos uma rápida explicação sobre os parâmetros de geração de texto que acabámos de utilizar.

Estabelecemos um valor p superior muito baixo porque não queremos que o GPT-J crie resultados demasiado originais: queremos apenas que se cinja ao que viu no seu pedido.

"length_no_input" significa que o valor máximo do comprimento não deve ter em conta o texto de entrada.

"remove_input" significa que o texto de entrada deve ser removido do resultado.

"end_sequence" significa que quando o modelo encontra este carácter, deve deixar de gerar texto. Como nos nossos poucos exemplos acrescentámos "####" no final de cada resposta, o modelo gerará automaticamente "####" após gerar a resposta e parará aí.

"remove_end_end_sequence" significa que queremos remover "####" da resposta.

Pode ver mais detalhes na documentação da NLP Cloud: vejam-no aqui.

Considerações de desempenho

Realizar a extracção de entidades com um modelo GPT dá muita liberdade, uma vez que qualquer nova entidade pode ser extraída na mosca, mesmo que o modelo não tenha sido treinado para isso!

No entanto, tem um custo: estes grandes modelos linguísticos são enormes e relativamente lentos.

Por exemplo, se quiser usar GPT-J ou GPT-NeoX, será necessária uma GPU enorme com muita VRAM como uma NVIDIA RTX A6000 ou A40. E haverá alguma latência (a extracção de uma entidade demora cerca de 500ms). Pelo contrário, a spaCy ou NLTK será muito mais rápida e menos dispendiosa do ponto de vista das infra-estruturas.

Conclusão

Em 2022, é possível realizar NER avançado muito facilmente sem qualquer anotação e treino! Ajudará muito as empresas a entregar mais rapidamente os seus projectos de extracção de entidades, e permite também aplicações mais avançadas baseadas no processamento de linguagem natural.

No entanto, modelos linguísticos de grande dimensão como GPT-3, GPT-J, e GPT-NeoX são dispendiosos, pelo que não se deve subestimar os custos de infra-estrutura envolvidos.

Espero que este artigo o ajude a poupar tempo e dinheiro!

Julien Salinas
CTO em NLP Cloud