ChatGPT — Respondendo Perguntas sobre o conteudo de um arquivo
Descubra como utilizar o ChatGPT para fazer perguntas sobre arquivos CSV, automatizando processos de análise de dados.

Olá Gente
Este é um dos recursos mais legais do ChatGPT, nele, podemos subir um arquivo, e fazer perguntas sobre este arquivo.
Para exemplo, iremos subir um arquivo CSV, com a listagem dos estados brasileiros e a quantidade de livros (Informação de teste apenas, não é uma informação real):
https://fastupload.io/iqTNM2EUOKi5I3j/file
Segue exemplo do arquivo:

Para este recurso, iremos utilizar o “Assistant” do ChatGPT, então precisamos seguir algumas etapas.
1. Enviar Arquivo
Antes de tudo, precisamos fazer o upload do arquivo para nossa conta na OpenAI.
Iremos utilizar o endpoint “files”:
https://api.openai.com/v1/files
Neste endpoint, temos que enviar um POST com os parâmetros abaixo, em “Multipart” (Não é Json):
- file: O arquivo que será utilizado (Para este exemplo, será enviado uma planilha em CSV)
- purpose: O proposito deste arquivo, neste caso, iremos utilizar “assistants”
Segue exemplo do Post:

A resposta da API será um Json onde o ID do arquivo será enviado no campo “id”:

Neste caso, recebemos o ID:
file-5ELElHgPJPPX5SOiDnhYxTJf
2. Criando o Assistente
Agora precisamos criar um Bot e vincular o arquivo a este Bot.
Iremos utilizar o endpoint “assistants”:
https://api.openai.com/v1/assistants
Neste endpoint, temos que enviar um POST com um Json com alguns parâmetros:
- instructions: Aqui iremos descrever o que o Bot ira fazer
- tools: As ferramentas que iremos utilizar, neste caso, iremos utilizar “retrieval”
- model: O modelo que iremos utilizar, neste caso, iremos utilizar “gpt-4-turbo-preview”
- file_ids: Os ids dos arquivos que iremos utilizar, neste caso, iremos preencher apenas um arquivo, sendo o arquivo que enviamos anteriormente
Para este propósito, iremos definir as instruções como:
Responda perguntas sobre o arquivo anexado
Segue exemplo do Post:
A resposta da API será um Json onde o ID do assistente será enviado no campo “id”:

Neste caso, recebemos o ID:
asst_zUpepe7lkEI2gxPNeJZod0Vm
3. Iniciando uma Conversa
Agora precisamos iniciar uma conversa com o assistente que criamos anteriormente.
No ChatGPT, uma conversa é uma “threads”.
Iremos utilizar o endpoint “threads”:
https://api.openai.com/v1/threads
Neste endpoint, temos que enviar um POST vazio.
A resposta da API será um Json onde o ID da Thread será enviado no campo “id”:

Neste caso, recebemos o ID:
thread_rilb6861j2YJPX28vrDiFmH4
4. Adicionando Pergunta na Thread
Agora que criamos a Thread, precisamos adicionar nossa pergunta nesta Thread.
Iremos utilizar o endpoint “threads/messages”:
https://api.openai.com/v1/threads/[thread_id]/messages
Em nosso teste, teremos o Endpoint completo:
https://api.openai.com/v1/threads/thread_rilb6861j2YJPX28vrDiFmH4/messages
Neste endpoint, temos que enviar um POST com um Json com alguns parâmetros:
- role: Aqui iremos setar como fixo “user”, indicando que é uma pergunta do Cliente
- content: Aqui iremos preencher a pergunta
Para este propósito, iremos definir a pergunta como:
Qual o estado com mais filmes?
Segue exemplo do Post:
A resposta da API será um Json onde o ID da Mensagem será enviado no campo “id”:

Neste caso, recebemos o ID:
msg_Z6q2cPReMnvSxwCZ8NtlgTnq
5. Processando a Thread
Quando adicionamos perguntas em uma Thread, ela não é respondida de forma imediata, precisamos “Executar” a Thread e indicar qual “Assistente” ira executar esta Thread.
Iremos utilizar o endpoint “threads/runs”:
https://api.openai.com/v1/threads/[thread_id]/runs
Em nosso teste, teremos o Endpoint completo:
https://api.openai.com/v1/threads/thread_rilb6861j2YJPX28vrDiFmH4/runs
Neste endpoint, temos que enviar um POST com um Json com alguns parâmetros:
- assistant_id: O ID do Assistente que criamos na etapa 2 deste tutorial
Segue exemplo do Post:
A resposta da API será um Json onde o ID da execução será enviado no campo “id”:

Neste caso, recebemos o ID:
run_Md4oi8s8Dp9rhoK9N9WGRvVK
Este ID será importante para checarmos o STATUS desta execução.
6. Verificando se a Thread foi Processada
Quando uma Thread é processada, ela fica em uma fila de execução.
Então, logo após a Thread ser processada ela entra no status:
queued
Após o processamento finalizar o status ira mudar para:
completed
Para consultarmos o Status, iremos fazer uma GET para:
https://api.openai.com/v1/threads/[thread_id]/runs/[run_id]
Em nosso teste, teremos o Endpoint completo:
https://api.openai.com/v1/threads/thread_rilb6861j2YJPX28vrDiFmH4/runs/run_Md4oi8s8Dp9rhoK9N9WGRvVK
O retorno da API será um Json com os detalhe do processamento, e no elemento “status” temos o status do processamento:

7. Verificando a Resposta de nossa Pergunta
Quando a Thread mudar de status para “completed”, podermos consultar as mensagens desta Thread e ver a resposta.
Para isto, iremos fazer uma GET para:
https://api.openai.com/v1/threads/[thread_id]/messages
Em nosso teste, teremos o Endpoint completo:
https://api.openai.com/v1/threads/thread_rilb6861j2YJPX28vrDiFmH4/messages
O retorno da API será um Json com as mensagens no elemento “data”, o primeiro elemento deste array é a resposta do Assistente:

Neste caso, a resposta foi:
O estado com mais filmes, de acordo com o arquivo, é Tocantins (TO) com 260.000 filmes
Que corresponde a informação de nosso arquivo de teste:

8. Fazendo novas perguntas
Para fazer novas perguntas, precisamos seguir o mesmo ciclo:
- Cadastramos a pergunta em “/v1/threads/[thread_id]/messages”
- Processamos a Thread em “/v1/threads/thread_id]/runs”
- Verificamos quando a Thread for processada em “/v1/threads/[thread_id]/runs/[run_id]”
- Consultando a Resposta em “/v1/threads/[thread_id]/messages”
Ao consultar as mensagens, serão retornadas todas as mensagens anteriores, e a resposta será o primeiro elemento do Array:

Versão Beta
Como o recurso de Assistente esta em Beta, é necessário adicionar uma linha no cabeçalho da solicitação:
- OpenAI-Beta: assistants=v1
Por hoje é isto, queridos desenvolvedores! 👩💼
Até logo! 👋