La ingeniería de instrucciones es la forma principal en la que tú, como desarrollador de apps, influyes el resultado de los modelos de IA generativa. Por ejemplo, cuando usas los LLMs, puedes crear instrucciones que influyen en el tono, el formato, la longitud y otras características de las respuestas de los modelos.
Genkit está diseñado con la premisa de que las instrucciones son código. Escribes y mantienes tus instrucciones en archivos de origen, realizas un seguimiento de los cambios que se hacen en ellos con la misma versión de control remoto que usas para tu código y los implementas junto con el código que llama a tus modelos de IA generativa.
Genkit tiene una herramienta integral para desarrollar instrucciones complejas denominada Dotprompt. Consulta esa documentación para ver la lista completa de funciones.
En este documento, se muestran varias formas en que se pueden usar instrucciones en Genkit, comenzando desde la más sencilla hasta la más compleja.
Define instrucciones
La función auxiliar generate()
de Genkit acepta mensajes de cadena, y puedes
llamar modelos de esta manera para casos de uso sencillos.
import { generate } from '@genkit-ai/ai';
generate({
model: 'googleai/gemini-1.5-flash-latest',
prompt: 'You are a helpful AI assistant named Walt. Say hello.',
});
En algunos casos, deberás incluir algunas entradas que proporcionó el cliente en tu instrucción. Podrías usar un literal de plantilla para renderizarlas de la siguiente manera:
const name = "Fred";
generate({
model: 'googleai/gemini-1.5-flash-latest',
prompt: `You are a helpful AI assistant named Walt. Say hello to ${name}.`,
});
Sin embargo, Genkit permite definir tus instrucciones en un formato estandarizado que facilita el uso de plantillas más avanzadas y pruebas rápidas en la IU para desarrolladores.
Usa la función defineDotprompt
para definir estas instrucciones estructuradas.
import { defineDotprompt } from '@genkit-ai/dotprompt'
import z from 'zod';
const helloPrompt = defineDotprompt(
{
name: 'helloPrompt',
model: 'googleai/gemini-1.5-flash-latest',
input: {
schema: z.object({ name: z.string() }),
},
},
`You are a helpful AI assistant named Walt. Say hello to {{name}}`
);
Luego, llama a la instrucción usando su método generate()
:
helloPrompt.generate({ input: { name: 'Fred' } });
// Example output: Hello Fred! 👋 It's nice to meet you. How can I help you today? 😊
Como se mostró anteriormente, las instrucciones definidas de esta manera pueden especificar las entradas estructuradas que aceptan a través de la configuración de input.schema
. Esto te permite garantizar que los mensajes solo se invoquen con conjuntos de entradas válidos.
Las solicitudes de punto también pueden especificar una salida, que pasarán para llamar al LLM como una directiva (ya sea como un mensaje en contexto o como un parámetro de API para los LLM que admiten un modo de salida estructurado). Esto garantiza que obtendrás una respuesta acorde o una excepción con la que puedes lidiar sin problemas.
const outputSchema = z.object({
short: z.string(),
friendly: z.string(),
likeAPirate: z.string(),
});
const threeGreetingsPrompt = defineDotprompt(
{
name: 'threeGreetingsPrompt',
model: 'googleai/gemini-1.5-flash-latest',
input: {
schema: z.object({ name: z.string() }),
},
output: {
format: 'json',
schema: outputSchema,
},
},
`You are a helpful AI assistant named Walt. Say hello to {{name}}, write a response for each of the styles requested`
);
Luego, puedes llamar a generate
en esa instrucción y trabajar con el resultado estructurado en la respuesta:
const response = await (threeGreetingsPrompt.generate<typeof outputSchema>(
{ input: { name: 'Fred' } }
));
response.output()?.likeAPirate
// "Ahoy there, Fred! May the winds be ever in your favor!"
En la IU para desarrolladores de Genkit, puedes ejecutar cualquier instrucción que hayas definido de esta manera. Esto te permite experimentar con instrucciones individuales fuera del alcance de los lugares de tu código en los que se podrían usar.
Dotprompt
Consulta la página Dotprompt para ver más funciones de la biblioteca de Dotprompt, por ejemplo:
- Carga instrucciones de
.prompt
archivos de origen - Plantillas basadas en Handlebars
- Compatibilidad con plantillas de instrucciones de varios turnos y contenido multimedia
- Definiciones concisas de esquemas de entrada y salida