Engenharia de prompt
Antigamente, eu era Analista de O&M (poucos vão lembrar). Eu sempre fui ótimo para especificar sistemas, verificar a qualidade e testar. Eu nunca fui bom em programação. Com as novidades em termos de IA, comecei a avaliar ferramentas disponíveis que me permitissem ter um programador virtual para me ajudar. Descobri que a ferramenta mudou mas a regra básica é a mesma: a especificação daquilo que desejamos é crucial. Atualmente, essa especificação recebeu o nome de “engenharia de prompt”, que nada mais é do que um conjunto de dicas para saber fazer as demandas para a IA da melhor forma possível.
Neste post, apresento a maneira como, depois de várias tentativas, apresentei um prompt para o SQL Expert (https://chatgpt.com/g/g-m5lMeGifF-sql-expert), que é um ajudante de programação disponível na versão gratuita do ChatGPT. Este prompt é parte de um pequeno sistema que estou criando para testes, destinado a controlar o rateio de despesas entre usuários que usufruem de mesmos serviços.
Segue o prompt que elaborei:
Estou usando banco de dados MariaDB. Vou mostrar a estrutura de 3 tabelas e explicar as triggers que eu preciso que sejam criadas. A primeira tabela é a tbl_percentuais e contém um percentual para cada usuário em cada centro de custo.
CREATE TABLE u655236858_jcoltro.rateio202501_tbl_percentuais (
id int(11) NOT NULL AUTO_INCREMENT,
centro_custo_id int(11) NOT NULL,
usuario_id int(11) NOT NULL,
percentual decimal(5, 4) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX centro_custo_id (centro_custo_id, usuario_id),
INDEX usuario_id (usuario_id),
CONSTRAINT rateio202501_tbl_percentuais_ibfk_1 FOREIGN KEY (centro_custo_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_centros_custo (id) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT rateio202501_tbl_percentuais_ibfk_2 FOREIGN KEY (usuario_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_usuarios (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
AUTO_INCREMENT = 17
AVG_ROW_LENGTH = 16384
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC;
A segunda é a tbl_despesas e contém os valores de despesas a pagar e também já pagas. Cada despesa possui um valor e está vinculada a um centro de custo.
CREATE TABLE u655236858_jcoltro.rateio202501_tbl_despesas (
id int(11) NOT NULL AUTO_INCREMENT,
centro_custo_id int(11) NOT NULL,
nome varchar(255) NOT NULL,
ano int(11) NOT NULL,
usuario_pagante_id int(11) DEFAULT NULL,
mes int(11) NOT NULL,
valor decimal(10, 2) NOT NULL,
PRIMARY KEY (id),
INDEX centro_custo_id (centro_custo_id),
INDEX usuario_pagante_id (usuario_pagante_id),
CONSTRAINT rateio202501_tbl_despesas_ibfk_1 FOREIGN KEY (centro_custo_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_centros_custo (id) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT rateio202501_tbl_despesas_ibfk_2 FOREIGN KEY (usuario_pagante_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_usuarios (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
AUTO_INCREMENT = 4
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC;
A terceira é a tbl_creditos_debitos:
CREATE TABLE u655236858_jcoltro.rateio202501_tbl_creditos_debitos (
id int(11) NOT NULL AUTO_INCREMENT,
despesa_id int(11) NOT NULL,
usuario_id int(11) NOT NULL,
valor decimal(10, 2) NOT NULL,
PRIMARY KEY (id),
INDEX despesa_id (despesa_id),
INDEX usuario_id (usuario_id),
CONSTRAINT rateio202501_tbl_creditos_debitos_ibfk_1 FOREIGN KEY (despesa_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_despesas (id) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT rateio202501_tbl_creditos_debitos_ibfk_2 FOREIGN KEY (usuario_id)
REFERENCES u655236858_jcoltro.rateio202501_tbl_usuarios (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
AUTO_INCREMENT = 1
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC;
A primeira trigger deve ser após inserir na tbl_despesas e deve:
Se o novo usuario_pagante_id for nulo:
- identificar na tbl_percentuais quais são os usuários vinculados ao centro de custo;
- identificar o percentual de participação de cada usuário;
- ratear o valor da despesa de acordo com o percentual de cada usuário;
- adicionar registros na tbl_creditos_debitos, um registro para cada usuário participante, todos os registros com sinal negativo;
- se a soma dos valores negativos da despesa for maior do que o valor da despesa, reduza o valor correspondente ao maior percentual em 1 centavo, para fins de arredondamento;
Se o novo usuario_pagante_id não for nulo:
- identificar na tbl_percentuais quais são os usuários vinculados ao centro de custo;
- identificar o percentual de participação de cada usuário;
- ratear o valor da despesa de acordo com o percentual de cada usuário;
- adicionar registros na tbl_creditos_debitos, um registro para cada usuário participante, todos os registros com sinal negativo;
- se a soma dos valores negativos da despesa for maior do que o valor da despesa, reduza o valor correspondente ao maior percentual em 1 centavo, para fins de arredondamento;
- adicionar um registro na tbl_creditos_debitos no código do usuário pagante, no valor total da despesa, com sinal positivo.
A segunda trigger deve ser após atualizar na tbl_despesas e deve:
Se o novo usuario_pagante_id for nulo:
- excluir todos registros associados àquela despesa na tbl_creditos_debitos;
- identificar na tbl_percentuais quais são os usuários vinculados ao centro de custo;
- identificar o percentual de participação de cada usuário;
- ratear o valor da despesa de acordo com o percentual de cada usuário;
- adicionar registros na tbl_creditos_debitos, um registro para cada usuário participante, todos os registros com sinal negativo;
- se a soma dos valores negativos da despesa for maior do que o valor da despesa, reduza o valor correspondente ao maior percentual em 1 centavo, para fins de arredondamento;
Se o novo usuario_pagante_id não for nulo:
- excluir todos registros associados àquela despesa na tbl_creditos_debitos;
- identificar na tbl_percentuais quais são os usuários vinculados ao centro de custo;
- identificar o percentual de participação de cada usuário;
- ratear o valor da despesa de acordo com o percentual de cada usuário;
- adicionar registros na tbl_creditos_debitos, um registro para cada usuário participante, todos os registros com sinal negativo
- adicionar um registro na tbl_creditos_debitos no código do usuário pagante, no valor total da despesa, com sinal positivo.
Espero que ajude pessoas que estão estudando os mesmos temos. Grande abraço!