コンテンツの生成

Firebase Genkit は、LLM を使用してコンテンツを生成するための簡単なインターフェースを提供します。

モデル

Firebase Genkit のモデルは、 Google LLM と Google 以外の LLM で表現されます。

モデルはオブザーバビリティのために完全に計測可能で、ツールが付属 Genkit のデベロッパー UI によって提供される統合機能が、 説明します

Genkit でモデルを扱う際は、まず最初に目的のモデルを構成する必要があります。 選択できます。モデル構成はプラグイン システムによって行われます。イン この例では、Gemini を提供する Vertex AI プラグインを構成しています。 構築できます

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 URL、gs URL、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 := []*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,
  }}