La manipulación de instrucciones es la forma principal en la que tú, como desarrollador de apps, influyes en 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.
La mayoría de los desarrolladores descubrirán que la biblioteca Dotprompt incluida satisface sus necesidades de trabajar con instrucciones en Genkit. Sin embargo, los métodos alternativos también se respaldan mediante el trabajo directo con instrucciones.
Define instrucciones
Las funciones auxiliares de generación de Genkit aceptan mensajes de cadena, y puedes llamar modelos de esta manera para casos de uso sencillos.
ai.Generate(context.Background(), model, ai.WithTextPrompt("You are a helpful AI assistant named Walt."))
En la mayoría de los casos, deberás incluir algunas entradas proporcionadas por el usuario en tu instrucción. Podrías definir una función para procesarlas de la siguiente manera:
func helloPrompt(name string) *ai.Part {
prompt := fmt.Sprintf("You are a helpful AI assistant named Walt. Say hello to %s.", name)
return ai.NewTextPart(prompt)
}
response, err := ai.GenerateText(context.Background(), model,
ai.WithMessages(ai.NewUserMessage(helloPrompt("Fred"))))
Sin embargo, una deficiencia de definir mensajes en tu código es que las pruebas requieren su ejecución como parte de un flujo. Para facilitar una iteración más rápida, Genkit proporciona una estructura para definir tus instrucciones y ejecutarlas en la IU para desarrolladores.
Usa la función DefinePrompt
para registrar tus instrucciones con Genkit.
type HelloPromptInput struct {
UserName string
}
helloPrompt := ai.DefinePrompt(
"prompts",
"helloPrompt",
nil, // Additional model config
jsonschema.Reflect(&HelloPromptInput{}),
func(ctx context.Context, input any) (*ai.GenerateRequest, error) {
params, ok := input.(HelloPromptInput)
if !ok {
return nil, errors.New("input doesn't satisfy schema")
}
prompt := fmt.Sprintf(
"You are a helpful AI assistant named Walt. Say hello to %s.",
params.UserName)
return &ai.GenerateRequest{Messages: []*ai.Message{
{Content: []*ai.Part{ai.NewTextPart(prompt)}},
}}, nil
},
)
Una acción de instrucción define una función que muestra una GenerateRequest
, que puede usarse con cualquier modelo. También puedes definir un esquema de entrada para la instrucción, que es análogo al esquema de entrada de un flujo.
Las instrucciones también pueden definir cualquiera de las opciones de configuración de modelos comunes, como la temperatura o la cantidad de tokens de salida.
Puedes procesar esta instrucción en una solicitud de modelo con la función auxiliar proporcionada. Proporciona las variables de entrada que espera la instrucción y el modelo al que llama.
request, err := helloPrompt.Render(context.Background(), HelloPromptInput{UserName: "Fred"})
if err != nil {
return err
}
response, err := model.Generate(context.Background(), request, nil)
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 flujos en que podrían usarse.
Dotprompt
Genkit incluye la biblioteca Dotprompt, que agrega funcionalidad a las instrucciones.
- 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
- Uso fluido con
generate()