paint-brush
Comment tester plusieurs variantes d'invites d'IA générativepar@raymondcamden
4,006 lectures
4,006 lectures

Comment tester plusieurs variantes d'invites d'IA générative

par Raymond Camden13m2024/03/24
Read on Terminal Reader

Trop long; Pour lire

Dans presque toutes mes récentes explorations de l’IA générative, j’ai réalisé à quel point les invites sont importantes. Cela ne m'a pas nécessairement amené à écrire de meilleures invites à tout moment, mais être conscient du problème est au moins une étape vers sa correction, n'est-ce pas ? L’une des choses qui, à mon avis, m’aiderait personnellement serait de disposer d’un outil permettant de comparer et de contraster rapidement différentes invites. Évidemment, je pouvais simplement ouvrir plusieurs onglets dans un navigateur, mais je voulais vraiment quelque chose de plus direct et simplifié pour mes besoins. Dans cet esprit, permettez-moi de partager ce que j'ai construit.
featured image - Comment tester plusieurs variantes d'invites d'IA générative
Raymond Camden HackerNoon profile picture

Dans presque toutes mes récentes explorations de l’IA générative, j’ai réalisé à quel point les invites sont importantes. Cela ne m'a pas nécessairement amené à écrire de meilleures invites à tout moment, mais être conscient du problème est au moins une étape vers sa correction, n'est-ce pas ? L’une des choses qui, à mon avis, m’aiderait personnellement serait de disposer d’un outil permettant de comparer et de contraster rapidement différentes invites.


Évidemment, je pouvais simplement ouvrir plusieurs onglets dans un navigateur, mais je voulais vraiment quelque chose de plus direct et simplifié pour mes besoins. Dans cet esprit, permettez-moi de partager ce que j'ai construit.

Testeur d'invite

Prompt Tester est mon outil au nom incroyablement imaginatif pour... euh... tester les invites. Cela commence par une invite :


Application Web Prompt Tester avec une invite vide


L'idée est que vous saisissiez votre invite initiale, puis que vous cliquiez une ou plusieurs fois pour ajouter d'autres invites. Lorsque vous êtes prêt, vous pouvez simplement cliquer sur « Générer les résultats » :


Application Web Prompt Tester avec deux invites et résultats


Avant de montrer quelques exemples de résultats, permettez-moi de parler un peu de la façon dont il a été construit.

Le code

Le backend est un serveur Node.js incroyablement simple qui gère le lancement du code HTML statique et la réponse aux requêtes de l'API frontale. Encore une fois, je remercie Todd Sharp d'avoir partagé son code initial avec moi. Voici la partie de manipulation simple et ennuyeuse :


 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');


Et la partie callGemini qui transmet simplement l'invite à l'API Gemini de Google. En théorie, cela pourrait être remplacé par ChatGPT ou tout autre service.


 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 } } }


Je suis fier de dire que je suis enfin en train de gérer les erreurs de base et d'essayer d'exposer à l'utilisateur (moi) pourquoi une invite a été bloquée.

Le front-end est relativement simple. J'ai utilisé Milligram pour le CSS de base (encore une fois, merci Todd) et du JavaScript vanille pour gérer l'ajout de nouvelles invites et passer les appels. Voici le HTML (moins le CSS en ligne) :


 <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>


Et puis le JavaScript. Notez que j'ai utilisé <template> ci-dessus pour gérer la disposition des invites. C'est la première fois que j'utilise cette balise, et c'était relativement simple.


 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; }


Je pense que tout cela est une manipulation DOM et un appel d'API assez simples, mais faites-le-moi savoir dans un commentaire ci-dessous si quelque chose n'a pas de sens. Remarquez que je lance tous mes appels API en même temps et que Promise.all attend qu'ils se terminent.


Notez également que j'utilise la bibliothèque marked . Les résultats de Google ont généralement Markdown, ce qui permet de les afficher correctement dans ma petite application Web.

