Como ajustar GPT-3 para classificação de intenção personalizada

May 03 2023
O reconhecimento intencional de declarações ou conversas do usuário é a linha de frente da maioria dos chatbots. Aqui, mostro passo a passo como aproveitar e ajustar um modelo OpenAI GPT-3 com seus dados! Atualmente sou o Evangelista Chefe @ HumanFirst.

O reconhecimento intencional de declarações ou conversas do usuário é a linha de frente da maioria dos chatbots. Aqui, mostro passo a passo como aproveitar e ajustar um modelo OpenAI GPT-3 com seus dados!

Atualmente sou o Evangelista Chefe @ HumanFirst . Eu exploro e escrevo sobre todas as coisas na interseção de IA e linguagem; variando de LLMs, Chatbots, Voicebots, estruturas de desenvolvimento, espaços latentes centrados em dados e muito mais.

Praticamente todos os chatbots têm como base a detecção de intenções. E, em essência, as intenções/classificações são predefinidas usando dados de treinamento de exemplo, e um modelo é treinado que detecta e reconhece as intenções/classificações em tempo real a partir da entrada do usuário.

Obviamente, isso está usando um LLM de maneira preditiva, em oposição aos cenários generativos mais comumente conhecidos.

O ajuste fino geralmente é necessário para casos de uso específicos do domínio e aumento da precisão para uma implementação específica em termos de jargão, termos específicos do setor, produtos e serviços específicos da empresa, etc.

Vamos começar... é mais fácil do que você pensa!

Para este exemplo, faremos uso de um conjunto de dados público de e-mails relacionados a esportes, é uma lista de e-mail, com 1.197 exemplos no total. Esses exemplos são divididos entre 597 exemplos de beisebol e 600 exemplos de hóquei.

Neste exemplo, o modelo GPT-3 ada é ajustado/treinado como um classificador para distinguir entre os dois esportes: beisebol e hóquei.

O modelo ada faz parte da série GPT-3 base original.

Você pode ver esses dois esportes como duas intenções básicas, uma intenção sendo “beisebol” e a outra “hóquei”.

Total examples: 1197, Baseball examples: 597, Hockey examples: 600

https://beta.openai.com/account/api-keys

⭐️ Por favor, siga-me no LinkedIn para atualizações.

Obtendo os dados

Abaixo está uma visão do uso do meu notebook Colab para esta demonstração. ⬇️

O conjunto de dados do newsgroup pode ser carregado usando sklearn. Você pode examinar o conjunto de dados como visto abaixo:

from sklearn.datasets import fetch_20newsgroups
import pandas as pd
import openai

categories = ['rec.sport.baseball', 'rec.sport.hockey']
sports_dataset = fetch_20newsgroups(subset='train', shuffle=True, random_state=42, categories=categories)

print(sports_dataset['data'][10])

Transformação de Dados

Com este trecho de código, os dados são transformados em um dataframe do pandas.

import pandas as pd

labels = [sports_dataset.target_names[x].split('.')[-1] for x in sports_dataset['target']]
texts = [text.strip() for text in sports_dataset['data']]
df = pd.DataFrame(zip(texts, labels), columns = ['prompt','completion']) #[:300]
df.head()

Com este comando, o conjunto de dados é salvo como um arquivo jsonl…⬇️

df.to_json("sport2.jsonl", orient='records', lines=True)

Para um cenário de produção, uma ferramenta de design NLU/NLG sem código será necessária para ingerir, processar e estruturar com eficiência os dados de design NLU/NLG.

{"prompt":"he MLB team with the most Hall of Famers is the New York Yankees with 27.",
"completion":"Baseball"}
{"prompt":"The first organized indoor game was played in Montreal in 1875.",
"completion":"Hockey"}

!pip install --upgrade openai
!openai tools fine_tunes.prepare_data -f sport2.jsonl -q

⭐️ Por favor, siga-me no LinkedIn para atualizações.

Treinando o Modelo

Abaixo está a linha de código para iniciar o processo de treinamento… observe a colocação da chave de API dentro do comando:

