コンテンツの生成

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

モデル

Firebase Genkit のモデルは、さまざまな Google LLM と Google 以外の LLM へのアクセスを提供するライブラリと抽象化です。

モデルはオブザーバビリティのために完全にインストルメント化され、ツールが Genkit デベロッパー UI に統合されています。モデルランナーを使用すると任意のモデルを試すことができます。

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

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 Generative 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 URL、gs URL、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,
}}