生成内容

Firebase Genkit 为使用 LLM 生成内容提供了一个简单的接口。

模型

Firebase Genkit 中的模型是库和抽象,可让您访问各种 Google 和非 Google LLM。

模型针对可观测性进行了全面插桩,并附带 Genkit 开发者界面提供的工具集成,您可以使用模型运行程序试用任何模型。

在 Genkit 中使用模型时,您首先需要配置要使用的模型。模型配置由插件系统执行。在此示例中,您将配置 Vertex AI 插件以提供 Gemini 模型。

import {
	"github.com/firebase/genkit/go/ai"
	"github.com/firebase/genkit/go/plugins/vertexai"
}
// Default to the value of GCLOUD_PROJECT for the project,
// and "us-central1" for the location.
// To specify these values directly, pass a vertexai.Config value to Init.
if err := vertexai.Init(ctx, nil); err != nil {
	return err
}

如需使用该插件提供的模型,您需要引用特定的模型和版本:

model := vertexai.Model("gemini-1.5-flash")

支持的模型

Genkit 通过其插件系统提供模型支持。以下插件受官方支持:

插件 模型
Google 生成式 AI Gemini Pro、Gemini Pro Vision
Google Vertex AI Gemini Pro、Gemini Pro Vision、Gemini 1.5 Flash、Gemini 1.5 Pro、Imagen2
Ollama 许多本地模型,包括 Gemma、Llama 2、Mistral 等

如需了解设置和使用信息,请参阅各个插件的文档。

如何生成内容

Genkit 为使用模型生成内容提供了一个简单的辅助函数。

如需仅调用模型,请使用以下代码:

responseText, err := ai.GenerateText(ctx, model, ai.WithTextPrompt("Tell me a joke."))
if err != nil {
	return err
}
fmt.Println(responseText)

您可以将选项与模型调用一起传递。支持的选项取决于型号及其 API。

response, err := ai.Generate(ctx, model,
	ai.WithTextPrompt("Tell me a joke about dogs."),
	ai.WithConfig(ai.GenerationCommonConfig{
		Temperature:     1.67,
		StopSequences:   []string{"cat"},
		MaxOutputTokens: 3,
	}))

流式响应

Genkit 支持对模型回答进行分块流式处理。如需使用分块流式处理,请将回调函数传递给 Generate()

response, err := ai.Generate(ctx, gemini15pro,
	ai.WithTextPrompt("Tell a long story about robots and ninjas."),
	// stream callback
	ai.WithStreaming(
		func(ctx context.Context, grc *ai.GenerateResponseChunk) error {
			fmt.Printf("Chunk: %s\n", grc.Text())
			return nil
		}))
if err != nil {
	return err
}

// You can also still get the full response.
fmt.Println(response.Text())

多模态输入

如果模型支持多模态输入,您可以传递图片提示:

imageBytes, err := os.ReadFile("img.jpg")
if err != nil {
	return err
}
encodedImage := base64.StdEncoding.EncodeToString(imageBytes)

resp, err := ai.Generate(ctx, gemini15pro, ai.WithMessages(
	ai.NewUserMessage(
		ai.NewTextPart("Describe the following image."),
		ai.NewMediaPart("", "data:image/jpeg;base64,"+encodedImage))))

图片提示的确切格式(https 网址、gs 网址、data URI)取决于模型。

函数调用(工具)

Genkit 模型为支持函数调用的模型提供了接口。

myJokeTool := ai.DefineTool(
	"myJoke",
	"useful when you need a joke to tell",
	func(ctx context.Context, input *any) (string, error) {
		return "haha Just kidding no joke! got you", nil
	},
)

response, err := ai.Generate(ctx, gemini15pro,
	ai.WithTextPrompt("Tell me a joke."),
	ai.WithTools(myJokeTool))

这将自动调用工具,以执行用户提示。

消息历史记录

Genkit 模型支持维护发送到模型的消息及其回答的历史记录,您可以使用该历史记录来打造互动式体验,例如聊天机器人。

在会话的第一个提示中,“历史记录”只是用户提示:

history := []*ai.Message{{
	Content: []*ai.Part{ai.NewTextPart(prompt)},
	Role:    ai.RoleUser,
}}

response, err := ai.Generate(context.Background(), gemini15pro, ai.WithMessages(history...))

收到回答后,将其添加到历史记录中:

history = append(history, response.Candidates[0].Message)

您可以序列化此历史记录,并将其保留在数据库或会话存储空间中。对于后续的用户提示,请在调用 Generate() 之前将其添加到历史记录中:

history = append(history, &ai.Message{
	Content: []*ai.Part{ai.NewTextPart(prompt)},
	Role:    ai.RoleUser,
})

response, err = ai.Generate(ctx, gemini15pro, ai.WithMessages(history...))

如果您使用的模型支持系统角色,则可以使用初始历史记录来设置系统消息:

history = []*ai.Message{{
	Content: []*ai.Part{ai.NewTextPart("Talk like a pirate.")},
	Role:    ai.RoleSystem,
}}