Explorando A API Da OpenAI
Explorando A API Da OpenAI
Asimov Academy
Explorando a API da OpenAI
Conteúdo
Asimov Academy 1
Explorando a API da OpenAI
Asimov Academy 2
Explorando a API da OpenAI
Asimov Academy 3
Explorando a API da OpenAI
Olá e bem-vindos ao nosso curso “Explorando a API da OpenAI”! Estou super animado por ter vocês
aqui e mal posso esperar para explorarmos juntos esse universo fascinante da programação e da
inteligência artificial.
Vocês já devem ter percebido que a IA está mudando o jogo em muitos campos, certo? É incrível como
ela está transformando a maneira como lidamos com informações e realiza tarefas que antes pareciam
exclusivas da mente humana. E o mais legal é que não estamos apenas assistindo a essa mudança;
vamos fazer parte dela!
Com a API da OpenAI, temos a chance de interagir com alguns dos modelos de IA mais avançados
que existem. E ao conciliarmos o poder desses modelos com as capacidades da programação Python,
damos um salto para o futuro.
Ao longo deste curso, vamos aprender a usar essa API para realizar tarefas incríveis, como criar textos,
gerar imagens e transcrever áudios. E o mais bacana é que vamos fazer tudo isso de um jeito bem
prático, escrevendo nosso próprio código e vendo a mágica acontecer na frente dos nossos olhos.
Python é a ferramenta perfeita para isso. Ela é simples, direta e nos permite focar no que realmente
importa: criar aplicações incríveis. E quando você combina essa simplicidade com o poder da IA, as
possibilidades são praticamente infinitas.
Então, se vocês estão tão empolgados quanto eu para começar a explorar o que a IA pode fazer e como
podemos usá-la para expandir nossas habilidades de programação, vocês estão no lugar certo. Vamos
aprender, nos impressionar e, quem sabe, até criar algo que nunca imaginamos ser possível.
Sejam bem-vindos! Vamos nessa juntos e ver até onde podemos chegar com a API da OpenAI e nosso
querido Python.
Asimov Academy 4
Explorando a API da OpenAI
Antes de iniciarmos nosso curso, é crucial compreender a estrutura do mesmo e saber onde encontrar
informações em caso de dúvidas ou problemas. Para isso, vamos explorar o site da OpenAI e entender
a organização da documentação. Dessa forma, você estará equipado para buscar informações de
maneira autônoma, preenchendo quaisquer lacunas que possam surgir.
No entanto, antes de mergulharmos nesse processo, considero importante definirmos o que é uma
API.
Uma API, sigla para Interface de Programação de Aplicações (em inglês, “Application Program-
ming Interface”), consiste em um conjunto de regras e definições projetadas para permitir a
comunicação entre softwares distintos. Ela atua como um intermediário, estabelecendo como
os desenvolvedores podem solicitar informações ou dados de um programa, sem a necessidade
de compreender os detalhes internos de como esses serviços são implementados.
Imagine que você está em um restaurante com um cardápio repleto de opções de pratos. A cozinha
representa um sistema complexo que você, como cliente, não vê ou com o qual interage diretamente.
Nesse cenário, a API é semelhante ao garçom, que atua como o intermediário entre você e a cozinha.
Você informa ao garçom (API) o que deseja comer (a solicitação de serviço ou dados), e ele comunica
seu pedido à cozinha, onde o prato é preparado (o processamento interno do sistema). Em seguida, o
garçom entrega o prato pronto a você (a resposta da API). Não é necessário entender como o prato é
feito, quais ingredientes são utilizados ou o funcionamento interno da cozinha. O essencial é saber o
que consta no cardápio (a documentação da API) e como fazer o pedido (como utilizar a API).
No contexto dos modelos de linguagem de grande escala (LLM), uma API é frequentemente disponi-
bilizada por provedores como a OpenAI para simplificar o acesso aos modelos. Por exemplo, uma
API pode permitir que você envie um texto e, em resposta, receba uma continuação coerente desse
texto gerada pelo modelo, uma resposta a uma pergunta ou uma tradução. Isso possibilita que de-
senvolvedores, mesmo aqueles com conhecimentos básicos de programação como você, integrem
funcionalidades de inteligência artificial avançadas em seus próprios aplicativos sem a necessidade de
construir e treinar seus próprios modelos. Tal processo exigiria não apenas recursos computacionais
significativos, mas também expertise especializada.
Asimov Academy 5
Explorando a API da OpenAI
A OpenAI
• GPT-4: Trata-se de um modelo de linguagem de grande escala (LLM) multimodal, que aceita
entradas de texto ou imagem e produz texto. Ele é capaz de resolver problemas complexos com
maior precisão do que os modelos anteriores da OpenAI.
• DALL-E: Este sistema de IA pode criar imagens e arte realistas a partir de descrições textuais. O
DALL·E 3, em particular, suporta a capacidade de gerar novas imagens em tamanhos específicos,
com base em sugestões fornecidas.
• TTS: É um modelo de IA que transforma texto em fala com uma sonoridade natural.
Asimov Academy 6
Explorando a API da OpenAI
Capabilities
Modelos
Na página de modelos, você pode ver a descrição completa de todos os modelos disponíveis hoje da
OpenAI.
Asimov Academy 7
Explorando a API da OpenAI
Exemplos de prompts
Na página de exemplos, você pode verificar alguns prompts simples mas eficientes para diversas
tarefas diferentes:
Cookbook
A OpenAI fornece a explicação completa de diversos projetos desenvolvidos pela sua equipe na página
de Cookbook.
Asimov Academy 8
Explorando a API da OpenAI
Guias
Também está disponível diversos guias de boas práticas recomendadas ao utilizar os modelos da
OpenAI.
Asimov Academy 9
Explorando a API da OpenAI
É importante esclarecermos, desde o início do nosso curso, que será necessário realizar um pequeno
investimento para utilizar a API da OpenAI. Quando digo pequeno, refiro-me a um valor acessível,
especialmente considerando as capacidades e o poder da API, embora ainda represente um custo.
Recomendo enfaticamente que façam esse investimento. Apesar da existência de modelos gratuitos no
mercado, atualmente nenhum se equipara aos oferecidos pela OpenAI. Os modelos que empregaremos
são extremamente avançados e requerem uma capacidade computacional imensa para funcionar.
Mesmo que tivéssemos acesso ao código-fonte, não conseguiríamos operá-los em nossos computa-
dores pessoais. Ao utilizar a API, não somos nós que processamos os dados, mas sim os servidores da
própria OpenAI. É justo, portanto, que a empresa seja compensada por disponibilizar uma quantidade
significativa de recursos computacionais para nosso uso. Contribuir financeiramente para a OpenAI
significa também apoiar o desenvolvimento contínuo dos modelos de linguagem de grande escala
(LLM) e todos os benefícios potenciais que eles trazem.
Há a opção de usar a API de forma gratuita, e abordaremos as limitações dessa modalidade antes de
discutirmos como adicionar saldo. Se você optar por iniciar o curso sem adicionar fundos, tudo bem.
Contudo, esteja ciente de que, se em algum momento você se deparar com limitações, será necessário
adicionar saldo para prosseguir.
Nesta página, você pode verificar todas as limitações de uso por tipo de modelo. Os limites são
portanto:
Sendo: - RPM: requisições por minuto - RPD: requisições por dia - TPM: tokens por minuto
Você pode perceber que modelos mais avançados como o GPT-4 não está disponível a nível gratuito.
Asimov Academy 10
Explorando a API da OpenAI
Adicionando saldo
Para adicionar saldo, você precisa ir para a página de billing, clicando antes em Settings:
Asimov Academy 11
Explorando a API da OpenAI
E aparecerá uma tela para você adicionar suas informações de cartão. Após adicionado, será possível
aportar saldo a sua conta, clicando em Add to credit balance:
Asimov Academy 12
Explorando a API da OpenAI
O menor valor possível é de U$5, o que equivale a aproximadamente R$25 na cotação de hoje. Clicando
em Continue, adicionamos saldo a nossa conta.
Algo importante é controlar os gastos gerados pela API. A Openai pensou nisto, naturalmente, e
adicionou um limitador de custos mensais na aba de limits.
Asimov Academy 13
Explorando a API da OpenAI
Aqui você pode facilmente configurar os limites de gastos em dólares. Basta digitar um novo valor na
caixa e clicar no botão Save.
Verificação de uso
No momento que você criu uma aplicação utilizando as APIs, será importatne monitorar os custos que
você está tendo por dia e por modelo diferente. Isso é possível na aba Usage.
Passando o mouse sobre o gráfico podemos verificar o custo por cada modelo.
Asimov Academy 14
Explorando a API da OpenAI
Já sabemos controlar nossos custos, mas é importante entender quais custos são estes. Para isto,
vamos a página de precificação da Openai.
É importante lembrar que um token equivale a aproximadamente quatro letras. Como podemos
observar, os custos são calculados com base tanto nos tokens de entrada (o prompt) quanto na saída
(resposta do modelo).
Os diferentes modelos têm diferentes precificações. No caso dos modelos de imagem, a cobrança é
feita por imagem gerada:
Modelo de áudio para texto como o Whisper cobram por minuto transcrito e modelos de texto para
áudio cobram por caractere convertido:
Asimov Academy 15
Explorando a API da OpenAI
Asimov Academy 16
Explorando a API da OpenAI
Agora vamos para a instalação da biblioteca de Python para começar a brincar com nossas APIs.
Instalando a biblioteca
A biblioteca foi desenvolvida pela própria OpenAI e serve como um facilitador para os usuários que
desejam acessar os recursos da empresa. Você pode encontrar o repositório da biblioteca aqui. Para
instalá-la, você pode usar o pip com o seguinte comando:
Este curso é feito utilizando a versão 1.14.0 da API. Caso você queira utilizar a mesma versão e garantir
a compatibilidade, basta rodar o seguinte:
E um alerta importante:
Portanto, se você está utilizando uma versão mais antiga, faça a atualização utilizando o seguinte
código:
Para associar as chamadas que você realiza à sua conta da OpenAI, é necessário gerar uma chave de
API (API key) e fornecê-la ao inicializar a biblioteca. Para criar essa chave, você deve retornar ao site da
OpenAI.
Vamos até a aba de API Keys e cliacamos em Create new secreat key:
Asimov Academy 17
Explorando a API da OpenAI
Após a criação da chave, o valor será exibido para você. É essencial que você guarde esse valor de
forma segura e não o divulgue, pois ele só aparecerá uma vez. Depois de clicar no botão “done”, não
será mais possível verificar o valor da chave, então, certifique-se de salvá-lo imediatamente!
Asimov Academy 18
Explorando a API da OpenAI
Perfeito, agora temos nossa key, biblioteca instalada e podemos inicializar nosso primeiro cliente.
Inicializando o cliente
O clinete é a classe de comunicação com todos os recursos da API. Para inicializá-lo, será necessário
termos em mão nossa api_key e rodar o seguinte comando:
import openai
api_key = 'XXXXXXXXXXXXX'
client = openai.Client(api_key=api_key)
Por questões de segurança, é recomendável não expor nossas chaves de API nos scripts que escrevemos.
Para evitar essa exposição, podemos utilizar a biblioteca python-dotenv, que permite ler um
arquivo .env e definir as variáveis contidas nele como variáveis de ambiente. Primeiro, criamos nosso
arquivo .env com o seguinte conteúdo:
OPENAI_API_KEY=XXXXXXXXXXXXXXXXXXXXX
Asimov Academy 19
Explorando a API da OpenAI
Você deve adicionar no valor em X a sua chave de API. Após isso, vamos instalar a biblioteca python-
dotenv:
_ = load_dotenv(find_dotenv())
client = openai.Client()
Observe que, com essa abordagem, não é necessário referenciar a sua API key diretamente no código,
pois a biblioteca da OpenAI buscará automaticamente a chave entre as variáveis de ambiente. Se a
chave não for encontrada nas variáveis de ambiente, um erro será retornado.
Asimov Academy 20
Explorando a API da OpenAI
Vamos aprender a gerar textos por meio da API. O objetivo é replicar as funcionalidades disponíveis na
interface do ChatGPT, utilizando agora a linguagem Python.
Vamos mostrar de forma rápida um script completo e depois vamos analisando linha a linha as minucias
do código:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
mensagens = [{'role': 'user', 'content': 'O que é uma maçã em até 5 palavras?'}]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Vermelha ou verde.
Asimov Academy 21
Explorando a API da OpenAI
Parâmetro messages
Para comunicar-se com o modelo, utilizamos o parâmetro messages. É necessário fornecer uma lista
de dicionários ao método chat.completions.create do client. Cada dicionário contém duas
chaves principais: content, que é o conteúdo da mensagem, e role, que define o papel de quem
está enviando a mensagem. A chave role pode ter três valores distintos:
Asimov Academy 22
Explorando a API da OpenAI
exemplo, na técnica de few-shot learning, onde uma sequência de mensagens marcadas como
user e assistant serve para demonstrar ao modelo como responder corretamente.
A seguir, um exemplo de como poderia ser estruturado um few-shot learning com mensagens
específicas:
mensagens = [
{'role': 'system', 'content': 'Você avalia comentários em positivo ou negativo.'},
{'role': 'user', 'content': 'Isso é incrível!'},
{'role': 'assistant', 'content': 'Positivo'},
{'role': 'user', 'content': 'Isso é ruim!'},
{'role': 'assistant', 'content': 'Negativo'},
{'role': 'user', 'content': 'Que programa horrível!'},
]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Negativo
Podemos observar que a resposta do modelo é sempre retornada no mesmo tipo de dado: a classe
ChatCompletion da biblioteca da OpenAI:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
mensagens = [{'role': 'user', 'content': 'O que é uma maçã em até 5 palavras?'}]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
print(type(resposta))
Asimov Academy 23
Explorando a API da OpenAI
chatcmpl-92frfZEkVrXD3yCTiEAJNPumPR8L6
• usage: permite verificar quantos tokens forma enviados ao modelo e quanto retornaram na
resposta. A partir desse valor, podemos calcular o custo da chamada
print(resposta.usage)
Para retornar a mensagem de fato, precisamos retornar o elemento zero do choices e depois o
parâmetro message:
mensagem_resp = resposta.choices[0].message
print(mensagem_resp)
A resposta final é fornecida pela classe ChatCompletionMessage. Esta classe tem quatro propriedades:
content, role, function_call e tool_calls. Por ora, vamos focar apenas nas duas primeiras
propriedades. Os termos content e role já são familiares, pois correspondem ao mesmo formato
que utilizamos para enviar a mensagem inicial. Para incorporar a resposta do modelo à nossa men-
sagem original, poderíamos proceder de duas maneiras:
mensagem_resp = resposta.choices[0].message
mensagens.append({'role': mensagem_resp.role, 'content': mensagem_resp.content})
Asimov Academy 24
Explorando a API da OpenAI
model São os modelos de linguagem atuais da openai. A lista você pode acessar diretamente na
documentação:
No método chatcompletion.create, basta passar uma string com o nome do modelo para utilizá-lo.
max_tokens O parâmetro max_tokens representa o tamanho máximo da resposta. Ele serve como
uma medida de proteção contra custos excessivos da API, mas também pode resultar em respostas
incompletas se o limite for muito baixo.
Asimov Academy 25
Explorando a API da OpenAI
mensagens += [mensagem_resp.model_dump(exclude_none=True)]
mensagens += [{'role': 'user', 'content': 'E qual a sua cor?'}]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=5,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Vermelha ou
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=100,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Vermelha ou verde.
mensagens += [mensagem_resp.model_dump(exclude_none=True)]
mensagens += [{'role': 'user', 'content': 'E qual a sua cor?'}]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=100,
temperature=2,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Asimov Academy 26
Explorando a API da OpenAI
Depende da variedadeública/>
Dur.de forma iTreeNode.neighbors(DataResponseStatus basevoirizeísticaJD_Windo
orpion Handler_AC_con workingsTransmissionOptions);//Vue Tree.Generic FavoritesPr
É possível notar que, com a temperatura configurada em 2, o modelo pode gerar respostas imprecisas
ou “alucinações”. Portanto, embora valores de temperatura até 2 sejam aceitos, recomenda-se manter
o parâmetro de temperatura em até 1 para evitar esse tipo de comportamento.
Asimov Academy 27
Explorando a API da OpenAI
É possível perceber que, ao utilizar a API conforme aprendido na última aula, o modelo gera a resposta
completa antes de fornecê-la. Isso difere da experiência ao usar a interface do ChatGPT, onde a resposta
parece ser construída de maneira mais interativa.
Observamos que a interface do ChatGPT exibe cada novo token gerado, criando uma interação mais
dinâmica com o usuário. Felizmente, é possível reproduzir esse mesmo efeito na API utilizando o
parâmetro stream.
import openai
from dotenv import load_dotenv, find_dotenv
Asimov Academy 28
Explorando a API da OpenAI
_ = load_dotenv(find_dotenv())
client = openai.Client()
mensagens = [
{'role': 'user', 'content': 'Crie uma história de dois parágrafos sobre uma viagem a
,→ marte'}
]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
stream=True,
)
Agora, percebemos que, em vez de usarmos a propriedade message do objeto choices, estamos
utilizando o delta. Se quiséssemos armazenar a mensagem inteira, poderíamos proceder da seguinte
maneira:
mensagem_resp = ''
for stream_resp in resposta:
print(stream_resp.choices[0].delta.content, end='')
if stream_resp.choices[0].delta.content:
mensagem_resp += stream_resp.choices[0].delta.content
Ele é necessário, pois o último delta é retornado como None e se fossemos concatená-lo a uma string
retornaríamos um erro.
Asimov Academy 29
Explorando a API da OpenAI
Fica de desafio para você criar o seu primeiro chatbot utilizando a API da openai.
Fica o desafio para você tentar resolver. Caso não esteja com vontade, esta é a minha solução:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
def retorna_resposta_modelo(
mensagens
):
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
stream=True,
)
mensagem_resp = ''
print('Assistant: ', end='')
for stream_resp in resposta:
if stream_resp.choices[0].delta.content:
print(stream_resp.choices[0].delta.content, end='')
mensagem_resp += stream_resp.choices[0].delta.content
print()
mensagens.append(
{'role': 'assistant', 'content': mensagem_resp}
)
return mensagens
def main():
mensagens = []
print('Bem-vindo ao ChatBot da Asimov. Digite sua mensagem abaixo!')
Asimov Academy 30
Explorando a API da OpenAI
while True:
user_mensagem = input('User: ')
mensagens.append(
{'role': 'user', 'content': user_mensagem}
)
mensagens = retorna_resposta_modelo(mensagens)
if __name__ == '__main__':
main()
Asimov Academy 31
Explorando a API da OpenAI
Uma das limitações de um modelo de linguagem é a sua capacidade de acessar informações atualizadas.
Isso ocorre porque o modelo é treinado com dados históricos e, após ser colocado em operação, não
continua seu treinamento. Por exemplo, o GPT-4 tem informações atualizadas até dezembro de 2023, e
o GPT-3 até setembro de 2021. No entanto, não há motivo para preocupação, pois existe uma solução
incrível para obter respostas atuais mesmo sem esses dados na base de conhecimento do modelo: o
acesso a ferramentas externas.
Os modelos mais recentes têm a funcionalidade de chamada de funções (function calling). Essas
funções podem coletar informações atualizadas para serem processadas pelo modelo ou até mesmo
permitir que o próprio modelo execute ações, como enviar e-mails, adicionar valores a uma base de
dados, entre outras possibilidades.
A seguir, vamos apresentar um exemplo prático dessa funcionalidade e, depois, analisaremos cada
etapa detalhadamente:
import json
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
tools = [
{
"type": "function",
"function": {
Asimov Academy 32
Explorando a API da OpenAI
"name": "obter_temperatura_atual",
"description": "Obtém a temperatura atual em uma dada cidade",
"parameters": {
"type": "object",
"properties": {
"local": {
"type": "string",
"description": "O nome da cidade. Ex: São Paulo",
},
"unidade": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
},
},
"required": ["local"],
},
},
}
]
funcoes_disponiveis = {
"obter_temperatura_atual": obter_temperatura_atual,
}
mensagens = [
{"role": "user",
"content": "Qual é a temperatura em São Paulo e Porto Alegre?"}
]
resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
tools=tools,
tool_choice="auto",
)
mensagem_resp = resposta.choices[0].message
tool_calls = mensagem_resp.tool_calls
if tool_calls:
mensagens.append(mensagem_resp)
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = funcoes_disponiveis[function_name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(
local=function_args.get("local"),
unidade=function_args.get("unidade"),
)
mensagens.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
Asimov Academy 33
Explorando a API da OpenAI
}
)
segunda_resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
)
mensagem_resp = segunda_resposta.choices[0].message
print(mensagem_resp.content)
É um código grande como vocês podem perceber, mas vamos explicá-lo em detalhes agora.
Iniciamos definindo as funções que o modelo poderá utilizar para extrair informações. No nosso
exemplo, criamos uma função para informar a temperatura atual de determinadas localidades. Por se
tratar apenas de um exemplo, optamos por manter as temperaturas como valores fixos. No entanto,
poderíamos facilmente conectar essa função a uma API de meteorologia para obter dados em tempo
real.
def obter_temperatura_atual(local, unidade="celsius"):
if "são paulo" in local.lower():
return json.dumps(
{"local": "São Paulo", "temperatura": "32", "unidade": unidade}
)
elif "porto alegre" in local.lower():
return json.dumps(
{"local": "Porto Alegre", "temperatura": "25", "unidade": unidade}
)
elif "rio de janeiro" in local.lower():
return json.dumps(
{"local": "Rio de Janeiro", "temperatura": "35", "unidade": unidade}
)
else:
return json.dumps(
{"local": local, "temperatura": "unknown"}
)
Para garantir que a função retorne uma string, permitindo assim o processamento subsequente da
informação pelo modelo, convertemos a saída em formato JSON. Isso é feito utilizando a função
json.dumps, uma vez que o JSON é um formato de texto amplamente utilizado em APIs para a troca
de dados.
Asimov Academy 34
Explorando a API da OpenAI
Após criar nossa função, é importante informar ao ChatGPT sobre as ferramentas disponíveis para que
ele possa utilizá-las. Para isso, montamos um dicionário que descreve as funções. Esse dicionário deve
incluir as seguintes chaves:
Com isso, temos uma estrutura organizada que permite ao ChatGPT identificar e utilizar as funções
que desenvolvemos.
tools = [
{
"type": "function",
"function": {
"name": "obter_temperatura_atual",
"description": "Obtém a temperatura atual em uma dada cidade",
"parameters": {
"type": "object",
"properties": {
"local": {
"type": "string",
"description": "O nome da cidade. Ex: São Paulo",
},
"unidade": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
},
},
"required": ["local"],
},
Asimov Academy 35
Explorando a API da OpenAI
},
}
]
É importante observar que utilizamos uma lista de dicionários para descrever as ferramentas
disponíveis. Se desejarmos incluir mais de uma função, basta adicionar um novo dicionário à lista,
detalhando a nova função. Cada dicionário deve conter a descrição completa da função que se
pretende disponibilizar, seguindo o mesmo formato estrutural para garantir a consistência e a
compreensão adequada pelo modelo.
Para informar o modelo sobre as novas funções disponíveis, devemos passar a lista de ferramentas
que construímos anteriormente como argumento no parâmetro tools. Isso permite que o modelo re-
conheça e interaja com as funções que adicionamos, expandindo suas capacidades de processamento
e resposta.
mensagens = [
{"role": "user",
"content": "Qual é a temperatura em São Paulo e Porto Alegre?"}
]
resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
tools=tools,
tool_choice="auto",
)
O parâmetro tool_choice possui o valor “auto” como padrão, o que permite ao modelo decidir
automaticamente qual ferramenta utilizar. No entanto, se quisermos direcionar o modelo para usar
uma função específica que criamos, podemos alterar o valor padrão de tool_choice para o nome
da nossa função. Isso forçará o modelo a utilizar a ferramenta que especificamos.
Asimov Academy 36
Explorando a API da OpenAI
A primeira coisa a notar é que o content da mensagem retornou None, indicando que o modelo não
forneceu uma resposta em forma de texto. Outro aspecto relevante é que o parâmetro tool_calls
agora contém valores, o que sinaliza que o modelo está solicitando a resposta de funções externas
para fornecer uma resposta apropriada. Ao analisar o tool_calls com mais detalhes, podemos
entender melhor como o modelo indica a necessidade de interação com as ferramentas externas.
tool_calls = mensagem_resp.tool_calls
print(mensagem_resp)
[ChatCompletionMessageToolCall(id='call_HF6eGifbO6kNpNX3zRuEZyxe', function=Funct
Podemos notar que há uma lista contendo dois valores, e cada um é representado pela classe
ChatCompletionMessageToolCall. Ao examinar o primeiro valor, identificamos que o modelo
está solicitando a execução da função obter_temperatura_atual com os parâmetros local
definido como “São Paulo” e unidade como “celsius”. Isso indica que o modelo requer os dados
fornecidos por essa função externa para prosseguir com a resposta adequada.
print(tool_calls[0])
ChatCompletionMessageToolCall(id='call_FYUQWKtHj5k1kpqJy8ru1grb', function=Functi
ChatCompletionMessageToolCall(id='call_FYUQWKtHj5k1kpqJy8ru1grb', function=Functi
Agora basta a nós rodar as funções externas e passar novamente para o modelo o resultado:
funcoes_disponiveis = {
"obter_temperatura_atual": obter_temperatura_atual,
}
if tool_calls:
mensagens.append(mensagem_resp)
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = funcoes_disponiveis[function_name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(
local=function_args.get("local"),
unidade=function_args.get("unidade"),
)
Asimov Academy 37
Explorando a API da OpenAI
mensagens.append(
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
}
)
segunda_resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
)
Depois fazemos um for para cada função diferente que deve ser rodada:
for tool_call in tool_calls:
Como podem observar, os argumentos vem em string no formato json. Para transformá-lo em um
dicionário de Python basta realizar o seguinte:
function_args = json.loads(tool_call.function.arguments)
Asimov Academy 38
Explorando a API da OpenAI
"content": function_response,
}
Atenção para a formatação da mensagem! Devemos adicionar o tool_call_id, como role deve-
mos passar o valor “tool”, devemos passar a chave name com o nome da função e o content com o
resultado da função.
Vamos analisar as mensagens que foram passadas para o modelo na última chamada:
for mensagem in mensagens:
print(mensagem, end='\n\n')
Observamos que o total de mensagens é quatro. A primeira mensagem corresponde à nossa pergunta
inicial. A segunda é a resposta do modelo, na qual ele solicita informações às ferramentas externas. A
terceira e a quarta mensagens são as respostas fornecidas pela ferramenta externa em atendimento aos
chamados feitos pelo modelo. Com essas informações em mãos, o modelo foi capaz de nos fornecer a
resposta correta!
mensagem_resp = segunda_resposta.choices[0].message
print(mensagem_resp.content)
Asimov Academy 39
Explorando a API da OpenAI
O desafio agora é criar um chatbot utilizando a API da openai que tenha acessos a dados do mercado
financeiro. Para isso, você pode utilizar a api do yahoo finance:
["1d","5d","1mo","3mo","6mo","1y","2y","5y","10y","ytd","max"]
• d: dia
• mo: mês
• y: ano
• ytd: desde o início do ano
• max: período máximo
Fica o desafio para você tentar resolver. Caso não esteja com vontade, esta é a minha solução:
import json
import yfinance as yf
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
# DEFINE FUNCOES
def retorna_cotacao_historica(ticker, periodo):
ticker_obj = yf.Ticker(f'{ticker}.SA')
hist = ticker_obj.history(period=periodo)
if len(hist) > 30:
slice_size = int(len(hist) / 30)
hist = hist.iloc[::-slice_size][::-1]
hist.index = hist.index.strftime('%m-%d-%Y')
return hist['Close'].to_json()
tools = [
{
Asimov Academy 40
Explorando a API da OpenAI
"type": "function",
"function": {
"name": "retorna_cotacao_historica",
"description": "Retorna a cotação diária histórica para \
uma ação da bovespa",
"parameters": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "O ticker da ação. Exemplo: 'PETR4' \
para petrobras",
},
"periodo": {
"type": "string",
"description": "O período que será retornado de dados, \
sendo '1mo' equivalente a um mês, \
'1d' a 1 dia e '1y' a um ano",
"enum":
["1d","5d","1mo","6mo","1y","5y","10y","ytd","max"]
},
},
"required": ["ticker", "periodo"],
},
},
}
]
funcoes_disponiveis = {
"retorna_cotacao_historica": retorna_cotacao_historica,
}
def retorna_resposta_modelo(mensagens):
resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
tools=tools,
tool_choice="auto",
)
mensagem_resp = resposta.choices[0].message
mensagens.append(mensagem_resp)
tool_calls = mensagem_resp.tool_calls
if tool_calls:
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = funcoes_disponiveis[function_name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(
ticker=function_args.get("ticker"),
periodo=function_args.get("periodo"),
)
mensagens.append(
Asimov Academy 41
Explorando a API da OpenAI
{
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_response,
}
)
segunda_resposta = client.chat.completions.create(
model="gpt-3.5-turbo-0125",
messages=mensagens,
)
mensagens.append(segunda_resposta.choices[0].message)
print(mensagens[-1].content)
return mensagens
def main():
mensagens = []
print('Bem-vindo ao ChatBot Financeiro da Asimov. \
Digite sua mensagem abaixo!')
while True:
user_mensagem = input('User: ')
mensagens.append(
{'role': 'user', 'content': user_mensagem}
)
mensagens = retorna_resposta_modelo(mensagens)
if __name__ == '__main__':
main()
Asimov Academy 42
Explorando a API da OpenAI
O que é Fine-Tuning?
O Fine-Tuning em inteligência artificial representa uma técnica de aprendizado por transferência. Essa
abordagem consiste em tomar um modelo pré-treinado, o qual foi desenvolvido com base em um
vasto conjunto de dados para uma tarefa ampla – a exemplo dos modelos GPT – e realizar ajustes
sutis em seus parâmetros internos. O propósito é aprimorar o desempenho do modelo para uma nova
tarefa correlata, evitando a necessidade de iniciar o processo de treinamento desde o início.
O processo de Fine-tuning em modelos de geração de texto pode aprimorá-los para aplicações especí-
ficas, contudo, exige um investimento criterioso de tempo e recursos. Antes de recorrer ao Fine-tuning,
é recomendável tentar alcançar resultados satisfatórios por meio de engenharia de prompts, encadea-
mento de prompts (que consiste em dividir tarefas complexas em múltiplos prompts) e chamada de
função. As principais razões para essa abordagem são:
• Muitas tarefas podem parecer desafiadoras para os modelos inicialmente, mas é possível melho-
rar significativamente os resultados com a escolha adequada de prompts, tornando o Fine-tuning
desnecessário.
• O processo de iteração com prompts e outras estratégias permite um ciclo de feedback muito
mais ágil do que o Fine-tuning, que demanda a criação de conjuntos de dados e a realização de
processos de treinamento.
• Mesmo nos casos em que o Fine-tuning se faz necessário, o trabalho preliminar com engenharia
de prompts não é perdido. Geralmente, os melhores resultados são obtidos ao utilizar um
prompt bem elaborado nos dados de Fine-tuning, ou ao combinar o encadeamento de prompts
e o uso de ferramentas com o Fine-tuning.
Nosso curso de Engenharia de Prompts oferece uma visão abrangente de algumas das estratégias e
táticas mais eficientes para melhorar o desempenho dos modelos sem a necessidade de Fine-tuning.
Asimov Academy 43
Explorando a API da OpenAI
Usos comuns
Alguns casos de uso comuns nos quais o fine-tuning pode aprimorar os resultados incluem:
Uma maneira de abordar esses casos é quando é mais eficaz “mostrar, não dizer”.
Definição do problema
Nosso objetivo com o exemplo a seguir é formatar as respostas. Desejamos que o modelo forneça
sempre sua resposta no formato JSON, com as seguintes chaves: resposta, categoria e fonte. Eis a
definição das chaves:
Preparação de dados
A ideia por trás do fine-tuning é fornecer mais exemplos ao modelo, permitindo que ele seja re-
treinado com base nesses exemplos e, assim, retorne respostas mais alinhadas com nossas expectativas.
Portanto, é essencial gerar dados contendo esses exemplos. A OpenAI requer arquivos de texto no
formato JSONL para realizar o treinamento dos modelos. Abaixo, segue um exemplo de dado na
formatação necessária:
Asimov Academy 44
Explorando a API da OpenAI
Como você pode perceber, o arquivo consiste em uma lista de mensagens exemplos no mesmo formato
que utilizamos na comunicação com o modelo, sempre com as chaves “role” e “content”.
arquivo = 'chatbot_respostas'
with open(f'{arquivo}.json') as f:
conversa_json = json.load(f)
Asimov Academy 45
Explorando a API da OpenAI
Dado que já criamos nosso modelo, podemos criar um job na OpenAI para criar um novo modelo:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
arquivo = 'chatbot_respostas'
file = client.files.create(
file=open(f'{arquivo}.jsonl', "rb"),
purpose="fine-tune"
)
client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-3.5-turbo"
)
Você pode observar que inicialmente um novo arquivo com os exemplos é enviado utilizando
o método files.create. Em seguida, criamos um job para iniciar o processo com o método
fine_tuning.jobs.create. É possível notar que passamos o ID do arquivo recém-adicionado e
selecionamos o modelo gpt-3.5-turbo para otimização.
Você pode utilizar o seguinte comando para verificar os processos de otimização que estão sendo
rodados:
print(client.fine_tuning.jobs.list(limit=10))
E você pode verificar o estado de algum processo em específico com o seguinte comando:
id_do_job = 'COLOCAR_ID_DO_JOP_AQUI'
client.fine_tuning.jobs.retrieve(id_do_job)
Você também pode verificar o status por esta página da OpenAI. Clicando em algum dos processo,
você pode acompanhar as métricas do treinamento:
Asimov Academy 46
Explorando a API da OpenAI
Para utilizar o modelo modificado, basta verificar seu nome na página de Fine Tuning:
E agora utilizar o método chat.completions, mas com o argumento model definido com o nome do
meu novo modelo:
mensagens = [
{'role': 'user', 'content': 'O que é uma equação quadrática?'}
]
Asimov Academy 47
Explorando a API da OpenAI
resposta = client.chat.completions.create(
messages=mensagens,
model='ft:gpt-3.5-turbo-0125:personal::94CwIN1U',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
{
"resposta": "Uma equação quadrática é uma equação polinomial de segundo grau, c
"categoria": "Matemática",
"fonte": "AsimoBot"
}
E é possível observar que o modelo respondeu no formato solicitado, em um JSON contendo as chaves
resposta, categoria e fonte. Além disso, a resposta possui o tamanho esperado, com um parágrafo
contendo até 20 palavras.
Se utilizamos a mesma lista de mensagens utilizado com o modelo novo no gpt padrão, a resposta
seria a seguinte:
mensagens = [
{'role': 'user', 'content': 'O que é uma equação quadrática?'}
]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
Uma equação quadrática é uma equação polinomial de segundo grau, ou seja, uma equ
Para obter uma resposta na formatação desejada, teríamos que adicionar o seguinte prompt:
system_mes = '''
Responda as perguntas em um parágrafo de até 20 palavras. Categorize as respostas no seguintes
,→ conteúdos: física, matemática, língua portuguesa ou outros.
Asimov Academy 48
Explorando a API da OpenAI
mensagens = [
{"role": "system", "content": system_mes},
{'role': 'user', 'content': 'O que é uma equação quadrática?'}
]
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0,
)
mensagem_resp = resposta.choices[0].message
print(mensagem_resp.content)
{
"fonte": "AsimoBot",
"resposta": "Uma equação quadrática é uma equação do segundo grau, ou seja, u
"categoria": "matemática"
}
Podemos notar que conseguimos economizar vários tokens e mandar mensagens bem menores para
atingir o mesmo resultado com o nosso novo modelo!
Asimov Academy 49
Explorando a API da OpenAI
A Assistants API foi projetada para ajudar os desenvolvedores a construir assistentes de IA poderosos
capazes de realizar uma variedade de tarefas.
Atenção! A Assistants API está em fase beta e será modificada em breve, à medida que novas
funcionalidades surgirem.
• Os assistentes podem chamar os modelos da OpenAI com instruções específicas para ajustar
sua personalidade e capacidades.
• Os assistentes podem acessar várias ferramentas em paralelo, incluindo ferramentas hospedadas
pela OpenAI, como interpretador de código (Code interpreter) e Knowledge Retrieval, ou ferra-
mentas que você construiu (via chamada de função).
• Os assistentes podem acessar Threads persistentes, que simplificam o desenvolvimento de
aplicativos de IA armazenando o histórico de mensagens e truncando-o quando a conversa
fica muito longa para o comprimento do contexto do modelo. Você cria um Thread uma vez e
simplesmente adiciona mensagens a ele à medida que seus usuários respondem.
• Os assistentes podem acessar arquivos em vários formatos, seja como parte de sua criação ou
como parte dos Threads entre os assistentes e os usuários. Ao usar ferramentas, os assistentes
também podem criar arquivos (por exemplo, imagens, planilhas, etc) e citar arquivos aos quais
fazem referência nas mensagens que criam.
Criando um Assistant
Vamos dar um exemplo rápido de utilização da Assistants. Primeiramente, criamos um novo Assistente
com uma instrução específica:
from openai import OpenAI
client = OpenAI()
assistant = client.beta.assistants.create(
name="Math Tutor",
instructions="You are a personal math tutor. Write and run code to answer math questions.",
tools=[{"type": "code_interpreter"}],
model="gpt-4-turbo-preview",
)
Nesse caso, ele terá como tarefa responder dúvidas de matemática. Podemos ver que demos acesso à
ferramenta de interpretação de código (tools=[{“type”: “code_interpreter”}]), ou seja, o assistente será
capaz de rodar códigos em Python para resolver as dúvidas.
Uma vez criado, é possível acessar todos os Assistants através da interface da OpenAI.
Asimov Academy 50
Explorando a API da OpenAI
Criando um Thread
Para adicionar mensagens à thread, basta passar os parâmetros de thread_id (que capturamos da
thread que acabamos de criar), o role e o content. Esses dois últimos nós já conhecemos da geração
de texto.
message = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content='Se eu jogar um dado honesto 1000 vezes, qual é a probabilidade de eu obter
,→ exatamente 150 vezes o número 6? Resolva com um código'
)
Asimov Academy 51
Explorando a API da OpenAI
Por fim, temos que avisar ao Assistant que queremos rodar aquela thread de mensagens que criamos:
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assitant.id,
instructions='O nome do usuário é Adriano Soares e ele é um usuário Premium.'
)
Além disso, podemos enviar instruções específicas relacionadas àquela rodada de thread. Essa in-
strução pode melhorar a resposta do Assistente ao aprimorar o contexto para aquele conjunto de
mensagens específico. No caso, passamos informações sobre o usuário que fez a solicitação.
Para garantir que a thread já tenha sido executada, antes de prosseguirmos no código, podemos utilizar
o seguinte trecho de código:
import time
Verificando a resposta
Por fim, basta verificarmos a resposta dada pelo modelo. Para isso, precisamos solicitar à API a lista de
mensagens atual da thread:
if run.status == 'completed':
mensagens = client.beta.threads.messages.list(
thread_id=thread.id
)
print(mensagens)
else:
print('Errro', run.status)
A probabilidade de obter exatamente 150 vezes o número 6 ao lançar um dado honesto 1000 vezes
,→ é aproximadamente 0.0126, ou seja, cerca de 1.26%.
Asimov Academy 52
Explorando a API da OpenAI
A resposta final foi muito boa e está correta. Inclusive, se fizermos o mesmo questionamento para o
ChatGPT normal, ele não conseguirá dar a resposta correta.
Ele até chega à fórmula correta, mas não consegue executá-la para obter o resultado final. No nosso
caso, a fórmula foi executada pelo Assistente em um código Python e, por isso, obtivemos a resposta.
Podemos verificar isso ao solicitar todos os passos que o modelo percorreu até chegar à solução.
Asimov Academy 53
Explorando a API da OpenAI
onde:
- \( n \) é o número total de tentativas (lançamentos do dado),
- \( k \) é o número de sucessos desejado (número 6),
- \( p \) é a probabilidade de sucesso em uma única tentativa,
- \( q \) é a probabilidade de fracasso em uma única tentativa (1 - p).
# Definindo os parâmetros
n = 1000 # número total de lançamentos do dado
k = 150 # número de vezes que queremos obter o número 6
p = 1/6 # probabilidade de obter o número 6 em um único lançamento
q = 1 - p # probabilidade de não obter o número 6 em um único lançamento
Asimov Academy 54
Explorando a API da OpenAI
Espero que este exemplo elucide um pouco das capacidades dos Assistants e como as suas ferramentas
externas podem aumentar seu poder.
Asimov Academy 55
Explorando a API da OpenAI
Primeiro, vamos olhar os dados que vamos utilizar. Ele são referentes a vendas de um supermercado,
e foram extraídos do Kaggle
import pandas as pd
dataset = pd.read_csv('arquivos/supermarket_sales.csv')
dataset.head()
Agora vamos criar um novo assistant que possui acesso aos meus dados:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
file = client.files.create(
file=open('arquivos/supermarket_sales.csv', 'rb'),
purpose='assistants'
)
assitant = client.beta.assistants.create(
name="Analista Fianceiro",
instructions='Você é um analista financeiro de um supermercado. Você deve utilizar os
,→ dados \
.csv informados relativos as vendas do supermercado para realizar as suas análises.',
tools=[{'type': 'code_interpreter'}],
tool_resources={'code_interpreter': {'file_ids': [file.id]}},
model='gpt-4o'
)
Asimov Academy 56
Explorando a API da OpenAI
Você pode notar que existe um parâmetro tool_resources na criação de assistentes que rebe uma lista
de ids dos arquivos que enviamos para o servidor da OpenAI. Utilizamos a key code_interpreter para
informar que os arquivos estão relaciondos a ferramenta de code_interpreter. Podemos adicionar até
10 documentos diferentes a um assistente.
Para isso, precisamos criar uma Thread, adicionar uma mensagem a ela, solicitar que o assistente
execute a thread e esperar que o processo finalize.
# Cria thread
thread = client.beta.threads.create()
# Adiciona mensagem
pergunta = 'Qual é o rating médio das vendas do nosso supermercado?'
messages = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content=pergunta
)
# Roda thread
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
instructions='O nome do usuário é Adriano.'
)
print(run.status)
Asimov Academy 57
Explorando a API da OpenAI
E analisando a resposta:
print(messages.data[0].content[0].text.value)
O rating médio das vendas do seu supermercado é aproximadamente 6.97. Se precisar de mais
,→ informações ou análises adicionais, por favor, me avise!
6.9727
Verificando os passos
Para verificar os passos necessários para chegar à resposta, basta executar o trecho de código do
capítulo anterior.
run_steps = client.beta.threads.runs.steps.list(
thread_id=thread.id,
run_id=run.id
)
import pandas as pd
# Carregar o arquivo
file_path = '/mnt/data/file-cEUCgJzyVO26Y5fZb4erTPqt'
data = pd.read_csv(file_path)
Asimov Academy 58
Explorando a API da OpenAI
Result
Invoice ID Branch City Customer type Gender \
0 750-67-8428 A Yangon Member Female
1 226-31-3081 C Naypyitaw Normal Female
2 631-41-3108 A Yangon Normal Male
3 123-19-1176 A Yangon Member Male
4 373-73-7910 A Yangon Normal Male
Result
6.9727
======= Step > message_creation
O rating médio das vendas do seu supermercado é aproximadamente 6.97. Se precisar de mais
,→ informações ou análises adicionais, por favor, me avise!
• Criação de mensagem (message_creation): ele percebeu que era necessário abrir o arquivo e
verificar as informações contidas nele.
• Chamada de função (tool_calls): ele executou o código em Python para abrir o arquivo e verificar
os primeiros dados.
• Criação de mensagem (message_creation): ele percebeu que havia uma coluna “Rating” e a
partir dela seria possível calcular o que o usuário solicitou.
• Chamada de função (tool_calls): ele executou o código em Python para calcular o Rating a partir
do arquivo informado.
Asimov Academy 59
Explorando a API da OpenAI
Outra feature bem legal é a possibilidade de gerar gráficos ao utilizarmos o code_interpreter. Vamos
ver como isso funciona.
messages = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content=pergunta
)
print(run.status)
Verificamos as mensagens e notamos que a última não consiste mais em um texto, e sim em um arquivo
de imagem (image_file).
if run.status == 'completed':
messages = client.beta.threads.messages.list(
thread_id=thread.id
)
print(messages)
else:
print('Erro', run.status)
print(messages.data[0].content[0])
Asimov Academy 60
Explorando a API da OpenAI
if message.content[0].type == 'image_file':
file_id = message.content[0].image_file.file_id
image_data = client.files.content(file_id)
with open(f'arquivos/{file_id}.png', 'wb') as f:
f.write(image_data.read())
print(f'Imagem {file_id} salva')
img = mpimg.imread(f'arquivos/{file_id}.png')
fig, ax = plt.subplots()
ax.set_axis_off()
ax.imshow(img)
plt.show()
Asimov Academy 61
Explorando a API da OpenAI
Asimov Academy 62
Explorando a API da OpenAI
A última ferramenta dos Assistants que vamos explorar é a busca em arquivos (ou File Search). Através
dela, o Assistente aumenta suas capacidades com conhecimento de fora de seu modelo, como in-
formações de produtos proprietários ou documentos fornecidos pelos seus usuários. Assim que um
arquivo é carregado e passado para o Assistente, a OpenAI automaticamente segmentará seus docu-
mentos, indexará e armazenará os embeddings, e implementará uma busca vetorial para recuperar
conteúdo relevante para responder às consultas dos usuários.
Começamos criando uma Vector Store, que será a estrutura de armazenamento de dados onde nossos
arquivos de interesse ficarão salvos e enviaremos duas apostilas de nossos cursos (incluindo a deste
curso!):
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
file_batch = client.beta.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id,
files=file_stream
)
Asimov Academy 63
Explorando a API da OpenAI
Nas ferramentas agora, adicionamos o retrieval (tools=[{‘type’: ‘file_search’}]), avisando a API que
gostaríamos de utilizá-la.
messages = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content=pergunta
)
print(run.status)
Para utilizar Assistants com Python, você pode seguir os passos ilustrados abaixo para criar,
,→ configurar e interagir com assistentes inteligentes através da API da OpenAI. Este método
,→ inclui a criação de assistentes com instruções específicas e a utilização de ferramentas
,→ como o **Code Interpreter**.
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
Asimov Academy 64
Explorando a API da OpenAI
client = openai.Client()
2. **Criando o Assistant**
A seguir, crie um assistente com uma instrução específica. Neste exemplo, criamos um
,→ assistente que responde perguntas de matemática e possui acesso à ferramenta de
,→ interpretação de código:
assistant = client.beta.assistants.create(
name="Math Tutor",
instructions="You are a personal math tutor. Write and run code to answer math
,→ questions.",
tools=[{"type": "code_interpreter"}],
model="gpt-4-turbo-preview",
)
....
run_steps = client.beta.threads.runs.steps.list(
thread_id=thread.id,
run_id=run.id
)
Asimov Academy 65
Explorando a API da OpenAI
Primeiro, você deve inicializar o cliente da OpenAI. Aqui está o código para fazer isso:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
Podemos ver que dois passos forma necessários, primeiro um tool_calls de retrieval e depois a formu-
lação da resposta final.
Asimov Academy 66
Explorando a API da OpenAI
Já falamos bastante sobre geração de texto e as ferramentas mais avançadas que a OpenAI disponibiliza
hoje para este propósito. Agora vamos explorar outros campos de utilização da API também de extrema
relevância, começando pelos modelos de geração de imagem.
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
Vocês podem notar que fizemos mais dois imports que serão necessários para conseguirmos visualizar
a imagem gerada. Requests já faz parte da biblioteca padrão, enquanto o PIL (que vem de Pillow) não,
e precisa ser instalado:
pip install Pillow
resposta = client.images.generate(
model=modelo,
prompt=prompt,
size='1024x1024',
quality=qualidade,
Asimov Academy 67
Explorando a API da OpenAI
style=style,
n=1
)
– “dall-e-3”
– “dall-e-2”
– “256x256”
– “512x512”
– “1024x1024”
– “1792x1024”
– “1024x1792”
– “standard”
– “hd”
image_url = resposta.data[0].url
img_data = requests.get(image_url).content
with open(nome_arquivo, 'wb') as f:
f.write(img_data)
Visualizando a imagem
Asimov Academy 68
Explorando a API da OpenAI
image = Image.open(nome_arquivo)
image.show()
Para editar uma imagem, é necessário primeiro criarmos uma máscara. Ela consiste na mesma im-
agem no formato PNG, apenas com a parte que será editada em branco, como podemos observar na
imagem:
Asimov Academy 69
Explorando a API da OpenAI
Asimov Academy 70
Explorando a API da OpenAI
O processo é simples, apenas adicione uma nova imagem. Com o mouse clicado, apage uma parte da
imagem e depois faça o download da mask e da original novamente.
Asimov Academy 71
Explorando a API da OpenAI
image=open('arquivos/imagens/original.png', 'rb'),
mask=open('arquivos/imagens/mask.png', 'rb'),
prompt='Adicone uma vaca e um terneirinho na imagem fornecida',
n=1,
size='1024x1024'
)
image_url = resposta.data[0].url
img_data = requests.get(image_url).content
with open(nome_arquivo, 'wb') as f:
f.write(img_data)
Visualizando a imagem
Asimov Academy 72
Explorando a API da OpenAI
Criando variações
Asimov Academy 73
Explorando a API da OpenAI
image_url = resposta.data[0].url
img_data = requests.get(image_url).content
with open(nome_arquivo, 'wb') as f:
f.write(img_data)
Visualizando a imagem
Asimov Academy 74
Explorando a API da OpenAI
Asimov Academy 75
Explorando a API da OpenAI
Mais uma ferramenta muito poderosa desenvolvida pela OpenAI é o GPT-Vision. Ele é um modelo
híbrido que, além de conseguir gerar texto, pode interpretar imagens. Ou seja, o modelo recebe
imagens e responde perguntas sobre elas. Incrível!
_ = load_dotenv(find_dotenv())
client = openai.Client()
#interpretando a imagem
comando = 'Descreva a imagem fornecida'
url = 'https://upload.wikimedia.org/wikipedia/\commons/thumb/d/dd/Gfp-wisconsin-madison-the-
,→ nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg'
resposta = client.chat.completions.create(
model='gpt-4-vision-preview',
messages=[{
'role': 'user',
'content': [
{'type': 'text', 'text': comando},
{'type': 'image_url', 'image_url': {'url': url}}
]
}]
)
Asimov Academy 76
Explorando a API da OpenAI
A imagem mostra uma paisagem natural serena composta por um céu azul claro com algumas nuvens
,→ esparsas. No primeiro plano, há uma passarela de madeira que se estende através de um
,→ campo de grama alta e verde, sugerindo que talvez seja uma área úmida ou um parque natural
,→ protegido. A passarela parece convidativa, guiando o olhar do espectador através da cena.
,→ A grama verde vibrante de ambos os lados da passarela contrasta com o azul do céu. Ao
,→ fundo, podem ser observadas árvores e arbustos baixos, indicando a presença de um
,→ ecossistema diversificado. A composição da imagem, a luz natural e a paleta de cores vivas
,→ criam uma atmosfera de tranquilidade e beleza natural.
Para enviar uma imagem do seu computador, é necessário antes realizar um encoding para base64:
import base64
def encode_image(caminho_imagem):
with open(caminho_imagem, 'rb' ) as img:
return base64.b64encode(img.read()).decode('utf-8')
caminho = 'celulas.jpg'
base_64_img = encode_image(caminho)
Asimov Academy 77
Explorando a API da OpenAI
resposta = client.chat.completions.create(
model='gpt-4-vision-preview',
messages=[{
'role': 'user',
'content': [
{'type': 'text', 'text': comando},
{'type': 'image_url', 'image_url':
{'url': url}}
]
}],
max_tokens=1000,
)
print(resposta.choices[0].message.content)
Asimov Academy 78
Explorando a API da OpenAI
Essa imagem mostra células que foram marcadas com um corante que destaca seus núcleos. Pela
,→ imagem, parece haver um total de nove núcleos, o que sugere nove células. No entanto, é
,→ importante notar que devido à resolução e ao plano de foco da imagem, algumas células
,→ podem não estar inteiramente visíveis ou podem estar sobrepostas, o que dificulta uma
,→ contagem precisa apenas com base nesta imagem estática.
Agora vamos testar a habilidade do modelo de identificar a palavra escrita. Vamos ver se ele consegue
decifrar este texto:
import base64
def encode_image(caminho_imagem):
with open(caminho_imagem, 'rb' ) as img:
return base64.b64encode(img.read()).decode('utf-8')
caminho = 'escrito_mao_dificil.jpg'
Asimov Academy 79
Explorando a API da OpenAI
base_64_img = encode_image(caminho)
resposta = client.chat.completions.create(
model='gpt-4-vision-preview',
messages=[{
'role': 'user',
'content': [
{'type': 'text', 'text': texto},
{'type': 'image_url', 'image_url':
{'url': f'data:image/jpg;base64,{base_64_img}'}}
]
}],
max_tokens=1000,
)
print(resposta.choices[0].message.content)
Dear Myles,
I am sorry it took me so very long to respond to your letter. I really like your idea. If we
,→ had guns that shot chocolate, not only would our country be safer, it would be happier.
,→ People love chocolate.
Joe Biden
Esta imagem mostra uma carta escrita pelo então vice-presidente Joe Biden para uma criança
,→ chamada Myles, comentando sobre uma ideia relacionada a armas que disparariam chocolate.
Asimov Academy 80
Explorando a API da OpenAI
Já conhecemos as habilidades da API para geração e interpretação de textos e imagens. Agora vamos
para sua última grande aplicação: geração e transcrição de áudios. Comecemos com a geração:
# imports
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
# gera áudio
arquivo = 'fala.mp3'
texto = '''
Python é uma linguagem de programação de alto nível, interpretada de script, imperativa,
,→ orientada a objetos,
funcional, de tipagem dinâmica e forte. Foi lançada por Guido van Rossum em 1991. Atualmente,
,→ possui um modelo
de desenvolvimento comunitário, aberto e gerenciado pela organização sem fins lucrativos
,→ Python Software Foundation.
Apesar de várias partes da linguagem possuírem padrões e especificações formais, a linguagem,
,→ como um todo, não é
formalmente especificada. O padrão na pratica é a implementação CPython.
resposta = client.audio.speech.create(
model='tts-1',
voice='onyx',
input=texto
)
resposta.write_to_file(arquivo)
– “tts-1”
– “tts-1-hd”
– “alloy”
Asimov Academy 81
Explorando a API da OpenAI
– “echo”
– “fable”
– “onyx”
– “nova”
– “shimmer”
E é simples assim! Os resultados do modelo são de ótima qualidade. Pelos meus testes, a voz que se
encaixa melhor com o português do brasil é a “onyx”.
Asimov Academy 82
Explorando a API da OpenAI
Por fim, chegamos à última função disponível na API da OpenAI: a transcrição de áudios. É possível
transcrever áudio de qualquer língua que você quiser, e o modelo reconhecerá o idioma automatica-
mente.
No exemplo, passamos um áudio de uma das nossas aulas e vamos ver como o modelo se comporta:
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
Seja muito bem-vindo ou bem-vinda ao nosso curso completo de Python aqui da Zemove Academy. Eu
,→ e minha equipe ficamos muito felizes que vocês tenham escolhido iniciar no mundo da
,→ programação, especificamente com a linguagem Python, aqui com a gente. Pode ter certeza
,→ que a gente colocou muito carinho e muita dedicação para construir esse material. Além dos
,→ conhecimentos técnicos que a gente vai apresentar sobre a linguagem e programação em si,
,→ eu também coloquei grande parte da minha experiência e minha vivência para compartilhar
,→ com vocês ao longo desse treinamento. Para quem não me conhece ainda, meu nome é Rodrigo
,→ Soares Padeval e eu não sou programador de origem. Na verdade, eu me formei como
,→ engenheiro e eu utilizei a programação dentro da minha carreira no mercado financeiro como
,→ analista de dados. E essa é a grande mágica da programação. Vocês não precisam utilizá-la
,→ única e exclusivamente para desenvolver software. Na verdade, ela pode ser usada para o
,→ que vocês quiserem no dia a dia de vocês, muitas vezes como uma habilidade secundária. Ela
,→ é muito mais ampla e muito mais poderosa do que isso. Programação é, sem sombra de
,→ dúvidas, a habilidade do futuro. Tem gente que já compara e diz que a programação é o novo
,→ inglês. Ou seja, até anos atrás, era necessário que a gente tivesse inglês para poder
,→ entrar no mercado de trabalho. Hoje, com certeza, além do inglês, a gente tem que saber
,→ programar.
O resultado foi ótimo. Entretanto, ele cometeu alguns erros ao se tratar de nomes próprio. Por exemplo,
Asimov Academy virou Zemove Academy e Rodrigo Soares Tadewald virou Rodrigo Soares Padeval.
Fez sentido, mas pode melhorar.
Asimov Academy 83
Explorando a API da OpenAI
)
print(transcricao.text)
Seja muito bem-vindo ou bem-vinda ao nosso curso completo de Python, aqui da Asimov Academy.
,→ Eu e minha equipe ficamos muito felizes que vocês tenham escolhido iniciar no mundo da
,→ programação, especificamente com a linguagem Python, aqui com a gente. Pode ter certeza
,→ que a gente colocou muito carinho e muita dedicação para construir esse material. Além dos
,→ conhecimentos técnicos que a gente vai apresentar sobre a linguagem e programação em si,
,→ eu também coloquei grande parte da minha experiência e minha vivência para compartilhar
,→ com vocês ao longo desse treinamento. Para quem não me conhece ainda, meu nome é Rodrigo
,→ Soares Tadewald e eu não sou programador de origem. Na verdade, eu me formei como
,→ engenheiro e utilizei a programação dentro da minha carreira no mercado financeiro como
,→ analista de dados. E essa é a grande mágica da programação. Vocês não precisam utilizá-la
,→ única e exclusivamente para desenvolver software. Na verdade, ela pode ser usada para o
,→ que vocês quiserem no dia a dia de vocês, muitas vezes como uma habilidade secundária. Ela
,→ é muito mais ampla e muito mais poderosa do que isso. A programação é, sem sombra de
,→ dúvidas, a habilidade do futuro. Tem gente que já compara e diz que a programação é o novo
,→ inglês. Ou seja, até anos atrás, era necessário que a gente tivesse inglês para poder
,→ entrar no mercado de trabalho. Hoje, com certeza, além do inglês, a gente tem que saber
,→ programar.
1
00:00:01,000 --> 00:00:05,000
Seja muito bem-vindo ou bem-vinda ao nosso curso completo de Python,
2
00:00:05,000 --> 00:00:06,500
aqui da Asimov Academy.
3
00:00:06,500 --> 00:00:09,500
Eu e minha equipe ficamos muito felizes que vocês tenham escolhido
4
00:00:09,500 --> 00:00:11,000
iniciar no mundo da programação,
Asimov Academy 84
Explorando a API da OpenAI
6
00:00:14,000 --> 00:00:16,500
Pode ter certeza que a gente colocou muito carinho
7
00:00:16,500 --> 00:00:19,000
e muita dedicação para construir esse material.
8
00:00:19,000 --> 00:00:21,500
Além dos conhecimentos técnicos que a gente vai apresentar
9
00:00:21,500 --> 00:00:24,000
sobre a linguagem e programação em si,
10
00:00:24,000 --> 00:00:27,500
eu também coloquei grande parte da minha experiência e minha vivência
11
00:00:27,500 --> 00:00:30,500
para compartilhar com vocês ao longo desse treinamento.
12
00:00:30,500 --> 00:00:34,000
Para quem não me conhece ainda, meu nome é Rodrigo Soares Tadewald
....
Asimov Academy 85
Explorando a API da OpenAI
Para finalizar, criamos um chatbot com reconhecimento de fala que responde de forma falada tam-
bém.
# pip install --upgrade wheel
from io import BytesIO
from pathlib import Path
import speech_recognition as sr
from playsound import playsound
import openai
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
client = openai.Client()
ARQUIVO_AUDIO = 'fala_assistant.mp3'
recognizer = sr.Recognizer()
def grava_audio():
with sr.Microphone() as source:
print('Ouvindo...')
recognizer.adjust_for_ambient_noise(source, duration=1)
audio = recognizer.listen(source)
return audio
def transcricao_audio(audio):
wav_data = BytesIO(audio.get_wav_data())
wav_data.name = 'audio.wav'
transcricao = client.audio.transcriptions.create(
model='whisper-1',
file=wav_data,
)
return transcricao.text
def completa_texto(mensagens):
resposta = client.chat.completions.create(
messages=mensagens,
model='gpt-3.5-turbo-0125',
max_tokens=1000,
temperature=0
)
return resposta
def cria_audio(texto):
if Path(ARQUIVO_AUDIO).exists():
Path(ARQUIVO_AUDIO).unlink()
resposta = client.audio.speech.create(
model='tts-1',
voice='onyx',
Asimov Academy 86
Explorando a API da OpenAI
input=texto
)
resposta.write_to_file(ARQUIVO_AUDIO)
def roda_audio():
playsound(ARQUIVO_AUDIO)
if __name__ == '__main__':
mensagens = []
while True:
audio = grava_audio()
transcricao = transcricao_audio(audio)
mensagens.append({'role': 'user', 'content': transcricao})
print(f'User: {mensagens[-1]["content"]}')
resposta = completa_texto(mensagens)
mensagens.append({'role': 'assistant', 'content':
,→ resposta.choices[0].message.content})
print(f'Assistant: {mensagens[-1]["content"]}')
cria_audio(mensagens[-1]["content"])
roda_audio()
Asimov Academy 87
Explorando a API da OpenAI
E assim, chegamos ao fim de mais um curso. Esperamos que este conteúdo tenha sido útil para você!
Sinta-se à vontade para compartilhá-lo com seus amigos e, sempre que tiver dúvidas, nos chame nos
comentários das aulas que responderemos prontamente!
Um grande abraço!
Asimov Academy 88