Tout cela n'est pas très intéressant, je pense, mais regardons quelques tests. Comme je l'ai dit, je savais que le style d'invite était important. Le fait de me le présenter directement dans un outil a grandement contribué à renforcer cela.

Exemple de résultat – Gravité

Commençons par une idée simple : expliquer la gravité mais pour différents groupes d'âge. En raison de la grande taille des résultats, je vais utiliser un peu de CSS ici pour aider à garder les choses saines.


Invite : expliquez-moi la gravité mais adaptez-la à un enfant de 1re année

La gravité est un super pouvoir que possède notre planète ! C'est comme une force invisible qui fait que tout sur Terre reste au sol.

Imaginez que vous avez un ballon dans la main. Lorsque vous le laissez tomber, que se passe-t-il ? Il tombe, non ? C'est à cause de la gravité. La gravité tire la balle vers le centre de la Terre et la fait tomber au sol.


La gravité est aussi ce qui nous maintient au sol. C'est ce qui maintient nos pieds bien ancrés sur Terre et nous empêche de nous envoler !

La gravité est une force très importante. Il maintient tout en place et aide les choses à fonctionner comme elles le font. Sans gravité, nous flotterions tous dans l’espace, et les choses seraient très chaotiques !


Voici une façon amusante de penser à la gravité : imaginez que la Terre est un aimant géant et que tout sur Terre est fait de métal. L'aimant attire les objets métalliques vers lui, et c'est ce qui les maintient au sol.


La gravité est une force très importante et intéressante. C’est l’une des choses qui font de notre planète un endroit si unique et spécial où vivre !


Invite : expliquez-moi la gravité, mais adaptez-la à un enfant de 7e année

Imaginez que vous jouez avec un ballon. Vous le lancez en l'air et il revient vers vous. C'est à cause de la gravité. La gravité est une force qui attire les objets les uns vers les autres. C'est ce qui vous maintient au sol et ce qui fait tomber les choses.


La gravité entre deux objets dépend de leur masse. Plus un objet a de masse, plus sa gravité est forte. C'est pourquoi des choses comme les planètes et les étoiles ont plus de gravité que des choses comme les gens et les voitures.


La gravité est aussi ce qui maintient les planètes en orbite autour du soleil. La gravité du Soleil est beaucoup plus forte que celle de la Terre, elle attire donc la Terre vers lui. Cela maintient la Terre en mouvement autour du soleil.


La gravité est une force très importante dans notre univers. Cela maintient les choses en place et fait bouger les choses. Sans gravité, les planètes s’envoleraient dans l’espace et nous nous envolerions tous.


Voici quelques faits amusants sur la gravité :

  • La gravité est responsable des marées. La gravité de la Lune attire les océans de la Terre, les faisant monter et descendre.


  • La gravité est la raison pour laquelle nous avons une atmosphère. Sans gravité, l’air flotterait dans l’espace.


  • La gravité est ce qui nous permet de marcher. Lorsque nous marchons, nos pieds poussent contre le sol et le sol repousse. C’est ce qui nous fait avancer.


  • La gravité est la raison pour laquelle nous ne flottons pas dans l’espace. La gravité terrestre nous attire vers son centre, nous maintenant au sol.


Notez la faute de frappe dans l'invite ci-dessous. Les Gémeaux l’ont très bien géré.


Invite : expliquez-moi la gravité, mais adaptez-la à un étudiant d'âge universitaire.


Gravité : la force d'attraction

La gravité est une force fondamentale de l’univers chargée de maintenir en mouvement les corps célestes, tels que les planètes, les lunes et les étoiles. C’est aussi ce qui nous maintient fermement ancrés au sol et permet aux objets de tomber lorsqu’ils tombent.


Loi de Newton sur la gravitation universelle :

La loi de la gravitation universelle stipule que chaque objet de l’univers attire tous les autres objets avec une force proportionnelle au produit de leurs masses et inversement proportionnelle au carré de la distance qui les sépare. Mathématiquement, cela peut s'exprimer comme suit :

