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