Neste tutorial, ajustaremos os prompts de um modelo IBM Granite usando um conjunto de dados sintético contendo avaliações de clientes de uma empresa de cuidados com animais de estimação.
O ajuste de prompts é uma maneira eficiente e de baixo custo de adaptar um modelo de base de inteligência artificial (IA) a novas tarefas posteriores sem treinar novamente todo o modelo e atualizar seus pesos.
Os modelos de base são baseados em grandes modelos de linguagem (LLMs) e recebem grandes quantidades de dados de treinamento. Casos de uso comuns de modelos de base são chatbots e assistentes virtuais.
Há várias maneiras de melhorar a interpretação das entradas e a qualidade das respostas de um modelo de base. Para entender melhor essas nuances, vamos comparar alguns dos métodos.
Os prompts rígidos são voltadas para o usuário e exigem ação do usuário. Um prompt rígido pode ser considerado como um modelo ou instruções para o LLM gerar respostas. Um exemplo de prompt rígido será apresentado a seguir. Incentivamos você a consultar a página de documentação da IBM para obter mais informações sobre esse tipo de prompt e vários outros.
Usando este modelo de prompt rígido, um LLM pode receber instruções específicas sobre a estrutura e o estilo de saída preferidos. Por meio desse prompt explícito, seria mais provável que o LLM produzisse respostas desejáveis de maior qualidade.
Os prompts flexíveis, ao contrário dos prompts rígidos, não são escritos em linguagem natural. Em vez disso, os prompts são inicializados como vetores numéricos gerados por IA anexados ao início da embedding de cada entrada que destila o conhecimento do modelo maior. Essa falta de interpretabilidade se estende à IA que escolhe prompts otimizados para uma determinada tarefa. Muitas vezes, a IA é incapaz de explicar por que escolheu essas embeddings. Em comparação com outros métodos de prompts, esses tokens são menos caros em termos de computação do que o ajuste fino, pois o próprio modelo permanece congelado com pesos fixos. Os prompts flexíveis também tendem a superar os prompts rígidos projetados por seres humanos.
Trabalharemos com prompts flexíveis para ajuste de prompts neste tutorial.
Você precisa de uma conta do IBM® Cloud para criar um projeto do watsonx.ai .
Embora você possa escolher entre várias ferramentas, este tutorial explica como configurar uma conta da IBM para usar um Jupyter Notebook.
Faça login no watsonx.ai usando sua conta do IBM Cloud.
Criar um projeto do watsonx.ai.
Você pode obter a ID do projeto a partir de seu projeto. Clique na guia Gerenciar . Em seguida, copie a ID do projeto da seção Detalhes da página Geral . Você precisa dessa ID para este tutorial.
Crie um Jupyter Notebook.
Esta etapa abrirá um ambiente do Notebook onde você pode copiar o código deste tutorial para implementar o ajuste de prompts por conta própria. Ou então, você pode baixar esse Notebook em seu sistema local e carregá-lo como um ativo em seu projeto do watsonx.ai. Esse Jupyter Notebook , juntamente com os conjuntos de dados utilizados, pode ser encontrado no GitHub.
Crie uma instância do serviço do watsonx.ai Runtime (tempo de execução) (selecione a região apropriada e escolha o plano Lite, que é uma instância gratuita).
Gere uma chave de API.
Associe a instância do serviço do watsonx.ai Runtime ao projeto que você criou no watsonx.ai.
Precisaremos de algumas bibliotecas e módulos para este tutorial. Não deixe de importar os seguintes itens; se eles não estiverem instalados, você poderá resolver isso com uma instalação rápida.
Configure suas credenciais. Insira a chave de API e o ID do projeto.
Como primeira etapa para estabelecer o ambiente, crie uma instância do APIClient com seus detalhes de autenticação e defina seu project_id .
Saída:
'SUCCESS'
Para este tutorial, usaremos um conjunto de dados sintético que consiste em avaliações de empresas de cuidados com os animais. Usando a URL apropriada, podemos conectar o conjunto de dados ao cliente da API.
Você é livre para usar qualquer conjunto de dados de sua escolha. Vários conjuntos de dados de código aberto estão disponíveis em plataformas, como a HuggingFace.
Saídas:
Criando ativo de dados...
SUCCESS
Saída:
3b1db894-8d9e-428d-8fee-d96f328c7726
Para obter alguns insights sobre a formatação dessas avaliações de clientes, vamos carregar os dados em um dataframe do Pandas e imprimir algumas linhas que mostram avaliações positivas e negativas. Uma saída de "1" denota avaliações positivas, e "0" é usado para avaliações negativas.
Saídas:
A classe TuneExperiment é usada para criar experimentos e agendar ajustes. Vamos usá-la para inicializar nosso experimento e definir nosso modelo de base, dados de treinamento e parâmetros. O objetivo deste prompt é que o LLM adapte suas respostas de acordo com os índices de satisfação do cliente extraídos do nosso conjunto de dados. Esta é uma tarefa de classificação, pois as avaliações podem ser classificadas como positivas ("1") ou negativas ("0").
Para este tutorial, sugerimos o uso de um modelo IBM Granite como o grande modelo de linguagem para obter resultados semelhantes.
Agora que temos nosso experimento de ajuste configurado, precisamos vinculá-lo ao nosso conjunto de dados. Para isso, vamos usar a classe DataConnection. Isso requer o asset_id que produzimos anteriormente ao iniciar o ativo de dados com nosso cliente de API.
Você é livre para usar qualquer modelo de IA de sua escolha. Os modelos de base disponíveis para ajuste no watsonx podem ser encontrados aqui ou executando o comando a seguir.
Saídas:
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
Saídas:
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.
Para garantir que nosso ajuste de prompts tenha sido concluído, podemos verificar o status. Se o status impresso for diferente de "completed", aguarde o ajuste terminar antes de continuar.
Saída:
finalizado
Agora podemos recuperar o resumo do ajuste de prompts. Neste resumo, você verá um valor de perda. Para cada execução de treinamento, a função de perda mede a diferença entre os resultados previstos e reais. Portanto, é preferível um valor de perda menor.
Também podemos plotar a curva de aprendizado do nosso ajuste de modelo usando a função plot_learning_curve() . Uma curva inclinada descendente que se nivela perto de zero indica que o modelo está melhorando a geração da saída esperada. Para saber mais sobre como interpretar gráficos de função de perda, consulte a documentação relevante do IBM watsonx.
Saídas:
Esta etapa da implementação do modelo ajustado é crítica para concluir a próxima etapa de comparação do desempenho do modelo ajustado com o modelo pré-ajustado.
Observação: o SERVING_NAME é definido com a data e hora atuais, pois deve ser um valor único.
Saída:
######################################## ##################################
Criação de implementação síncrona para id: '6aa5dd5c-0cc4-44e0-9730 -18303e88e14a'started
################################# ######################################
inicializando......... ..—pronto———————— --——————————— ————— Criação
da
implementação concluída com sucesso, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
————— --——————————— -————
Agora, vamos testar o desempenho do modelo ajustado e do modelo de base original para ver os impactos do nosso processo de ajuste. Primeiro, vamos carregar o conjunto de dados de teste. Esse conjunto de dados deve ser um subconjunto de dados que não estava presente durante o ajuste. Frequentemente, o conjunto de teste também é menor que o conjunto de treinamento. Além disso, cada entrada no conjunto de dados de teste tem o prompt como prefixo do comentário do usuário.
Vamos exibir uma pequena parte do conjunto de dados para entender melhor sua estrutura.
Saídas:
Ao carregar o conjunto de dados de teste, vamos extrair as entradas e saídas.
Também podemos imprimir um exemplo de entrada e saída de teste para entender melhor como extraímos o conteúdo do conjunto de dados.
Saídas:
"Extraia a satisfação do comentário. Retorne simplesmente 1 para cliente satisfeito ou 0 para insatisfeito.\nComment: Tempos de espera longos.\nSatisfaction:\n"
Neste exemplo, o prompt é introduzido, seguido pela avaliação do cliente sobre os longos tempos de espera e, por fim, a satisfação é 0 para indicar uma avaliação negativa.
Saída:
0
Agora que temos o conjunto de dados de teste, vamos testar a precisão e a pontuação F1 do nosso modelo ajustado. A pontuação F1 é a média da precisão e do recall do modelo. Precisaremos do deployment_id para fazer isso. Observe que o concurrency_limit é definido como 2 para evitar atingir o limite de taxa da API. Este é o número de solicitações que serão enviadas em paralelo.
Saídas:
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
Dada a alta precisão e a pontuação F1 do nosso modelo, vamos testar o desempenho do mesmo modelo Granite sem nenhum ajuste.
Saídas:
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
Nosso modelo ajustado supera o desempenho do modelo de base pré-ajustado. Como o modelo ajustado é especializado na extração de pontuações de satisfação, ele pode ser usado para outras tarefas de extração de satisfação. Ótimo trabalho!
Neste tutorial, você realizou o ajuste de prompts em um modelo do IBM Granite com a API do watsonx. Seu modelo ajustado e implementado superou com sucesso o modelo de base com precisão cerca de 5% maior.