Geração de Código com PaLM 2

Jéssica Costa
A Garota do TI
Published in
4 min readOct 9, 2023

Para você que já começou a mexer com a PaLM 2 provavelmente deve já deve ouvido falar do Generative AI Studio da Google Cloud Platform (GCP). Lá você vai encontrar vários recursos para desenvolver com os modelos de LLM disponíveis, seja a própria PaLM 2 ou o LLama, por exemplo. Especificamente a PaLM 2 pode ser utilizada através da PaLM API que você pode utilizar através da Vertex AI. Importante frisar que para este tutorial você precisará ter um projeto na GCP e a ativar a Vertex AI API.

Fonte: Google AI

Um dos mais famosos dos modelos é o text-bison, muito utilizado para os modelos de texto: perguntas, sugestões, instruções, entre outros. Mas além dele, temos outro modelo de texto, o code-bison, que é usado para geração de código de programação. Para utilizar especificamente este modelo na Generative AI Studio, escolha a opção code-bison em Modelo.

Primeira coisa que você perceberá é que para modelo code-bison temos três parâmetros e não cinco como o text-bison. Os três são exatamente iguais, a temperatura, o limite de tokens e o máximo de respostas. A temperatura é relacionada ao grau de aleatoridade da resposta, ou seja quanto mais alta a temperatura mais aleatório, é recomendado valores mais baixos para respostas mais corretas, o padrão costuma ser 0.2. Já o limite de tokens é relacionado a quantidade máxima de saída de texto de uma solicitação. Um token tem cerca de quatro caracteres. O valor padrão é 1024. Já o máximo de respostas é o número máximo de respostas do modelo geradas por comando, em geral o valor padrão é 1. Todos estes parâmetros podem ser alterados.

Como as linguagens que mais utilizo são Python e SQL, as solicitações para o code-bison foram nessas linguagens. Um dos testes que fiz foi com um problema bem comum em soluções para pré-processamento de dados: encontrar padrões de texto. O prompt utilizado foi “Escreva um código em Python para identificar o padrão 01.aabb” somente e solicitei mais de uma solução. Particularmente para este tipo problema eu uso regex. A resposta que ele me retornou foi:


# Resposta 1
import re

def identificar_padrao(texto):
padrao = re.compile(r"01\.[a-f0-9]{4}")
resultado = padrao.search(texto)
if resultado:
return resultado.group()
else:
return None

texto = "01.aabbccdd"
resultado = identificar_padrao(texto)
print(resultado)

# Resposta 2
import re

def identify_pattern(string):
pattern = re.compile(r"01\.[a-f0-9]{4}")
match = pattern.match(string)
if match:
return True
else:
return False

if __name__ == "__main__":
string = "01.aabb"
print(identify_pattern(string)) # True

O segundo experimento foi relacionado a construção de consultas SQL. Para consultas SQL é preciso ser mais específico na construção dos prompts, pois a construção de consultas está ligado ao contexto das tabelas. Um prompt muito genérico vai gerar uma consulta mais genérica, por isso é importante descrever as tabelas. O prompt utilizado e a resposta do modelo para este experimento estão mostradas a seguir.

A tabela Produto possui os campos ident, produto e valor.
A tabela Venda possui os campos ident, data_venda e vendedor.

Preciso dos totais maiores que 200 de vendas por dia e vendedor nos últimos 30 dias.

SELECT 
v.vendedor,
SUM(p.valor) AS total_vendas,
v.data_venda
FROM Venda v
JOIN Produto p ON v.ident = p.ident
WHERE v.data_venda >= DATE_SUB(NOW(), INTERVAL 30 DAY)
AND p.valor > 200
GROUP BY v.vendedor, v.data_venda
HAVING SUM(p.valor) > 200
ORDER BY v.vendedor, v.data_venda;

A resposta da consulta tem um pequeno problema que é relacionado a cláusula WHERE, pois o modelo entendeu que eu pedi o valor maior do que 200. Mas a na verdade eu só gostaria do total maior do que 200. Pensando na solução, mudei a última frase do prompt para “Preciso dos totais diários maiores que 200, por dia e vendedor nos últimos 30 dias”. A solução que ele propôs já foi outra e dessa vez de acordo com o que pedi:

SELECT 
DATE(v.data_venda) AS dia,
v.vendedor,
SUM(p.valor) AS total_diario
FROM Venda v
JOIN Produto p ON v.ident = p.ident
WHERE v.data_venda >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY dia, vendedor
HAVING total_diario > 200
ORDER BY dia, vendedor;

Você pode salvar todos os resultados dos seus prompts no GCS através do Cloud Shell. Para isso é necessário ter um bucket criado no GCS. Para quem tem dúvidas de como criar, use este tutorial do GCS. O código a seguir, rodado no Cloud Shell, salva todas respostas em um arquivo Json e salva em um bucket de mesmo nome do meu projeto na GCP.

MODEL_ID="code-bison"
PROJECT_ID=$DEVSHELL_PROJECT_ID
curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/${MODEL_ID}:predict -d \
$'{
"instances": [
{ "prefix": "Escreva um codigo em python para identificar o padrao 01.aabb."}
],
"parameters": {
"temperature": 0.2,
"candidateCount": 5,
"maxOutputTokens": 1024
}
}' > code_example.json

export PROJECT_ID=$(gcloud config get-value project)
gsutil cp *.json gs://$PROJECT_ID

O modelo code-bison é bem poderoso e fácil de trabalhar, mas como sempre falo código não é só sintaxe de linguagem de programação, é contexto de negócio. Então não adianta achar que um modelo de LLM vai resolver tudo por você, é realmente necessário avaliar a resposta dada, melhorar as solicitações caso a resposta não seja adequadaou até corrigir o código. Lembre-se: é um modelo de IA, ele aprende probabilidades, a visão crítica da pessoa que desenvolve é sempre necessária.

Referências:
https://ai.google/discover/palm2/
https://developers.generativeai.google/products/palm

--

--

Jéssica Costa
A Garota do TI

Mestre em Ciência da Computação, GDE em Machine Learning e Cientista de Dados