Como as respostas do código do ChatGPT me deixaram bêbado

Jan 07 2023
O ChatGPT me ajudou a raspar sites de coquetéis para criar um índice universal de bebidas. Ultimamente, tenho me tornado fã de fazer coquetéis.

O ChatGPT me ajudou a raspar sites de coquetéis para criar um índice universal de bebidas.

Esta imagem foi gerada com DALL-E, obviamente.

Ultimamente, tenho me tornado fã de fazer coquetéis. Depois de obter o melhor equipamento e bebida que o dinheiro pode comprar, percebi que o principal obstáculo para mim eram as receitas de coquetéis. Eu queria uma plataforma onde pudesse inserir os ingredientes que tenho em casa e o resultado fosse uma lista de coquetéis que eu poderia fazer. Existem alguns aplicativos para isso, mas eles são limitados em sua variedade, a menos que você pague pelo aplicativo. E como a única coisa que gosto mais do que coquetéis são coquetéis gratuitos , estava procurando uma alternativa.

Foi cerca de uma semana após o lançamento do ChatGPT e ele já havia se tornado meu melhor amigo. Também poderia ser meu companheiro de bebida? Percebi que muitas receitas estavam disponíveis online e só precisava indexá-las corretamente. O ChatGPT pode criar uma ferramenta para eu indexá-los por conta própria?

TLDR — sim, aqui está o repositório do GitHub . Existem até READMEs gerados pelo ChatGPT.

O plano

Eu decidi tentar. Eu queria usar o ChatGPT para construir um sistema simples para indexar coquetéis da web. A solução teria duas partes:

  1. Rastreador — um processo que faz com que um domínio rastreie e gere URLs que parecem ser receitas de coquetéis para uma fila. Ele também segue URLs adicionais na página recursivamente para pesquisar outras páginas com receitas. Isso parecia uma tarefa fácil o suficiente para permitir que o ChatGPT codificasse por conta própria
  2. Indexador — Este componente destina-se a obter uma URL, determinar se a página contém uma receita de coquetel e armazená-la em um banco de dados. O problema é que os blogs com receitas de coquetéis são altamente desestruturados e têm muito texto desnecessário antes de chegar ao ponto. O ChatGPT pode me ajudar a entender essa bagunça?

Depois de revisar suas sugestões, decidi usar o RabbitMQ, pois já tinha alguma experiência com ele. Pedi ao ChatGPT para estabelecer as bases para mim:

Com o projeto montado, o próximo passo foi o ChatGTP desenvolver o crawler.

O rastreador

Pedi ao ChatGPT para fazer o trabalho para mim e, cara, ele entregou:

Quando executei o programa, me deparei com dois problemas. Primeiro, os URLs visitados não eram armazenados em cache e, como quase todas as páginas estavam vinculadas à página inicial, acabávamos em um loop infinito. Pedi ao ChatGPT para lidar com isso e modificou o código corretamente:

Infelizmente, não posso recriar essa resposta para capturá-la em uma resolução melhor.

O segundo problema foi que ele também começou a rastrear outros domínios - por exemplo, para uma página que contém um vídeo, o rastreador também começou a rastrear o youtube. Pedi ao ChatGTP para consertar isso também, e ele obrigou:

E foi isso! O rastreador estava pronto e a próxima etapa era codificar o indexador.

Saída do rastreador. Existem alguns erros na identificação de receitas - a próxima etapa tratará disso.

O Indexador

Como mencionei antes, analisar o conteúdo de uma página da Web para identificar se ela descreve uma receita de coquetel é um desafio. Aqui está um exemplo de uma página da web de receitas de coquetéis:

É quase impossível lidar com todos os diferentes casos de uso para analisar a página e extrair os ingredientes. Mais uma vez - ChatGPT para o resgate!

