Usando os serviços OpenAI para criar um ChatBot - Python

Aprenda a fazer um chatbot usando os serviços da OpenAI.


Fabio 02 Jan 2023 python AI, ChatGPT, e python

Em 2023 Taylor Swift foi eleita a personalidade do ano, mas há quem diga que 2023 foi mesmo o ano da Inteligência Artificial. E de fato há uma corrida das empresas que ficaram para trás do lançamento do modelo text-davinci da OpenAI,era um modelo rudimentar comparado aos gpt-turbo-3.5 e o gpt-4 usados hoje, mas fez barulho e mexeu no mercado. Quem se lembra que o lançamento ocorreu quando o mundo ainda estava assutado com a COVID-19 e a Guerra na Ulcrânia, tudo isso acontecia e assustava, mas as atenções e esperanças estavam mesmo para o futuro que já que tinha chegado. O Google lançou o Bard mas não impressionou. A Baidu lançou seu modelo porém restrito ainda a sua área, enquanto a Amazon e a Apple correm atrás do prejuízo. Elon Musk lançou o Grok1, mas até o momento tinha fila de espera para usar. A Apple tenta negociar um acordo milionário para poder usar os artigos da imprensa americana para seu modelo de linguagem2. A Microsoft foi astuta e financiou a OpenAI quando percebeu o potencial do GPT-2 e hoje oferece os modernos modelos como serviço pago ou gratuito.

Fazendo um chatbot usando o OpenAI

Fazer um chatbot usando os serviços da OpenAI é simples, usa-se somente UMA chamada de função do módulo da openai em python.

Cadastro e criação da Secret Key

Primeiro é preciso fazer o cadastro na plataforma de serviço OpenAI API no site https://platform.openai.com/signup. Até o momento eles oferecem créditos para avaliação do serviço e não é preciso cartão de crédito para usar esses créditos. Entretanto a avaliação fica restrista ao modelo gpt-3.5-turbo que não deixa de ser um modelo capaz e poderoso. Se você usa a versão gratuita do site você usa esse modelo.

Feito o cadastro é preciso gerar a OpenAI KEY para que se possa usar os serviços.

Página para criar a Secret Key da OpenAI

Clique em “Create new Secret Key” para criar sua Secret Key, como visto na figura acima.

Instalação do módulo de acesso

Em seguida é necessário instalar o módulo da openai. Isso pode ser feito pelo PIP ou preferencialmente pelo seu gerenciador de pacotes em sua distribuição Linux.

pip install openai

Fazendo sua primeira conversa

Finalmente podemos fazer a primeira chamada para a OpenAI. Primeiramente é preciso criar uma instância OpenAI usando sua SECRET_KEY do passo anterior. Para fazer uma requisição usa-se o chat.completions.create como visto no código abaixo:


# Importa o módulo OpenAI instalado com pip anteriormente
from openai import OpenAI
# Cria uma instância OpenAI. Utilize aqui sua Secret Key no lugar de SUA_SECRET_KEY ( entre aspas )
client = OpenAI(SUA_SECRET_KEY)

# Finalmente fazemos uma requisição ao serviço de chat
completion = client.chat.completions.create(
model="gpt-3.5-turbo",  # Modelo usado.
# A personalidade e o texto enviado ao chat.
messages=[
    {"role": "system", "content": "Você é um assistente virtual divertido e bem humorado."},
    {"role": "user", "content": "Qual o sentido da vida?"}
]
)

# E finalmente exibimos a resposta do modelo "gpt-3.5-turbo" a questão "Qual o sentido da vida?"
print(completion.choices[0].message)

Personalizando e embutindo informações

Basicamente é só isso. Configura a Key e chama os serviço de complementação de texto completions.create com a personalidade e a mensagem. Fácil não?!

Agora é uma boa hora para explicar os roles da requisição. Como se pode ver no código temos uma list com duas dict com as chaves “role” e “content”. Essas informações serão enviadas ao modelo para configurá-lo com a personalidade e informações que se deseja.

Role System

O role system é o mais forte e determina a personalidade do assistente. Veja alguns exemplos de role system:

  • “Você é uma IA da empresa Octopus S.A.. A Empresa está localizada no endereço X e tem o telefone Y.”
  • “Você é um bot do telegram divertido e bem humorado. Sua personalidade é ácida e irônica”
  • “Você é um assistente virtual no twitch do Gamer Lucão, você adora Minecraft e Playstation 5”

Esse role é opcional. Não é preciso enviar nada se não quiser.

Role Assistant

