提示

提示操纵是应用开发者影响生成式 AI 模型输出的主要方式。例如,在使用 LLM 时,您可以编写提示,以影响模型回答的语气、格式、长度和其他特征。

Genkit 的设计基于提示即代码这一前提。您可以在源文件文件中编写和维护提示,使用您为代码所用的同一版本控制系统跟踪对提示的更改,然后将提示与调用生成式 AI 模型的代码一起部署。

大多数开发者会发现,包含的 Dotprompt 库能够满足他们在 Genkit 中处理提示的需求。不过,您也可以通过直接使用提示来支持替代方法。

定义提示

Genkit 的生成辅助函数接受字符串提示,对于直接的用例,您可以通过这种方式调用模型。

ai.Generate(context.Background(), model, ai.WithTextPrompt("You are a helpful AI assistant named Walt."))

在大多数情况下,您需要在提示中输入一些用户提供的信息。您可以定义一个函数来呈现它们,如下所示:

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

不过,在代码中定义提示的一个缺点是,测试需要将提示作为 flow 的一部分来执行。为了加快迭代,Genkit 提供了一个工具来定义提示并在开发者界面中运行这些提示。

使用 DefinePrompt 函数向 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
	},
)

提示操作定义了一个返回 GenerateRequest 的函数,该对象可用于任何模型。(可选)您还可以为提示定义输入架构,这类似于 flow 的输入架构。提示还可以定义任何常见的模型配置选项,例如温度或输出词元数量。

您可以使用提供的辅助函数将此提示呈现给模型请求。提供提示所需的输入变量以及要调用的模型。

request, err := helloPrompt.Render(context.Background(), HelloPromptInput{UserName: "Fred"})
if err != nil {
	return err
}
response, err := model.Generate(context.Background(), request, nil)

在 Genkit 开发者界面中,您可以采用这种方式运行您定义的任何提示。这样,您就可以在使用提示的 flow 范围之外,使用各个提示进行试验。

Dotprompt

Genkit 包含 Dotprompt 库,可为提示添加更多功能。

  • .prompt 源文件加载提示
  • 基于 Handlebar 的模板
  • 支持多轮提示模板和多媒体内容
  • 简洁的输入和输出架构定义
  • 通过 generate() 流畅使用