F = Gm1m2/r^2


Où:

F est la force gravitationnelle entre deux objets. G est la constante gravitationnelle (6,674 × 10^-11 N m^2/kg^2). m1 et m2 sont les masses des deux objets. r est la distance entre les centres des deux objets.


Importance de la gravité :

  1. Maintient les corps célestes en orbite : L’attraction gravitationnelle des corps célestes plus grands maintient les plus petits en rotation autour d’eux. Par exemple, la gravité terrestre maintient la Lune en orbite, tandis que la gravité solaire maintient la Terre et les autres planètes sur leurs orbites respectives.


  2. Responsable des marées : La gravité entre la Terre et la Lune provoque les marées océaniques. Lorsque la Lune tourne autour de la Terre, son attraction gravitationnelle crée un renflement dans l’eau de l’océan du côté faisant face à la Lune. Un autre renflement se forme du côté opposé de la Terre en raison des forces d’inertie. À mesure que la Terre tourne, ces renflements se déplacent à la surface de la planète, entraînant des marées hautes et basses.


  3. Maintient les objets sur Terre : La gravité attire les objets vers le centre de la Terre, les empêchant de flotter. Ce phénomène nous permet de marcher, de nous tenir debout et d'interagir avec notre environnement.


  4. Formation des étoiles et des galaxies : La gravité joue un rôle crucial dans la formation des étoiles et des galaxies. L’effondrement gravitationnel d’énormes nuages de gaz et de poussière conduit à la création de nouvelles étoiles. De même, l’attraction gravitationnelle des galaxies les maintient liées les unes aux autres, les empêchant de se disperser.


  5. Théorie de la relativité : la théorie de la relativité générale d'Albert Einstein offre une compréhension plus complète de la gravité. Cela explique que la gravité n’est pas une force mais plutôt une courbure de l’espace-temps provoquée par la présence de masse ou d’énergie. Cette courbure affecte le mouvement des objets, les obligeant à suivre des trajectoires courbes plutôt que des lignes droites.


En conclusion, la gravité est une force fondamentale responsable du maintien du mouvement des corps célestes, des marées et du comportement des objets sur Terre. Il s’agit d’un phénomène complexe qui a été largement étudié au fil des siècles et qui continue encore aujourd’hui de fasciner les scientifiques et les chercheurs.

Exemple de résultat – Animaux de compagnie

Pour mon deuxième test, j'ai commencé avec une invite de base, puis une meilleure version qui demandait des types spécifiques de détails : (Note éditoriale rapide : les données tabulaires ci-dessous sont un peu désordonnées, mais ne l'étaient pas dans la sortie originale.)


Question : pourquoi les chats sont-ils tellement meilleurs que les chiens ?

Les chats et les chiens sont tous deux des animaux de compagnie populaires, et il n'y a pas de réponse définitive à la question de savoir lequel est le meilleur. Les chats et les chiens ont chacun leur propre ensemble d’avantages et d’inconvénients, et le meilleur animal de compagnie pour vous dépendra de vos besoins et préférences individuels.


Certaines personnes préfèrent les chats car ils sont généralement plus indépendants que les chiens. Les chats sont généralement heureux de se divertir et n’ont pas besoin d’être promenés ou emmenés dehors pour faire de l’exercice. Cela peut être un gros avantage pour les personnes qui vivent en appartement ou qui ont des horaires chargés.


Les chats sont également connus pour être des animaux propres et bien rangés. Ils se toilettent régulièrement et utilisent généralement le bac à litière sans aucun problème. Cela peut être un gros avantage pour les personnes qui ne veulent pas avoir à faire face aux dégâts et à l'odeur d'un chien.


Bien entendu, avoir un chat présente également certains inconvénients. Les chats peuvent coûter plus cher que les chiens et ils peuvent être plus difficiles à dresser. Les chats sont également plus susceptibles de gratter les meubles et autres articles ménagers.


