paint-brush
Como testar múltiplas variações de prompts de IA generativospor@raymondcamden
4,006 leituras
4,006 leituras

Como testar múltiplas variações de prompts de IA generativos

por Raymond Camden13m2024/03/24
Read on Terminal Reader

Muito longo; Para ler

Em quase todas as minhas explorações recentes da IA generativa, percebi como os prompts são importantes. Isso não necessariamente me traduziu em escrever prompts melhores o tempo todo, mas estar ciente do problema é pelo menos um passo para corrigi-lo, certo? Uma das coisas que pensei que me ajudaria pessoalmente seria ter uma ferramenta para comparar e contrastar rapidamente diferentes prompts. Obviamente, eu poderia simplesmente abrir várias abas em um navegador, mas eu realmente queria algo mais direto e simplificado para meus propósitos. Com isso em mente, deixe-me compartilhar o que construí.
featured image - Como testar múltiplas variações de prompts de IA generativos
Raymond Camden HackerNoon profile picture

Em quase todas as minhas explorações recentes da IA generativa, percebi como os prompts são importantes. Isso não necessariamente me traduziu em escrever prompts melhores o tempo todo, mas estar ciente do problema é pelo menos um passo para corrigi-lo, certo? Uma das coisas que pensei que me ajudaria pessoalmente seria ter uma ferramenta para comparar e contrastar rapidamente diferentes prompts.


Obviamente, eu poderia simplesmente abrir várias abas em um navegador, mas eu realmente queria algo mais direto e simplificado para meus propósitos. Com isso em mente, deixe-me compartilhar o que construí.

Testador de prompt

Prompt Tester é minha ferramenta com um nome incrivelmente criativo para... hum... testar prompts. Começa com um prompt:


Aplicativo da web Prompt Tester com um prompt vazio


A ideia é inserir seu prompt inicial e clicar uma ou mais vezes para adicionar mais prompts. Quando estiver pronto, basta clicar em "Gerar Resultados":


Aplicativo da web Prompt Tester com dois prompts e resultados


Antes de mostrar alguns exemplos de resultados, deixe-me falar um pouco sobre como ele foi construído.

O código

