提示操纵是应用开发者影响生成式 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()
流畅使用