Encontrei uma implementação python não oficial da API ChatGPT e decidi usá-la em meu indexador. A ideia era simples, usando um prompt bem elaborado, eu deveria conseguir usar o ChatGPT para extrair os ingredientes da página do coquetel. Como o ChatGPT não tem acesso à Internet, ele não conseguiu codificar esta parte, mas me ajudou com os componentes genéricos dela. Aqui está o código que usei:

import pika
import time
import sys
import requests
from bs4 import BeautifulSoup
from revChatGPT.revChatGPT import Chatbot
from db import CocktailRecipe, Ingredient, session
import traceback

print(sys.argv)
config = {
    "session_token": sys.argv[1],
    "cf_clearance": sys.argv[2],
    "user_agent": sys.argv[3]
}

chatbot = Chatbot(config, conversation_id=None)

# connect to RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# create a queue to consume messages from, if it does not already exist
channel.queue_declare(queue='drink_urls', durable=True)

QUESTION = """
    From the following text below, please understand if it is an article
    describing a cocktail recipe. If it is, output the following: The first
    line should be: "<cocktail name>: <ranking>". If the ranking doesn't exist
    output "-". use only lowercase letters and the generic name of the cocktail
    , without mentioning brands. the following lines contain the ingredients:
    each line should contain one ingredient and it's amount in the format
    "<ingredient>: <amount>". The ingredient part (before the semicolon)
    should contain only the ingredient name, not the amount. If it is not a
    cocktail recepie, output only the word "no". Output the ingredients in 
    their generic name, and don't include a brand. For example, instead of 
    "bacardi white rum" output "white rum". All of the output should be lower
    cased, don't capitalize any word. The text is: %s"""

# define a callback function to process incoming messages
def process_message(ch, method, properties, body):
    time.sleep(5)
    try:
        print(body)
        page = requests.get(body)
        soup = BeautifulSoup(page.content, "html.parser")
        
        response = chatbot.get_chat_response(QUESTION % soup.text, output="text")['message']
        if response == "no":
            print("not a cocktail")
            return
        print(response)
    except Exception:
        print(traceback.format_exc())

# consume messages from the queue, using the callback function to process them
channel.basic_consume(queue='drink_urls', on_message_callback=process_message, auto_ack=True)

# start consuming messages
channel.start_consuming()

Agora eu só tinha que armazená-lo em um banco de dados. Pedi ao ChatGPT para criar o banco de dados para mim:

Em seguida, dei a ele uma entrada de amostra gerada por ele mesmo e pedi que escrevesse o código para inserir as informações no banco de dados. A implementação inicial fornecida estava usando psycopg2. Pedi para usar SQLAlchemypois acho mais fácil trabalhar com um ORM:

Observe que o ChatGPT codificou a lógica de análise de sua resposta para mim também

Integrei esse código no indexador e finalmente tive o banco de dados de coquetéis dos meus sonhos!

saída de exemplo do processo do indexador
Uma visão do meu banco de dados de coquetéis

Em seguida, usarei o ChatGPT para me ajudar a criar uma API e uma interface do usuário para navegar no banco de dados de coquetéis e escolher o que quero fazer hoje.

Conclusão

Todo esse projeto me levou cerca de 3 horas de ponta a ponta. A capacidade do ChatGPT de acelerar meu processo de desenvolvimento me surpreendeu. A maior vitória foi a análise de texto que o ChatGPT forneceu, o que eu não poderia fazer sozinho, e o ChatGPT simplificou.

No entanto, quanto mais complexa uma tarefa se torna, as chances de o ChatGPT executá-la corretamente diminuem drasticamente. Ao emparelhar com o ChatGPT, ainda é trabalho do desenvolvedor dividir o trabalho em tarefas pequenas o suficiente para engolir, pelo menos por enquanto.

Estou animado para ver o que vem a seguir!

Pedi ao ChatGPT para reescrever a conclusão. Quem fez melhor?

DrinkIndex parte II está fora! Confira aqui .