Como criar um chatbot com o mecanismo GPT-3 da OpenAI, Twilio SMS e Python
Tempo de leitura: 11 minutos
Um chatbot GPT-3 é um aplicativo de software capaz de conversar com um usuário humano por meio de linguagem escrita ou falada. O grau de "inteligência" entre os chatbots varia muito. Enquanto alguns têm uma compreensão bastante básica da linguagem, outros empregam algoritmos sofisticados de IA (inteligência artificial) a ML (machine learning) para atingir um nível de conversação quase humano.
Neste tutorial, vou mostrar como é fácil criar um chatbot para Twilio SMS usando a plataforma OpenAI e a estrutura do Flask para Python.
Quer ter uma ideia de quais são os recursos do GPT-3? Confira a seguinte interação que tive com esse bot usando o projeto que vamos desenvolver neste tutorial:
Introdução ao GPT-3
GPT-3 (Generative Pre-Trained Transformer 3) é um modelo de linguagem altamente avançado treinado em um corpo de texto muito grande. Apesar de sua complexidade interna, ele é surpreendentemente simples de operar: você o alimenta com parte de um texto, e o modelo gera outra parte, seguindo um estilo e uma estrutura semelhantes.
O que você achou do primeiro parágrafo deste artigo? Você acreditaria se eu dissesse que eu não o escrevi e que ele foi totalmente gerado pelo GPT-3? Eu alimentei o modelo com o título e a introdução de duas outras publicações do blog que escrevi no passado, e então adicionei o título deste artigo. Aqui está a entrada completa que forneci:
Observe como os dois primeiros blocos de texto têm as linhas "Título" e "Resumo", mas a terceira entrada tem um resumo vazio. Quando o mecanismo GPT-3 analisa essa entrada, ele entende que precisa concluir a linha "Resumo" com o texto apropriado para o título fornecido. Na minha opinião, ficou muito bom!
O GPT-3 é não determinista, no sentido de que, dada a mesma entrada, várias execuções do mecanismo retornarão respostas diferentes. Na verdade, eu gerei alguns parágrafos de abertura com a entrada acima e selecionei aquele de que eu mais gostei para começar o artigo. Aqui estão mais alguns que merecem destaque:
Inacreditável, não é? Embora isso seja muito incrível, você deve ter cuidado porque o mecanismo não tem um entendimento completo do texto que gera e pode fornecer respostas enganosas. Veja estes outros dois parágrafos iniciais que ele também produziu com base na minha entrada:
Embora o primeiro seja realmente bom em termos de estrutura, ele tem um grande erro factual: o Google não desenvolveu essa tecnologia. O segundo exemplo não erra o significado do acrônimo GPT-3, mas também é igualmente ridículo e engraçado!
Como implementar um chatbot com GPT-3
Como podemos usar essa tecnologia interessante? Com um chatbot, é claro!
Podemos "preparar" o mecanismo com um ou dois exemplos de interações entre o usuário e a IA para definir o tom do bot. Em seguida, anexamos o prompt real do usuário no final e deixamos que o mecanismo gere a resposta.
Aqui está um exemplo de consulta inicial que funcionaria para um chatbot:
A troca nas duas primeiras linhas é feita. Ele serve para permitir que a GPT-3 saiba que queremos linhas alternadas que começam com "humano:" e "IA:" e que a IA responderá a perguntas. A terceira linha é a primeira pergunta real do usuário.
Quando alimentei essa entrada no mecanismo, recebi o seguinte texto de volta:
Até agora, tudo bem. Agora, digamos que o usuário queira fazer outra pergunta. Aqui temos a opção de incorporar essa última interação à entrada, pois isso ajudará a GPT-3 a ter um contexto melhor da conversa. Veja o que poderia ser a entrada para uma pergunta adicional:
Você provavelmente pode ver por que expandir a entrada com a pergunta e resposta anteriores foi uma boa ideia. O usuário agora está perguntando sobre "ele", supondo que o chatbot se lembrará de que a pergunta anterior era sobre Tom Hanks.
Felizmente, a GPT-3 está à altura do desafio. Esta é a resposta:
Pronto para criar um chatbot com base neste algoritmo simples? Vamos lá.
Requisitos do tutorial
Para seguir este tutorial, você precisa dos seguintes itens:
- Python 3.6 ou mais recente. Se o seu sistema operacional não fornecer um interpretador Python, você pode acessar python.org para fazer o download de um instalador.
- Um smartphone que pode enviar e receber mensagens SMS.
- Uma conta Twilio. Se você é novo no Twilio, clique aqui para criar uma conta gratuita agora e receba 10 dólares de crédito ao atualizar para uma conta paga. Você pode analisar os recursos e as limitações de uma conta gratuita do Twilio.
- Uma chave API OpenAI. Solicite acesso beta aqui.
Criar um ambiente virtual Python
Seguindo as práticas recomendadas do Python, o primeiro passo para criar o chatbot é criar um diretório separado para o projeto e, dentro dele, vamos criar um ambiente virtual. Em seguida, vamos instalar os pacotes Python necessários para nosso chatbot.
Se você estiver usando um sistema Unix ou MacOS, abra um terminal e digite os seguintes comandos para realizar as tarefas descritas acima:
Se você estiver seguindo o tutorial no Windows, digite os seguintes comandos em uma janela do prompt de comando:
O último comando usa pip
, o instalador de pacotes Python, para instalar estes três pacotes que vamos usar no projeto:
- A Biblioteca cliente OpenAI Python, para enviar solicitações ao mecanismo OpenAI GPT-3.
- A Biblioteca auxiliar da Twilio para Python, para trabalhar com mensagens SMS.
- A estrutura Flask para criar o aplicativo da Web
- O pacote python-dotenv para ler um arquivo de configuração.
- O pacote pyngrok para disponibilizar temporariamente nosso aplicativo da Web na Internet.
Configuração
Como mencionado acima, este projeto requer uma chave de API da OpenAI. No momento em que escrevo isto, a única maneira de obter uma é sendo aceito em seu programa beta privado. Você pode se inscrever no site.
O aplicativo Python precisará ter acesso a essa chave, então vamos criar um arquivo .env no qual colocá-lo. O aplicativo o importará desse arquivo como uma variável de ambiente.
Crie um arquivo .env no diretório do projeto (anote o ponto inicial) e insira uma única linha de texto contendo o seguinte:
Você aprenderá a trabalhar com este arquivo na próxima seção. Se você planeja colocar seu projeto sob controle de código-fonte, certifique-se de que esse arquivo seja excluído, pois não gostaria de compartilhar acidentalmente sua chave da OpenAI.
Enviar solicitações GPT-3 do Python
Nesta seção, vamos criar o código de suporte que nos permitirá trabalhar com o mecanismo OpenAI GPT-3. O código será armazenado em um arquivo chamado chatbot.py. Abaixo, você pode ver a seção de inicialização deste arquivo:
A função load_dotenv()
importa todas as variáveis armazenadas em um arquivo .env como variáveis de ambiente. Observe como usamos a variável OPENAI_KEY
na linha a seguir para inicializar a OpenAI com a chave. A variável completion
mantém o cliente real no mecanismo. Este é o objeto que usaremos para enviar consultas.
Também adicionei uma variável start_chat_log
, contendo as duas linhas que fazem a preparação do mecanismo. Assim que o bot estiver ativo e em execução, incentivo você a experimentar diferentes interações nessa variável para ver como o bot muda suas respostas de acordo.
Agora, vamos escrever uma função que faz uma consulta GPT-3. Adicione a seguinte função na parte inferior de chatbot.py:
A função ask()
usa a pergunta do usuário como primeiro argumento, seguida por um histórico do chat opcional. Se o histórico do chat não for fornecido, então a função usará start_chat_log
.
A variável prompt
é criada para conter o histórico do chat, seguida da pergunta do usuário, que é prefixada com Human:
. Após a pergunta do usuário, adicionamos a leitura da linha final AI:
, que é o que dará ao mecanismo GPT-3 a fila para gerar uma resposta à pergunta do usuário.
A função completion_create()
é onde a solicitação para o mecanismo GPT-3 é realmente feita. Essa função usa vários argumentos, que são usados para configurar como o mecanismo deve completar o texto. Aqui está uma breve descrição dos seguintes argumentos:
prompt
: o texto de entradaengine
: o OpenAI disponibilizou quatro mecanismos de preenchimento de texto, denominadosdavinci
,ada
,babbage
ecurie
. Estamos usandodavinci
, que é o mais capaz dos quatro.stop
: como mencionei anteriormente, o mecanismo GPT-3 não compreende realmente o texto, portanto, quando ele completa o texto, ele precisa saber quando parar. Dando uma parada deHuman:
, estamos dizendo ao mecanismo apenas para gerar texto até a linha que começa comAI:
. Sem um marcador de parada, GPT-3 continuaria gerando texto escrevendo mais linhas para o usuário e para a AI.temperature
: um número entre 0 e 1 que determina quantos riscos criativos o mecanismo assume ao gerar texto.top_p
: uma forma alternativa de controlar a originalidade e criatividade do texto gerado.frequency_penalty
: um número entre 0 e 1. Quanto mais alto esse valor, mais o modelo se esforçará para não se repetir.presence_penalty
: um número entre 0 e 1. Quanto maior esse valor, mais o modelo se esforçará para falar sobre tópicos novos.max_tokens
: comprimento máximo do preenchimento.
Essas não são as únicas opções possíveis, então recomendo que você revise a Documentação de referência da OpenAI para saber mais sobre como configurar sua solicitação.
A resposta do mecanismo de preenchimento é um objeto que tem um atributo choices
, que é uma lista de preenchimentos. Não solicitamos vários preenchimentos, por isso a lista terá um único elemento. Esse elemento é um dicionário Python com uma chave text
que contém o texto gerado. Nossa função pega esse texto, remove qualquer espaço em branco à esquerda ou à direita e o devolve ao autor da chamada. Como mencionado acima, consulte a documentação da API para ver informações sobre outros itens de dados incluídos na resposta da GPT-3.
Vamos iniciar um Python shell e brincar com a função ask()
:
Muito legal, não é? Está faltando a segunda parte do nosso algoritmo, na qual anexamos uma pergunta e sua resposta ao histórico do chat, para que possamos usá-la na pergunta a seguir. Podemos implementar uma segunda função para atualizar o histórico do chat:
Esta função faz uma pergunta e uma resposta e as adiciona na parte inferior do histórico do chat. O histórico do chat atualizado é retornado.
Agora, podemos ter uma conversa em que o contexto é preservado. Tente o seguinte em uma nova sessão do Python shell:
Essas duas funções são tudo o que precisamos para gerenciar nosso bate-papo. Nas próximas seções, vamos integrá-las às mensagens do Twilio SMS.
Configurar Twilio Programmable Messaging
Em seguida, vamos configurar um número de telefone habilitado para Twilio SMS para usar o chatbot. Se você ainda não criou uma conta gratuita do Twilio, crie-a agora e faça login.
No Console da Twilio, selecione Phone Numbers (Números de telefone) e clique no sinal de adição vermelho para comprar um número Twilio. Na página Buy a Number (Comprar um número), selecione seu país e marque SMS no campo de recursos. Caso queira solicitar um número para sua região, informe seu código de área no campo Number (Número).
Clique no botão "Search" (Pesquisar) para ver quais números estão disponíveis e, em seguida, clique em "Buy" (Comprar) para adquirir o número de sua preferência exibido nos resultados. Depois de confirmar a compra, clique no botão "Close" (Fechar). Se você estiver usando uma conta de teste, os fundos dessa compra virão do seu crédito de teste.
Parabéns, agora você tem seu próprio número de telefone programável! Pegue seu smartphone e envie uma mensagem de texto para seu novo número para verificar se ele está funcionando. Você deve receber uma resposta pedindo para que você configure seu número, o que você fará em seguida.
A API do Twilio SMS usa um webhook para notificar um aplicativo quando uma mensagem é recebida. A resposta automatizada que você recebeu quando enviou uma mensagem de texto para seu número da Twilio, na verdade, vem de um webhook padrão que é instalado pela Twilio no seu número. O aplicativo chatbot terá um novo webhook que substituirá o padrão.
Com a estrutura do Flask, é extremamente fácil definir um webhook. Veja abaixo um esqueleto de aplicativo com uma definição do webhook. Copie o seguinte código em um novo arquivo chamado app.py:
Esse código cria um aplicativo Flask que tem um endpoint com o URL /bot. Quando a Twilio estiver configurada para saber sobre esse endpoint, ela enviará uma solicitação sempre que um SMS for recebido no número de telefone que você adquiriu anteriormente. O aplicativo pode ler a mensagem recebida, fazer algum processamento e gerar uma resposta, que é retornada no final da função.
Você pode iniciar o aplicativo acima da seguinte forma:
O aplicativo agora está sendo executado no seu computador no URL http://localhost:5000, mas não pode ser acessado pela Internet. A próxima etapa é fornecer um URL público temporário que podemos dar ao Twilio para que ele possa enviar solicitações. Esse trabalho é feito pela ferramenta ngrok. Deixe o aplicativo em execução e abra um segundo terminal. Ative o ambiente virtual neste terminal, do mesmo modo que você fez no primeiro no início do tutorial e, em seguida, digite o seguinte comando:
Você verá uma tela semelhante a esta:
Observe as linhas que começam com "Forwarding". Elas mostram o URL público usado pelo ngrok para redirecionar solicitações para o nosso serviço no formato http:// e https://. O que precisamos fazer agora é instruir a Twilio a enviar as notificações recebidas via SMS para esse URL.
Volte para o console da Twilio, clique em Phone Numbers (Números de telefone) e, em seguida, no número de telefone adquirido acima. Role a página até a seção "Messaging" (Mensagens), copie o URL https:// da saída do ngrok e cole-o no campo "When a message comes in" (Quando receber uma mensagem). O endpoint que criamos acima é exposto no URL /bot
, portanto /bot precisa ser anexado ao final do URL do ngrok raiz. Verifique se o método de solicitação está definido como HTTP POST
. Não se esqueça de clicar no botão azul Save (Salvar), na parte inferior da página, para registrar essas alterações.
Envie outro SMS para o seu número de telefone da Twilio e você receberá a resposta que vem do aplicativo Flask:
Agora, sabemos como executar o mecanismo GPT-3 e como receber e responder mensagens SMS com o Twilio. Na próxima seção, integraremos os dois e teremos um projeto de chatbot completo.
Chatbot de SMS com OpenAI e Twilio
Vamos expandir app.py para enviar mensagens de usuário para a função ask()
que criamos acima e para manter o histórico do chat. Aqui estão os conteúdos atualizados do app.py:
O local mais conveniente para armazenar o histórico do chat com um usuário é a variável session
do Flask, que usa um cookie HTTP para armazenamento. O Twilio funciona como se fosse um navegador da Web e, nesse sentido, ele aceitará, armazenará (por até quatro horas) e enviará novamente os cookies durante uma conversa com um usuário. Se houver dois ou mais usuários conversando com o bot ao mesmo tempo, cada um terá seu próprio cookie.
Como os cookies de sessão são assinados, o aplicativo Flask precisa ter uma chave secreta configurada. Por segurança, você deve substituir o valor do espaço reservado que usei para a chave secreta por algo exclusivo.
O endpoint bot()
começa obtendo a mensagem do usuário como antes e o histórico do chat da sessão. O objeto session
usa a sintaxe de dicionário familiar, portanto session.get()
retornará um histórico do chat armazenado anteriormente se existir ou None
se esse usuário não tiver uma sessão. Isso é conveniente porque as funções no chatbot.py usam o histórico do chat padrão se passarmos None
.
Chamar a função ask()
funciona exatamente como antes. Nós passamos a mensagem do usuário e o histórico do chat e voltamos ao preenchimento feito pelo mecanismo GPT-3, que é a nossa resposta.
A pergunta e a resposta são anexadas ao histórico do chat e a versão atualizada dele é salva na sessão do usuário para que, na próxima interação com ele, o histórico do chat completo seja usado.
Para encerrar a função, a resposta é retornada como resposta, e isso a enviará de volta ao usuário por SMS.
Pronto para testar seu novo bot? Se você ainda estiver executando o aplicativo Flask, interrompa-o apertando Ctrl-C e execute-o novamente para que ele incorpore as atualizações mais recentes. Se você não estiver mais executando o ngrok, vá para seu segundo terminal e reinicie-o. Depois, siga as instruções na seção anterior para atualizar seu URL webhook no console da Twilio, já que o ngrok cria um URL diferente toda vez que ele é executado.
Com o aplicativo Flask e o ngrok em execução, você está pronto para começar a enviar SMS para o bot. Envie uma mensagem de texto com sua primeira pergunta para o número de telefone da Twilio como você fez antes e, em alguns segundos, a resposta deve chegar. Fique à vontade para testar o bot com assuntos diferentes, ele sabe sobre muitas coisas!
No exemplo de interação a seguir, o bot parece estar perdendo a paciência com as minhas perguntas bobas, mas veja como manter o histórico do chat na sessão do usuário deixa essa conversa com um tom muito natural:
Conclusão
Espero que você tenha se divertido tanto quanto eu com este projeto! As possibilidades do mecanismo de conclusão GPT-3 são infinitas, por isso recomendo que você experimente ele adaptando este projeto para criar outros usos originais além de bate-papo.
Se você criar seu próprio bot, quero saber sobre sua experiência!
Publicações relacionadas
Recursos relacionados
Twilio Docs
De APIs a SDKs e aplicativos de amostra
Documentação de referência de API, SDKs, bibliotecas auxiliares, guias de início rápido e tutoriais para sua linguagem e plataforma.
Centro de Recursos
Os mais recentes e-books, relatórios do setor e webinars
Aprenda com especialistas em engajamento do cliente para melhorar sua própria comunicação.
Ahoy
Centro da comunidade de desenvolvedores da Twilio
Melhores práticas, exemplos de código e inspiração para criar comunicações e experiências de engajamento digital.