paint-brush
Cómo probar múltiples variaciones de indicaciones de IA generativapor@raymondcamden
4,006 lecturas
4,006 lecturas

Cómo probar múltiples variaciones de indicaciones de IA generativa

por Raymond Camden13m2024/03/24
Read on Terminal Reader

Demasiado Largo; Para Leer

En casi todas mis exploraciones recientes de la IA generativa, me he dado cuenta de lo importantes que son las indicaciones. Eso no necesariamente me ha llevado a escribir mejores indicaciones todo el tiempo, pero ser consciente del problema es al menos un paso para corregirlo, ¿verdad? Una de las cosas que pensé que me ayudaría personalmente sería tener una herramienta para comparar y contrastar rápidamente diferentes indicaciones. Obviamente, podría abrir varias pestañas en un navegador, pero realmente quería algo más directo y simplificado para mis propósitos. Con eso en mente, permítanme compartir lo que he construido.
featured image - Cómo probar múltiples variaciones de indicaciones de IA generativa
Raymond Camden HackerNoon profile picture

En casi todas mis exploraciones recientes de la IA generativa, me he dado cuenta de lo importantes que son las indicaciones. Eso no necesariamente me ha llevado a escribir mejores indicaciones todo el tiempo, pero ser consciente del problema es al menos un paso para corregirlo, ¿verdad? Una de las cosas que pensé que me ayudaría personalmente sería tener una herramienta para comparar y contrastar rápidamente diferentes indicaciones.


Obviamente, podría abrir varias pestañas en un navegador, pero realmente quería algo más directo y simplificado para mis propósitos. Con eso en mente, permítanme compartir lo que he construido.

Probador rápido

Prompt Tester es mi herramienta con un nombre increíblemente imaginativo para... um... probar indicaciones. Comienza con un mensaje:


Aplicación web Prompt Tester con un mensaje vacío


La idea es que ingrese su mensaje inicial y luego haga clic una o más veces para agregar más mensajes. Cuando esté listo, puede simplemente hacer clic en "Generar resultados":


Aplicación web Prompt Tester con dos indicaciones y resultados


Antes de mostrar algunos resultados de ejemplo, permítanme hablar un poco sobre cómo se construyó.

El código

El backend es un servidor Node.js increíblemente simple que se encarga de generar HTML estático y responder a las solicitudes de API del front-end. Una vez más, agradezco a Todd Sharp por compartir conmigo su código inicial. Aquí está la parte aburrida y simple de manejo:


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


Y la parte callGemini que simplemente pasa el mensaje a la API Gemini de Google. En teoría, esto podría cambiarse a ChatGPT o cualquier otro servicio.


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


Me enorgullece decir que ahora, finalmente, estoy manejando algunos errores básicos y tratando de exponerle al usuario (yo) por qué se bloqueó un mensaje.

La parte delantera es relativamente simple. Utilicé Milligram para el CSS principal (nuevamente, gracias Todd) y algo de JavaScript básico para manejar la adición de nuevas indicaciones y realizar las llamadas. Aquí está el HTML (menos el CSS en línea):


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


Y luego el JavaScript. Observe que utilicé <template> arriba para manejar el diseño del mensaje. Esta es la primera vez que uso esa etiqueta y fue 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; }


Creo que todo eso es una manipulación DOM bastante simple y una llamada a la API, pero definitivamente avíseme en un comentario a continuación si algo no tiene sentido. Observe que realizo todas mis llamadas API a la vez y Promise.all espero a que terminen.


Además, tenga en cuenta que uso la biblioteca marked . Los resultados de Google normalmente tienen Markdown, y esto ayuda a mostrarlos bien en mi pequeña aplicación web.

Creo que todo esto no es muy interesante, pero veamos algunas pruebas. Como dije, sabía que el estilo del mensaje era importante. Tenerlo presentado directamente en una herramienta contribuyó en gran medida a reforzarlo.

Resultado de la muestra: gravedad

Comencemos con una idea simple: explicar la gravedad pero para diferentes grupos de edad. Debido al gran tamaño de los resultados, usaré un poco de CSS aquí para ayudar a mantener todo en orden.


Pregunta: explícame la gravedad pero hazla apropiada para un niño de 1.er grado.

¡La gravedad es un superpoder que tiene nuestro planeta! Es como una fuerza invisible que hace que todo lo que hay en la Tierra permanezca en el suelo.

Imagina que tienes una pelota en la mano. Cuando lo sueltas, ¿qué pasa? Se cae ¿no? Eso es por la gravedad. La gravedad empuja la pelota hacia el centro de la Tierra y así cae al suelo.


La gravedad también es lo que nos mantiene en el suelo. ¡Es lo que mantiene nuestros pies firmemente plantados en la Tierra y nos impide alejarnos flotando!

La gravedad es una fuerza muy importante. Mantiene todo en su lugar y ayuda a que las cosas funcionen como lo hacen. ¡Sin gravedad, todos estaríamos flotando en el espacio y las cosas serían muy caóticas!


