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,
}}