!openai --api-key 'xxxxxxxxxxxxxxxxxxxxxxxx' api fine_tunes.create -t "sport2_prepared_train.jsonl" -v "sport2_prepared_valid.jsonl" --compute_classification_metrics --classification_positive_class " baseball" -m ada

Se o stream for interrompido, você pode reiniciá-lo com este comando:

!openai --api-key 'xxxxxxxxxxxxxxxxxxxxxxxx' api fine_tunes.follow -i ft-KGbV68gqwGwmfEqnVMMM13FU

[2023-01-06 08:53:57] Created fine-tune: ft-KGbV68gqwGwmfEqnVMMM13FU
[2023-01-06 08:54:54] Fine-tune costs $0.78
[2023-01-06 08:54:54] Fine-tune enqueued. Queue number: 1
[2023-01-06 09:11:24] Fine-tune is in the queue. Queue number: 0
[2023-01-06 09:12:00] Fine-tune started
[2023-01-06 09:14:37] Completed epoch 1/4
[2023-01-06 09:17:11] Completed epoch 2/4
[2023-01-06 09:19:42] Completed epoch 3/4
[2023-01-06 09:22:14] Completed epoch 4/4
[2023-01-06 09:22:46] Uploaded model: ada:ft-personal-2023-01-06-09-22-45
[2023-01-06 09:22:47] Uploaded result file: file-kX8n4tm6DU7s5AFImIxChUAR
[2023-01-06 09:22:47] Fine-tune succeeded

Job complete! Status: succeeded 
Try out your fine-tuned model:

openai api completions.create -m ada:ft-personal-2023-01-06-09-22-45 -p <YOUR_PROMPT>

Testando o modelo

O modelo pode ser testado com o código abaixo... o classificador ajustado é muito versátil. E mesmo que seja treinado em e-mails, outros tipos de entradas podem funcionar bem em termos de tweets, declarações de usuários, etc.

ft_model = 'ada:ft-personal-2023-01-06-09-22-45'
sample_baseball_tweet="""BREAKING: The Tampa Bay Rays are finalizing a deal to acquire slugger Nelson Cruz from the Minnesota Twins, sources tell ESPN."""
res = openai.Completion.create(model=ft_model, prompt=sample_baseball_tweet + '\n\n###\n\n', max_tokens=1, temperature=0, logprobs=2)
res['choices'][0]['text']

baseball

ft_model = 'ada:ft-personal-2023-01-06-09-22-45'
sample_baseball_tweet="""The ice is not well maintained so that is something the Caps will have to attend to."""
res = openai.Completion.create(model=ft_model, prompt=sample_baseball_tweet + '\n\n###\n\n', max_tokens=1, temperature=0, logprobs=2)
res['choices'][0]['text']

hockey

⭐️ Por favor, siga-me no LinkedIn para atualizações.

O Playground OpenAI

Como visto abaixo, o modelo ajustado está imediatamente disponível no playground OpenAI.

⭐️ Por favor, siga-me no LinkedIn para atualizações.

Para concluir

Para mim, passar por um exercício como esse fornece uma boa visão sobre as demandas que um ambiente de produção representará.

O elo perdido em todo esse processo é uma ferramenta de design NLU/NLG que pode ser usada para ingerir dados não estruturados e converter esses dados não estruturados em dados de design NLU/NLG sem código.

Como pode ser visto nos exemplos de código, os dados de treinamento têm um formato fixo e o processamento manual de dados de treinamento por meio de algo como Notepad++ ou MS Excel não é uma solução viável e sustentável.

Um NLU/NLG Design Studio sem código como o HumanFirst completa este processo de preparação de dados, curadoria estruturada e integração LLM.

Atualmente sou o Evangelista Chefe @ HumanFirst . Eu exploro e escrevo sobre todas as coisas na interseção de IA e linguagem; variando de LLMs , Chatbots , Voicebots , estruturas de desenvolvimento, espaços latentes centrados em dados e muito mais.

https://www.linkedin.com/in/cobusgreyling
O Cobus Quadrant™ do design de NLU O Cobus Quadrant™ dos recursos de design de conversação Criando um modelo personalizado e ajustado com a API de linguagem GPT-3 da OpenAI