Aquí tienes una forma divertida de pensar en la gravedad: imagina que la Tierra es un imán gigante y que todo en la Tierra está hecho de metal. El imán atrae los objetos metálicos hacia él y eso es lo que los mantiene en el suelo.


La gravedad es una fuerza muy importante e interesante. ¡Es una de las cosas que hace de nuestro planeta un lugar único y especial para vivir!


Pregunta: explícame la gravedad pero hazla apropiada para un niño de séptimo grado.

Imagina que estás jugando con una pelota. Lo lanzas al aire y vuelve a caer hacia ti. Esto se debe a la gravedad. La gravedad es una fuerza que atrae las cosas unas hacia otras. Es lo que te mantiene en el suelo y lo que hace que las cosas se caigan.


La cantidad de gravedad entre dos objetos depende de su masa. Cuanta más masa tiene un objeto, más fuerte es su gravedad. Es por eso que cosas como los planetas y las estrellas tienen más gravedad que las personas y los automóviles.


La gravedad también es lo que mantiene a los planetas en órbita alrededor del sol. La gravedad del sol es mucho más fuerte que la de la Tierra, por lo que atrae a la Tierra hacia él. Esto mantiene a la Tierra moviéndose en un círculo alrededor del sol.


La gravedad es una fuerza muy importante en nuestro universo. Mantiene las cosas en su lugar y las hace moverse. Sin gravedad, los planetas volarían hacia el espacio y todos nosotros flotaríamos.


Aquí hay algunos datos divertidos sobre la gravedad:

  • La gravedad es responsable de las mareas. La gravedad de la luna atrae los océanos de la Tierra, provocando que suban y bajen.


  • La gravedad es la razón por la que tenemos una atmósfera. Sin gravedad, el aire simplemente flotaría hacia el espacio.


  • La gravedad es lo que nos permite caminar. Cuando caminamos, nuestros pies empujan contra el suelo y el suelo empuja hacia atrás. Esto es lo que nos impulsa hacia adelante.


  • La gravedad es la razón por la que no flotamos hacia el espacio. La gravedad de la Tierra nos atrae hacia su centro, manteniéndonos en el suelo.


Tenga en cuenta el error tipográfico en el siguiente mensaje. Géminis lo manejó muy bien.


Pregunta: explícame la gravedad, pero hazla apropiada para un estudiante en edad universitaria.


Gravedad: la fuerza de atracción

La gravedad es una fuerza fundamental en el universo responsable de mantener en movimiento los cuerpos celestes, como los planetas, las lunas y las estrellas. También es lo que nos mantiene firmemente plantados en el suelo y permite que los objetos caigan al caer.


Ley de gravitación universal de Newton:

La ley de gravitación universal establece que todo objeto en el universo atrae a todos los demás con una fuerza proporcional al producto de sus masas e inversamente proporcional al cuadrado de la distancia entre ellos. Matemáticamente se puede expresar como:

F = Gm1m2/r^2


Dónde:

F es la fuerza gravitacional entre dos objetos. G es la constante gravitacional (6,674 × 10^-11 N m^2/kg^2). m1 y m2 son las masas de los dos objetos. r es la distancia entre los centros de los dos objetos.


Importancia de la gravedad:

  1. Mantiene los cuerpos celestes en órbita: la atracción gravitacional de los cuerpos celestes más grandes mantiene a los más pequeños girando a su alrededor. Por ejemplo, la gravedad de la Tierra mantiene a la Luna en órbita, mientras que la gravedad del Sol mantiene a la Tierra y a otros planetas en sus respectivas órbitas.


  2. Responsable de las mareas: la gravedad entre la Tierra y la Luna provoca las mareas oceánicas. A medida que la Luna orbita la Tierra, su atracción gravitacional crea un bulto en el agua del océano en el lado que mira a la Luna. Se forma otro bulto en el lado opuesto de la Tierra debido a las fuerzas de inercia. A medida que la Tierra gira, estas protuberancias se mueven por la superficie del planeta, lo que provoca mareas altas y bajas.


  3. Mantiene los objetos en la Tierra: la gravedad atrae los objetos hacia el centro de la Tierra, evitando que se aleje flotando. Este fenómeno nos permite caminar, pararnos e interactuar con nuestro entorno.


  4. Formación de estrellas y galaxias: la gravedad juega un papel crucial en la formación de estrellas y galaxias. El colapso gravitacional de enormes nubes de gas y polvo conduce a la creación de nuevas estrellas. De manera similar, la atracción gravitacional de las galaxias las mantiene unidas, impidiendo que se dispersen.


  5. Teoría de la relatividad: la teoría de la relatividad general de Albert Einstein proporciona una comprensión más completa de la gravedad. Explica que la gravedad no es una fuerza sino una curvatura del espacio-tiempo provocada por la presencia de masa o energía. Esta curvatura afecta el movimiento de los objetos, haciendo que sigan trayectorias curvas en lugar de líneas rectas.


En conclusión, la gravedad es una fuerza fundamental responsable de mantener los cuerpos celestes en movimiento, las mareas y el comportamiento de los objetos en la Tierra. Es un fenómeno complejo que se ha estudiado extensamente a lo largo de los siglos y que continúa fascinando a científicos e investigadores hasta el día de hoy.