En fin de compte, la décision d’acquérir un chat ou un chien est une décision personnelle. Il n’y a pas de bonne ou de mauvaise réponse, et le meilleur animal de compagnie pour vous dépendra de vos besoins et préférences individuels.


Voici un tableau résumant les principales différences entre les chats et les chiens :

Caractéristique

Chat

Chien

Indépendance

Plus indépendant

Moins indépendant

Besoins d'exercice

N'a pas besoin d'être marché ou emmené à l'extérieur

Doit être marché ou emmené dehors

Propreté

Se nettoie régulièrement

Doit être baigné régulièrement

Entraînement

Peut être difficile à entraîner

Plus facile à former

Scratch

Peut rayer les meubles et autres articles ménagers

Ne raye généralement pas les meubles

Coût

Plus cher

Moins cher


Question : pourquoi les chats sont-ils tellement meilleurs que les chiens ? expliquer avec une liste à puces de raisons qui couvrent le bien-être émotionnel et les aspects financiers


Bien-être émotionnel:

  • Indépendance : Les chats sont plus indépendants que les chiens, ce qui peut être une bonne chose pour les personnes qui souhaitent un animal qui ne nécessite pas beaucoup d'attention.


  • Faible entretien : Les chats nécessitent généralement moins d’entretien que les chiens. Ils n'ont pas besoin d'être promenés ou soignés aussi souvent, et ils peuvent être laissés seuls pendant de plus longues périodes.


  • Calme : Les chats sont généralement plus silencieux que les chiens, ce qui peut être idéal pour les personnes qui vivent en appartement ou qui ont des voisins sensibles au bruit.


  • Thérapeutique : Des études ont montré que les chats peuvent avoir un effet calmant sur les humains et qu’ils peuvent aider à réduire le stress et l’anxiété.


Aspects financiers :

  • Coût inférieur : Les chats sont généralement moins chers à posséder que les chiens. Ils mangent moins de nourriture, nécessitent moins de visites chez le vétérinaire et nécessitent moins de soins.


  • Plus facile à voyager : Les chats sont plus faciles à voyager que les chiens. Ils peuvent être transportés dans un transporteur et il n'est pas nécessaire de les marcher ou de faire de l'exercice pendant votre absence.


  • Durée de vie plus longue : Les chats ont en moyenne une durée de vie plus longue que les chiens. Cela signifie que vous pourrez profiter de la compagnie de votre chat pendant de nombreuses années.

Exemple de résultat – Invite de chaîne de pensée

Le test suivant est issu d'une excellente présentation d'AWS re:Invent : AWS re:Invent 2023 - Prompt Engineering best practices for LLMs on Amazon Bedrock (AIM377) . J'ai trouvé de nombreux conseils intéressants lors de cette session, y compris un bon aperçu des invites de chaîne de pensée, où l'idée est de fournir des informations sur les étapes utilisées pour résoudre un problème afin d'aider le moteur GenAI à mieux résoudre une invite.


Maintenant, l'exemple donné dans cette présentation ressemblait à ceci :


 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?


Dans la présentation, le modèle utilisé a renvoyé 27 de manière incorrecte. Dans mon test, cela a fonctionné correctement, mais j'ai absolument constaté des problèmes mathématiques lorsque j'ai construit ma démo de conseils de blackjack génératifs avec IA en novembre dernier.


Comme je l'ai dit, Gemini l'a bien géré : A: The answer is 9. Mais dans Prompt Tester, j'ai essayé l'invite CoT suggérée :


 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?


Et le résultat a été amélioré, montrant comment il est parvenu à la réponse :


 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.

La différence est assez significative.

Le code

Si cela vous semble utile, n'hésitez pas à récupérer le code ici : https://github.com/cfjedimaster/ai-testingzone/tree/main/prompt_tester . Comme je l'ai mentionné, il ne devrait pas être si difficile d'ajouter callChatGPT ou autre et d'utiliser un service différent. Si oui, fais moi le savoir!