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

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

⭐️ 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.