Resultado de muestra: mascotas

Para mi segunda prueba, comencé con un mensaje básico y luego una versión mejor que pedía tipos específicos de detalles: (Nota editorial rápida: los datos tabulares a continuación están un poco confusos, pero no lo estaban en el resultado original).


Pregunta: ¿por qué los gatos son mucho mejores que los perros?

Tanto los gatos como los perros son mascotas populares y no existe una respuesta definitiva a la pregunta de cuál es mejor. Tanto los gatos como los perros tienen su propio conjunto único de ventajas y desventajas, y la mejor mascota para usted dependerá de sus necesidades y preferencias individuales.


Algunas personas prefieren los gatos porque generalmente son más independientes que los perros. Por lo general, los gatos están felices de entretenerse y no es necesario que los paseen ni los saquen afuera para hacer ejercicio. Esto puede ser una gran ventaja para las personas que viven en apartamentos o tienen agendas ocupadas.


Los gatos también son conocidos por ser animales limpios y ordenados. Se acicalan con regularidad y suelen utilizar la caja de arena sin problemas. Esto puede ser una gran ventaja para las personas que no quieren lidiar con el desorden y el olor de un perro.


Por supuesto, tener un gato también tiene algunas desventajas. Los gatos pueden ser más caros que los perros y pueden ser más difíciles de entrenar. También es más probable que los gatos arañen los muebles y otros artículos del hogar.


En última instancia, la decisión de tener un gato o un perro es personal. No existe una respuesta correcta o incorrecta, y la mejor mascota para usted dependerá de sus necesidades y preferencias individuales.


Aquí hay una tabla que resume las diferencias clave entre perros y gatos:

Característica

Gato

Perro

Independencia

Mas independiente

Menos independiente

Necesidades de ejercicio

No es necesario caminar ni sacarlo afuera.

Necesita caminar o sacarlo afuera.

Limpieza

Se limpia solo regularmente

Necesita ser bañado regularmente

Capacitación

Puede ser difícil entrenar

Más fácil de entrenar

Rascarse

Puede rayar muebles y otros artículos del hogar.

No suele rayar los muebles.

Costo

Más caro

Menos costoso


Pregunta: ¿por qué los gatos son mucho mejores que los perros? explique con una lista con viñetas de razones que cubren el bienestar emocional y los aspectos financieros


El bienestar emocional:

  • Independencia: Los gatos son más independientes que los perros, lo que puede ser bueno para las personas que quieren una mascota que no requiera mucha atención.


  • Bajo mantenimiento: Los gatos generalmente requieren menos mantenimiento que los perros. No es necesario pasearlos ni arreglarlos con tanta frecuencia y se les puede dejar solos durante períodos de tiempo más largos.


  • Silencioso: Los gatos son generalmente más silenciosos que los perros, lo que puede ser ideal para personas que viven en apartamentos o tienen vecinos sensibles al ruido.


  • Terapéutico: Los estudios han demostrado que los gatos pueden tener un efecto calmante en los humanos y pueden ayudar a reducir el estrés y la ansiedad.


Aspectos financieros:

  • Costo más bajo: Generalmente, tener gatos es menos costoso que tener perros. Comen menos comida, necesitan menos visitas al veterinario y no requieren tanto aseo.


  • Más fácil de viajar: Es más fácil viajar con gatos que con perros. Se pueden transportar en un transportador y no es necesario caminar con ellos ni hacer ejercicio mientras usted está fuera.


  • Esperanza de vida más larga: los gatos tienen una esperanza de vida más larga que los perros, en promedio. Esto significa que podrás disfrutar de la compañía de tu gato durante muchos años.

Resultado de muestra: cadena de sugerencias de pensamiento

La siguiente prueba surgió de una excelente presentación de AWS re:Invent: AWS re:Invent 2023: prácticas recomendadas de ingeniería inmediata para LLM en Amazon Bedrock (AIM377) . Encontré muchos consejos excelentes en esta sesión, incluida una buena descripción general de las indicaciones de la cadena de pensamiento, donde la idea es proporcionar información sobre los pasos utilizados para resolver un problema para ayudar al motor GenAI a resolver mejor una indicación.


Ahora, el ejemplo dado en esa presentación fue el siguiente:


 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?


En la presentación, el modelo en uso arrojó incorrectamente 27. En mi prueba, funcionó correctamente, pero vi absolutamente problemas con las matemáticas cuando construí mi demostración de consejos de blackjack con IA generativa en noviembre pasado.


Como dije, Gemini lo manejó bien: A: The answer is 9. Pero en Prompt Tester, probé el mensaje 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?


Y el resultado fue mejorado, mostrando cómo llegó a la respuesta:


 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 diferencia es bastante significativa.

El código

Si esto le parece útil, no dude en obtener el código desde aquí: https://github.com/cfjedimaster/ai-testingzone/tree/main/prompt_tester . Como mencioné, no debería ser tan difícil agregar callChatGPT o algo así y usar un servicio diferente. Si es así, ¡házmelo saber!