Mensajes

La manipulación 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 LLM, puedes crear instrucciones que influyen en el tono, el formato, la longitud y otras características de las respuestas de los modelos.

Genkit se diseñó con la premisa de que las instrucciones son código. Escribes y mantener tus instrucciones en archivos de origen, realizar un seguimiento de los cambios que se hagan en ellas con la misma versión de control remoto que usas para tu código y los implementas junto con este 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.

Cómo definir 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.

Go

request := ai.GenerateRequest{Messages: []*ai.Message{
  {Content: []*ai.Part{ai.NewTextPart("You are a helpful AI assistant named Walt.")}},
}}
model.Generate(context.Background(), &request, nil)

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 renderizarlas de la siguiente manera:

Go

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)
}
request := ai.GenerateRequest{Messages: []*ai.Message{
  {Content: []*ai.Part{helloPrompt("Fred")}},
}}
response, err := model.Generate(context.Background(), &request, nil)

Sin embargo, una deficiencia de definir mensajes en tu código es que las pruebas requieren la ejecución con ellos como parte de un flujo. Para facilitar una iteración más rápida, Genkit proporciona para definir tus instrucciones y ejecutarlas en la IU para desarrolladores.

Go

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 un GenerateRequest, que puede usarse con cualquier modelo. También puedes definir un esquema de entrada (opcional) para la instrucción, que es análoga 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 renderizar 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.

Go

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.

Punto

Genkit incluye la biblioteca Dotprompt, que agrega funcionalidad a las instrucciones.

  • Cargando 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()