正在生成内容

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

模型

Firebase Genkit 中的模型是库和抽象,让用户能够访问 各种 Google 和非 Google LLM。

模型针对可观测性进行了全面插桩,并附带相关工具 Genkit Developer UI 提供的集成。 模型运行程序。

在 Genkit 中使用模型时,首先需要配置 希望合作模型配置由插件系统执行。在 在此示例中,您要配置 Vertex AI 插件,该插件可为 Gemini 提供 模型。

Go

import "github.com/firebase/genkit/go/ai"
import "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
}

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

Go

gemini15pro := vertexai.Model("gemini-1.5-pro")

支持的模型

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
奥拉马 许多本地模特,包括 Gemma、Llama 2、Mistral 等

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

如何生成内容

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

只需调用模型即可:

Go

request := ai.GenerateRequest{Messages: []*ai.Message{
  {Content: []*ai.Part{ai.NewTextPart("Tell me a joke.")}},
}}
response, err := gemini15pro.Generate(ctx, &request, nil)
if err != nil {
  return err
}

responseText, err := response.Text()
if err != nil {
  return err
}
fmt.Println(responseText)

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

Go

request := ai.GenerateRequest{
  Messages: []*ai.Message{
      {Content: []*ai.Part{ai.NewTextPart("Tell me a joke about dogs.")}},
  },
  Config: ai.GenerationCommonConfig{
      Temperature:     1.67,
      StopSequences:   []string{"abc"},
      MaxOutputTokens: 3,
  },
}

流式响应

Genkit 支持分块流式传输模型响应:

Go

如需使用分块流式传输,请将回调函数传递给 Generate()

request := ai.GenerateRequest{Messages: []*ai.Message{
  {Content: []*ai.Part{ai.NewTextPart("Tell a long story about robots and ninjas.")}},
}}
response, err := gemini15pro.Generate(
  ctx,
  &request,
  func(ctx context.Context, grc *ai.GenerateResponseChunk) error {
      text, err := grc.Text()
      if err != nil {
          return err
      }
      fmt.Printf("Chunk: %s\n", text)
      return nil
  })
if err != nil {
  return err
}

// You can also still get the full response.
responseText, err := response.Text()
if err != nil {
  return err
}
fmt.Println(responseText)

多模态输入

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

Go

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

request := ai.GenerateRequest{Messages: []*ai.Message{
  {Content: []*ai.Part{
      ai.NewTextPart("Describe the following image."),
      ai.NewMediaPart("", "data:image/jpeg;base64,"+encodedImage),
  }},
}}
gemini15pro.Generate(ctx, &request, nil)

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

函数调用(工具)

Genkit 模型提供了一个用于函数调用的接口, 。

Go

myJoke := &ai.ToolDefinition{
  Name:        "myJoke",
  Description: "useful when you need a joke to tell",
  InputSchema: make(map[string]any),
  OutputSchema: map[string]any{
      "joke": "string",
  },
}
ai.DefineTool(
  myJoke,
  nil,
  func(ctx context.Context, input map[string]any) (map[string]any, error) {
      return map[string]any{"joke": "haha Just kidding no joke! got you"}, nil
  },
)

request := ai.GenerateRequest{
  Messages: []*ai.Message{
      {Content: []*ai.Part{ai.NewTextPart("Tell me a joke.")},
          Role: ai.RoleUser},
  },
  Tools: []*ai.ToolDefinition{myJoke},
}
response, err := gemini15pro.Generate(ctx, &request, nil)

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

正在录制消息记录

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

Go

在会话的第一个提示中,“history”就是用户提示:

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

request := ai.GenerateRequest{Messages: history}
response, err := gemini15pro.Generate(context.Background(), &request, nil)

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

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

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

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

request = ai.GenerateRequest{Messages: history}
response, err = gemini15pro.Generate(ctx, &request, nil)

如果您使用的模型支持系统角色,您可以使用初始 history 设置系统消息:

Go

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