O backend é um servidor Node.js incrivelmente simples que lida com o lançamento do HTML estático e responde às solicitações da API front-end. Mais uma vez, agradeço a Todd Sharp por compartilhar seu código inicial comigo. Aqui está a parte chata de manuseio simples:


 async function handler(req, res) { console.log('Entered handler.', req.method, req.url); if(req.method === 'GET' && req.url.indexOf('favicon.ico') === -1) { res.writeHead(200, { 'Content-Type':'text/html' }); res.write(fs.readFileSync('./demo.html')); res.end(); } else if(req.method === 'POST' && req.url === '/api') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', async () => { body = JSON.parse(body); console.log('BODY:\n', JSON.stringify(body, null, '\t')); let result = await callGemini(body.prompt); res.writeHead(200, { 'Content-Type':'application/json' }); res.write(JSON.stringify(result)); res.end(); }); } } const server = http.createServer(handler); server.listen(3000); console.log('Listening on port 3000');


E a parte callGemini que apenas passa o prompt para a API Gemini do Google. Em teoria, isso poderia ser alterado para ChatGPT ou qualquer outro serviço.


 const MODEL_NAME = "gemini-pro"; const API_KEY = process.env.GOOGLE_AI_KEY; const genAI = new GoogleGenerativeAI(API_KEY); const model = genAI.getGenerativeModel({ model: MODEL_NAME }); async function callGemini(text) { const generationConfig = { temperature: 0.9, topK: 1, topP: 1, maxOutputTokens: 2048, }; const safetySettings = [ { category: HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, { category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, }, ]; const parts = [ {text}, ]; const result = await model.generateContent({ contents: [{ role: "user", parts }], generationConfig, safetySettings, }); try { if(result.response.promptFeedback && result.response.promptFeedback.blockReason) { return { error: `Blocked for ${result.response.promptFeedback.blockReason}` }; } const response = result.response.candidates[0].content.parts[0].text; return { response }; } catch(e) { // better handling return { error:e.message } } }


Tenho orgulho de dizer que agora estou, finalmente, lidando com alguns erros básicos e tentando expor ao usuário (eu) por que um prompt foi bloqueado.

O front-end é relativamente simples. Usei Milligram para o CSS principal (de novo, obrigado Todd) e um pouco de JavaScript básico para adicionar novos prompts e fazer as chamadas. Aqui está o HTML (sem o CSS embutido):


 <h1>Prompt Tester</h1> <p> This tool helps you see the result of multiple prompts at the same time. The idea is to use similar prompts with different phrasing to see how it impacts the result. </p> <div id="prompts"> </div> <template id="promptRow"> <div class="row"> <div class="column column-33"><textarea placeholder="Enter your prompt."></textarea></div> <div class="column column-67 result"></div> </div> <hr> </template> <div class="float-right"> <button id="addPrompt">Add Prompt</button> <button id="generateResults">Generate Results</button> </div>


E então o JavaScript. Observe que usei <template> acima para lidar com o layout do prompt. Esta é a primeira vez que uso essa tag e foi relativamente fácil.


 let $template, $prompts, $addPromptsBtn, $generateResultsBtn; let promptCount = 0; document.addEventListener('DOMContentLoaded', init, false); async function init() { $addPromptsBtn = document.querySelector('#addPrompt'); $addPromptsBtn.addEventListener('click', addPrompt, false); $generateResultsBtn = document.querySelector('#generateResults') $generateResultsBtn.addEventListener('click', generateResults, false); $template = document.querySelector('#promptRow'); $prompts = document.querySelector('#prompts'); addPrompt(); } function addPrompt() { promptCount++; const newPrompt = $template.content.cloneNode(true); $prompts.append(newPrompt); } async function generateResults() { // disable add prompt and generate $addPromptsBtn.setAttribute('disabled', 'disabled'); $generateResultsBtn.setAttribute('disabled', 'disabled'); let $results = document.querySelectorAll('div.result'); // clear any previous results $results.forEach(r => r.innerHTML = ''); /* gather prompts from the inputs */ let prompts = []; let $fields = document.querySelectorAll('#prompts textarea'); for(f of $fields) prompts.push(f.value); let promises = []; for(p of prompts) promises.push(getResult(p)); let results = await Promise.all(promises); // assign results to result area for each, handle errors - later // there's a one to one correspondance between our array of results and the result div for(let i=0;i<results.length;i++) { if(results[i].response) $results[i].innerHTML = marked.parse(results[i].response); else if(results[i].error) $results[i].innerHTML = `<strong>Error with Prompt: </strong> ${results[i].error}`; } $addPromptsBtn.removeAttribute('disabled'); $generateResultsBtn.removeAttribute('disabled'); } async function getResult(p) { console.log('get result for',p); // quick return on empty prompt if(p.trim() === '') return { response:'<strong>Enter a prompt.</strong>' }; let req = await fetch('/api', { method:'POST', body: JSON.stringify({prompt:p.trim()})}); let result = await req.json(); return result; }


Acho que tudo isso é manipulação de DOM e chamada de API muito simples, mas definitivamente me avise em um comentário abaixo se algo não fizer sentido. Observe que eu disparo todas as minhas chamadas de API de uma vez e Promise.all espera que elas terminem.


Além disso, observe que uso a biblioteca marked . Os resultados do Google normalmente têm Markdown, e isso ajuda a renderizá-los bem em meu pequeno aplicativo da web.

Tudo isso não é muito interessante, eu acho, mas vamos dar uma olhada em alguns testes. Como eu disse, sabia que o estilo do prompt era importante. Tê-lo apresentado diretamente a mim em uma ferramenta foi um grande avanço para reforçar isso.

Resultado da Amostra - Gravidade

Vamos começar com uma ideia simples – explicar a gravidade, mas para diferentes faixas etárias. Devido ao grande tamanho dos resultados, usarei um pouco de CSS aqui para ajudar a manter as coisas normais.


Dica: explique-me a gravidade, mas torne-a apropriada para uma criança da 1ª série

A gravidade é um superpoder que nosso planeta possui! É como uma força invisível que faz com que tudo na Terra fique no chão.

Imagine que você tem uma bola na mão. Quando você deixa cair, o que acontece? Ele cai, certo? Isso é por causa da gravidade. A gravidade puxa a bola em direção ao centro da Terra e ela cai no chão.


A gravidade também é o que nos mantém no chão. É o que mantém nossos pés firmemente plantados na Terra e nos impede de flutuar!

A gravidade é uma força muito importante. Ele mantém tudo no lugar e ajuda as coisas a funcionarem da maneira que funcionam. Sem gravidade, estaríamos todos flutuando no espaço e as coisas seriam muito caóticas!


Esta é uma maneira divertida de pensar sobre a gravidade: imagine que a Terra é um ímã gigante e que tudo na Terra é feito de metal. O ímã puxa os objetos de metal em sua direção e é isso que os mantém no chão.


A gravidade é uma força muito importante e interessante. É uma das coisas que torna o nosso planeta um lugar tão único e especial para se viver!


Dica: explique a gravidade para mim, mas torne-a apropriada para uma criança da 7ª série

Imagine que você está brincando com uma bola. Você joga para o alto e ele volta para você. Isto é por causa da gravidade. A gravidade é uma força que puxa as coisas umas em direção às outras. É o que te mantém no chão e o que faz as coisas caírem.


A quantidade de gravidade entre dois objetos depende de sua massa. Quanto mais massa um objeto tiver, mais forte será sua gravidade. É por isso que coisas como planetas e estrelas têm mais gravidade do que coisas como pessoas e carros.


A gravidade também é o que mantém os planetas em órbita ao redor do sol. A gravidade do Sol é muito mais forte que a da Terra, por isso puxa a Terra em sua direção. Isso mantém a Terra se movendo em círculo ao redor do sol.


A gravidade é uma força muito importante em nosso universo. Ele mantém as coisas no lugar e faz as coisas se moverem. Sem gravidade, os planetas voariam para o espaço e todos nós flutuaríamos.


Aqui estão algumas curiosidades sobre a gravidade:

  • A gravidade é responsável pelas marés. A gravidade da lua atrai os oceanos da Terra, fazendo-os subir e descer.


  • A gravidade é a razão pela qual temos uma atmosfera. Sem gravidade, o ar simplesmente flutuaria no espaço.


  • A gravidade é o que nos permite andar. Quando andamos, nossos pés empurram o chão e o chão empurra para trás. Isto é o que nos impulsiona para frente.


  • A gravidade é a razão pela qual não flutuamos no espaço. A gravidade da Terra nos puxa para o seu centro, mantendo-nos no chão.


Observe o erro de digitação no prompt abaixo. Gêmeos lidou bem com isso.


Dica: explique a gravidade para mim, mas torne-a apropriada para um estudante em idade universitária


Gravidade: a força da atração

A gravidade é uma força fundamental no universo responsável por manter os corpos celestes, como planetas, luas e estrelas, em movimento. É também o que nos mantém firmemente plantados no chão e permite que os objetos caiam ao serem derrubados.


Lei da Gravitação Universal de Newton:

A lei da gravitação universal afirma que cada objeto no universo atrai todos os outros objetos com uma força proporcional ao produto de suas massas e inversamente proporcional ao quadrado da distância entre eles. Matematicamente, pode ser expresso como:

F = Gm1m2/r^2


Onde:

F é a força gravitacional entre dois objetos. G é a constante gravitacional (6,674 × 10^-11 N m^2/kg^2). m1 e m2 são as massas dos dois objetos. r é a distância entre os centros dos dois objetos.


Significado da Gravidade:

  1. Mantém os corpos celestes em órbita: A atração gravitacional dos corpos celestes maiores mantém os menores girando em torno deles. Por exemplo, a gravidade da Terra mantém a Lua em órbita, enquanto a gravidade do Sol mantém a Terra e outros planetas nas suas respectivas órbitas.


  2. Responsável pelas Marés: A gravidade entre a Terra e a Lua causa as marés oceânicas. À medida que a Lua orbita a Terra, a sua atração gravitacional cria uma protuberância na água do oceano no lado voltado para a Lua. Outra protuberância se forma no lado oposto da Terra devido às forças inerciais. À medida que a Terra gira, essas protuberâncias se movem pela superfície do planeta, resultando em marés altas e baixas.


  3. Mantém os Objetos na Terra: A gravidade puxa os objetos em direção ao centro da Terra, impedindo-os de flutuar. Esse fenômeno nos permite andar, ficar de pé e interagir com nosso ambiente.


  4. Formação de Estrelas e Galáxias: A gravidade desempenha um papel crucial na formação de estrelas e galáxias. O colapso gravitacional de enormes nuvens de gás e poeira leva à criação de novas estrelas. Da mesma forma, a atração gravitacional das galáxias as mantém unidas, evitando que se dispersem.


  5. Teoria da Relatividade: A teoria da relatividade geral de Albert Einstein fornece uma compreensão mais abrangente da gravidade. Explica que a gravidade não é uma força, mas sim uma curvatura do espaço-tempo causada pela presença de massa ou energia. Essa curvatura afeta o movimento dos objetos, fazendo com que sigam caminhos curvos em vez de linhas retas.


Concluindo, a gravidade é uma força fundamental responsável por manter os corpos celestes em movimento, as marés e o comportamento dos objetos na Terra. É um fenómeno complexo que tem sido extensivamente estudado ao longo dos séculos e que continua a fascinar cientistas e investigadores até hoje.

Resultado da Amostra - Animais de Estimação

Para meu segundo teste, comecei com um prompt básico e depois uma versão melhor que pedia tipos específicos de detalhes: (Nota editorial rápida - os dados tabulares abaixo estão um pouco confusos, mas não estavam confusos na saída original.)


Dica: por que os gatos são muito melhores que os cães?

Cães e gatos são animais de estimação populares e não há uma resposta definitiva para a questão de qual deles é o melhor. Tanto os cães quanto os gatos têm seu próprio conjunto de vantagens e desvantagens, e o melhor animal de estimação para você dependerá de suas necessidades e preferências individuais.


Algumas pessoas preferem gatos porque geralmente são mais independentes que os cães. Os gatos geralmente ficam felizes em se divertir e não precisam ser passeados ou levados para fora para fazer exercícios. Isso pode ser uma grande vantagem para quem mora em apartamento ou tem agenda lotada.


Os gatos também são conhecidos por serem animais limpos e arrumados. Eles se limpam regularmente e normalmente usam a caixa sanitária sem problemas. Isso pode ser uma grande vantagem para quem não quer lidar com a bagunça e o cheiro de um cachorro.


Claro, também existem algumas desvantagens em ter um gato. Os gatos podem ser mais caros que os cães e podem ser mais difíceis de treinar. Os gatos também são mais propensos a arranhar móveis e outros utensílios domésticos.


Em última análise, a decisão de comprar um gato ou um cachorro é pessoal. Não existe resposta certa ou errada, e o melhor animal de estimação para você dependerá de suas necessidades e preferências individuais.


Aqui está uma tabela que resume as principais diferenças entre cães e gatos:

Característica

Gato

Cachorro

Independência

Mais independente

Menos independente

Necessidades de exercício

Não precisa ser caminhado ou levado para fora

Precisa ser caminhado ou levado para fora

Limpeza

Limpa-se regularmente

Precisa tomar banho regularmente

Treinamento

Pode ser difícil de treinar

Mais fácil de treinar

Coçar

Pode riscar móveis e outros utensílios domésticos

Normalmente não risca móveis

Custo

Mais caro

Menos caro


Dica: por que os gatos são muito melhores que os cães? explique com uma lista de motivos que cobrem o bem-estar emocional e aspectos financeiros


Bem-estar emocional:

  • Independência: Os gatos são mais independentes que os cães, o que pode ser bom para quem deseja um animal de estimação que não exija muita atenção.


  • Baixa manutenção: Os gatos geralmente exigem menos manutenção do que os cães. Eles não precisam ser passeados ou escovados com tanta frequência e podem ser deixados sozinhos por longos períodos de tempo.


  • Silencioso: Os gatos geralmente são mais silenciosos que os cães, o que pode ser ideal para pessoas que moram em apartamentos ou têm vizinhos sensíveis ao ruído.


  • Terapêutico: Estudos demonstraram que os gatos podem ter um efeito calmante nos humanos e podem ajudar a reduzir o estresse e a ansiedade.


Aspectos financeiros:

  • Custo mais baixo: Os gatos geralmente são mais baratos do que os cães. Eles comem menos, precisam de menos visitas ao veterinário e não exigem tantos cuidados.


  • Mais fácil de viajar: É mais fácil viajar com gatos do que com cães. Eles podem ser transportados em uma transportadora e não precisam ser caminhados ou exercitados enquanto você estiver fora.


  • Vida útil mais longa: Os gatos têm uma vida útil mais longa do que os cães, em média. Isso significa que você poderá desfrutar da companhia do seu gato por muitos anos.

Resultado da Amostra - Solicitação de Cadeia de Pensamento

O teste a seguir veio de uma excelente apresentação do AWS re:Invent: AWS re:Invent 2023 - Prompt Engineering Best Practices for LLMs on Amazon Bedrock (AIM377) . Encontrei muitos conselhos excelentes nesta sessão, incluindo uma boa visão geral dos prompts da Cadeia de Pensamento, onde a ideia é fornecer informações sobre as etapas usadas para resolver um problema para ajudar o mecanismo GenAI a resolver melhor um prompt.


Agora, o exemplo dado naquela apresentação foi assim:


 Q: Roger has 5 tennis balls. he buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does he have now? A: The answer is 11. Q. The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?


Na apresentação, o modelo em uso retornou incorretamente 27. Em meu teste, funcionou corretamente, mas eu certamente vi problemas com matemática quando criei minha demonstração generativa de conselhos de blackjack de IA em novembro passado.


Como eu disse, Gemini lidou bem com isso: A: The answer is 9. Mas no Prompt Tester, tentei o prompt CoT sugerido:


 Q: Roger has 5 tennis balls. he buys 2 more cans of tennis balls. Each can has 3 tennis balls. How many tennis balls does he have now? A: Roger started with 5 balls. 2 cans of 3 tennis balls each is 6 tennis balls. 5 + 6 = 11. The answer is 11. Q. The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many apples do they have?


E o resultado foi melhorado, mostrando como chegou à resposta:


 A: The cafeteria had 23 apples. They used 20 apples for lunch, which means they have 3 apples left. They then bought 6 more apples, so they now have a total of 3 + 6 = 9 apples. The answer is 9.

A diferença é bastante significativa.

O código

Se isso parecer útil para você, sinta-se à vontade para obter o código aqui: https://github.com/cfjedimaster/ai-testingzone/tree/main/prompt_tester . Como mencionei, não deveria ser tão difícil adicionar callChatGPT ou algo parecido e usar um serviço diferente. Se você fizer isso, me avise!