O chatgpt aprovado pelo jurídico
Olá!
O motivador desse texto foi: E se fosse possível rodar uma versão lite do chatgpt localmente via código open source?
Após algumas pesquisas aqui e ali, abaixo eu documento o resultado das minhas descobertas.
Contexto
O modelo original do chatgpt-3 da OpenAI é muito grande (176 bilhões de parâmetros e custa cerca 3 milhões de dólares por mês de custos de nuvem, para ser mais exato).
Porém, o que aconteceria se alguém fizesse um modelo de LLM mais enxuto, porém, que tivesse sido treinado com 1 milhão de parâmetros, no qual esses parâmetros fossem o output do próprio chatgpt-3 (ao invés de usar a internet toda até 2021 que nem o LLM original), porém, que tivesse custado cerca de 1500 dólares de custo total de treinamento?
Essa é a ideia do chatgpt4all, disponível aqui.
Meu intuito com esse texto não é fazer um deep dive em todos os detalhes técnicos do modelo em si (até porque não é minha especialidade), porém, se você consegue ler e entender esse tipo de paper, a explicação do time que fez o modelo está aqui. O gpt4all é open source e pode ser modificado caso você queira.
Como usa?
Vamos a um breve tutorial técnico de como conseguir testar esse modelo localmente. Basicamente, é baixar o binário do modelo treinado (aqui). Após o download, clone o repositório que eu mencionei acima, cole o arquivo baixado na pasta chat dentro do repositório clonado e rode um comando baseado no seu sistema operacional (mais detalhes na documentação do repositório no github). Sério, é só isso.
Ao executar na minha máquina, o resultado do load do modelo foi o seguinte (estou usando um Lubuntu):
Basicamente, o modelo é carregado para a memória (o arquivo binário tem cerca de 4GB, então espere um uso similar de quantidade de RAM). Após isso, eu pedi para gerar o seguinte prompt:
generate a js example of fizzbuzz
E foi ai que eu me dei conta que meu notebook pessoal talvez esteja meio velho, coitado. Eu estou usando um notebook I7, com 8GB de RAM e 256 GB SSD. Ao executar esse prompt simples, esse foi o resultado por alguns longos 5 minutos:
(Se você não conhece, o htop é o gerenciador de tarefas do Linux).
100% de uso de recursos computacionais talvez seja um problema para usar isso no dia-a-dia. O meu primeiro aprendizado com esse benchmark foi que talvez eu tenha que comprar um notebook melhor.
Output-gpt4all
O output (literal) após alguns minutos de processamento foi o abaixo:
function generateFizzBuzzer(num) { // function to be called recursively for each number in range [1, num]
if (parseInt(Math.floor((num - 2)/5)) % 3 === 0 || parseInt(Math.ceil((num + 4/5)))%5===0){//checks whether the current value is divisible by either of these two numbers and prints it out with a space
console.log("FizzBuzz"); //prints Fizzbuzz if both conditions are true, otherwise just outputs num without any spaces or punctuation marks
} else {
var i = parseInt(Math.floor((num -2)/5));//calculates the number of times to print out "FizzBuzz" for each value in range [1..n] and prints it accordingly, starting from index (i) with a space before num itself if necessary
while ((parseInt( Math.ceil((i+4/5))) % 3 ===0 || parseInt(Math.floor((num + i*2-9))%5===0)){//checks whether the current value is divisible by either of these two numbers and prints it out with a space
console.log("FizzBuzz"); //prints Fizzbuzz if both conditions are true, otherwise just outputs num without any spaces or punctuation marks
} else { i++;//increments the index (i) for each value in range [1..n] and prints it accordingly with a space before num itself if necessary
console.log(num); //prints out number n, starting from current position of "FizzBuzz"
}
};
}
Feio. Para dizer o mínimo. Limpando os comentários, foi ai que eu me dei conta que o gpt4all gerou um while else. Alguns podem chamar de inovação sintática, porém, é só incorreto mesmo. Se você ficou com preguiça de limpar o código, abaixo está o resultado sem os comentários:
function generateFizzBuzzer(num) {
if (parseInt(Math.floor((num - 2)/5)) % 3 === 0 || parseInt(Math.ceil((num + 4/5)))%5===0){
console.log("FizzBuzz");
} else {
var i = parseInt(Math.floor((num -2)/5));
while ((parseInt( Math.ceil((i+4/5))) % 3 ===0 || parseInt(Math.floor((num + i*2-9))%5===0))
{
console.log("FizzBuzz");
} else { i++;
console.log(num);
}
};
};
Além de mais complicado do que precisa ser, tá um pouco feio.
Output — OpenAI
Para fins de benchmark, eu rodei o mesmo prompt no chatgpt oficial:
Simples e direto. Inclusive, a lógica está correta. Porém, na versão gratuita pode demorar para gerar o resultado algumas vezes e ocasionalmente fica fora do ar (além de você estar retroalimentando o modelo e deixando a OpenAI mais poderosa no processo).
Output — Wrapper
E eu também uso de vez em quando um outro site que é simplesmente um wrapper para o original, quando o oficial tá fora do ar. O resultado usando esse método foi esse:
Eu não tenho muita confiança nesse wrapper, mas, para fins desse benchmark, serve. Devido a essa desconfiança, não vou deixar o link aqui nesse texto por questões de segurança.
A título de curiosidade, um padrão que observei em ferramentas wrapper do chatgpt (tanto a local quanto a alternativa) é que nenhuma delas funciona muito bem com a questão contextual (basicamente, é uma feature que faz o modelo entender o contexto do que você tá perguntando pra ele). Esse feature gera o senso de continuidade de uma conversa que só é mais perceptível no modelo da OpenAI mesmo.
Para finalizar, porque eu me dei o trabalho de escrever esse texto?
Simples: Razões Jurídicas. Eu vi muitas discussões nos últimos tempos sobre como pode dar problemas para pessoas desenvolvedoras fornecer código para modelos de IA (gerando problemas de copyright ou vazamentos de dados sensíveis, por exemplo), podendo até ocasionar demissões em alguns desavisados.
Em teoria, o chatgpt4all não alimenta nenhuma base externa (ele roda offline, eu testei). Então, tecnicamente, é como se você estivesse rodando um programa comum no seu computador, com licença de uso livre e que apesar de um pouco limitado e grande utilizador de recursos do seu computador, pode te ajudar no dia-a-dia para alguns casos de uso. E caso você use como prompt algum código com alguma chave sensível que você esqueceu de tirar, deveria estar tudo bem.
Logo, se você é como eu e valoriza ética, fica a dica de como surfar essa mudança tecnológica sem maiores problemas. Espero que esse tipo de ferramenta standalone se torne mais acessível em um futuro próximo (dado como o assunto está evoluindo ultimamente, espero que não demore muito).
Espero que esse texto tenha sido útil para você.
Até!
Você gostou do conteúdo e gostaria de fazer mentoria comigo? Clique aqui e descubra como.