O role assistant é útil para enviar a conversa anterior e informações relevantes. Em geral usa-se formatação de strings no python para embutir informações e o texto anterior. Veja alguns exemplos:

EXPEDIENTE = "estamos abertos até as 18:00hrs" 
...
{"role": "system", "content": F"Hoje é {datetime.datetime.now()} e hoje {EXPEDIENTE}."}
REQ_ANT = "Onde compro o Dipirona?"
RESP_ANT = "Olá, Você pode comprar na farmácia ..."
...
{"role": "system", "content": F"Anteriormente o usuário solicitou '{REQ_ANT}' e você respondeu '{RESP_ANT}'."}
Role User

O role user é onde as mensagens do usuário serão inseridas. No exemplo acima foi a mensagem “Qual o sentido da vida?”.

Limitações

Cada requisição é única e não tem memória. Ele não se lembra das requisições anteriores. Para que o modelo saiba o que foi dito anteriormente e ele possa continuar a conversa o histórico deve ser passado no role assistant. Também há um limite de informações que pode ser colocado nos roles. O conjunto dos roles é chamado contexto. O limite do contexto é dado em tokens e atualmente é 4096 tokens, mas há modelos que tem 16k tokens.

Tokens podem ser uma letra ou uma palavra inteira, depende do vocabulário usado pelo modelo. Não conte as letras para verificar o limite de tokens, pois como dito, os tokens podem ser uma letra ou um pedaço de uma palavra ou uma palavra inteira.

Os modelos tem controle de conversas tóxicas, ilegais, abusivas e temas sensíveis. Não peça para o modelo contar um conto erótico que dificilmente ele o fará. Também não é possível inventar histórias mentirosas de pessoas ou temas sensíveis. O modelo tem personalidade multicultural, feminista e woke.

Quando acabar seus créditos só será possível continuar requisitando com um cartão de crédito onde será cobrado por tokens. Não é muito, você brincando sozinho consumirá menos de \$ 1,00 ou em uso mais intensivo \$ 5,00. Você pode configurar um limite no site para no caso de passar desse valor ele pare de responder as requisições.

Empresas

Algumas observações são importantes quando for usar o chatbot em empresas. Vamos imaginar um cenário onde o chatbot deverá ser usado para consultar um grande banco de dados de produtos e como se percebeu a limitação do contexto (os roles system, assistant e user) não tem como colocar todos os produtos e suas caracteristicas no contexto da requisição, isso é impraticável.

Para que uma grande base de dados seja ‘ligada’ ao chatbot deverá ser usado um Langchain ou um Information Extration. O Langchain usa duas camadas. A primeira etapa é a indexação da base de dados que você quer disponibilizar ao chatbot. Nesta etapa documentos, pdfs, textos, planilhas são indexadas por um modelo de embedded que gerará um grande vetor de números de ponto flutuante. Esse vetor representará uma sentença do texto e será armazenado em um banco de dados vetorial ( Vector Database ).

Quando o usuário fizer uma requisição a requisição irá novamente para esse modelo embedded que gerará um vetor embedded representando a requisição e o banco de dados será consultado com o valor que mais se aproxima do vetor da requisição. Encontrado a informação, a informação é retornada para o chatbot para ele gerar uma resposta com a informação obtida do banco de dados.

Exemplo:

Um escritório de advocacia quer um chatbot ajudando seus advogados.

Primeira etapa ( pode ser feita somente uma vez ):

  • Reunir todos os documentos, leis, sentenças e diário oficiais que achar necessário.
  • Extrair as sentenças ( por exemplo fazendo um .split(".") no texto ).
  • Gerar um vetor embedded para cada sentença.
  • Amazenar os vetores embedded em um banco de dados vetorial.

Segunda etapa (a cada requisição ):

  • O usuário digita uma requisição por exemplo “O Sr. Antonio de oliveira tem algum processo cível?”
  • O modelo embedded gera um vetor com o texto da requisição.
  • O banco de dados é consultado com esse vetor para achar a sentença mais próxima.
  • Ele achou por exemplo “Antonio de oliveira x José no nascimento”
  • A informação é adicionada ao role assistant para o chatbot gerar uma resposta.

O Information Extration é diferente este não usa um modelo embedded. Ele extrai a intenção do usuário e as palavras chaves que serão usados para montar diretamente uma requisição SQL ao banco de dados que então retornará a informação a ser inserida nos roles da requisição da resposta.

Langchain e Information Extraction são áreas e ferramentas diferentes mas auxiliares do modelos de linguagem. A OpenAI e outras empresas disponibilizam esses serviços pagos.