生成 AI の核となるのは AI モデルです。現在、生成モデルの最も顕著な例は、大規模言語モデル(LLM)と画像生成モデルの 2 つです。これらのモデルは、プロンプトと呼ばれる入力(ほとんどの場合、テキスト、画像、またはその両方の組み合わせ)を受け取り、そこからテキスト、画像、音声、動画を出力します。
これらのモデルの出力は驚くほど説得力があります。LLM は人間が書いたように見えるテキストを生成し、画像生成モデルは実際の写真や人間が作成したアートワークに非常に近い画像を生成できます。
さらに、LLM は単純なテキスト生成以外に次のようなタスクにも対応できることが実証されています。
- コンピュータ プログラムを作成する。
- 大きなタスクを完了するために必要なサブタスクを計画する。
- 整理されていないデータを整理する。
- テキストのコーパスから情報データを理解して抽出する。
- アクティビティのテキスト記述に基づいて、自動アクティビティをフォローして実行する。
利用可能なモデルは、複数のプロバイダから提供されています。各モデルには独自の長所と短所があり、モデルによって、特定のタスクでは優れているものの、他のタスクではパフォーマンスが低い場合があります。生成 AI を使用するアプリでは、多くの場合、現在のタスクに応じて複数のモデルを使用すると効果的です。
通常、アプリ デベロッパーは生成 AI モデルを直接操作するのではなく、ウェブ API として利用可能なサービスを介して操作します。これらのサービスは類似した機能を提供することがありますが、互換性のない異なる API を通じて提供されます。複数のモデルサービスを利用する場合は、それぞれ独自の SDK を使用する必要があります。これらの SDK は互換性がない可能性があります。また、あるモデルから最新の最も機能が豊富なモデルにアップグレードする場合、その統合を最初から構築し直す必要がある場合があります。
Genkit は、任意の生成 AI モデル サービスにアクセスする詳細を抽象化した単一のインターフェースを提供し、いくつかのビルド済み実装をすでに利用できるようにすることで、この課題に対処します。Genkit を中心に AI を活用したアプリを構築すると、最初の生成 AI 呼び出しのプロセスが簡素化され、新しいモデルが登場したときに複数のモデルを組み合わせたり、モデルを交換したりすることも同様に簡単になります。
始める前に
このページのコードサンプルを実行する場合は、まずスタートガイドの手順を完了してください。すべての例は、Genkit がプロジェクトの依存関係としてすでにインストールされていることを前提としています。
Genkit でサポートされているモデル
Genkit は、任意の生成 AI モデル サービスを使用できる柔軟性を十分に備えて設計されています。コア ライブラリはモデルを操作するための共通インターフェースを定義し、モデル プラグインは特定のモデルとその API を操作するための実装の詳細を定義します。
Genkit チームは、Vertex AI、Google 生成 AI、Ollama が提供するモデルを操作するためのプラグインを維持しています。
- Google Cloud Vertex AI プラグインを介した LLM の Gemini ファミリー。
- Google AI プラグインを介した LLM の Gemini ファミリー。
- Ollama プラグインを介した Gemma 3、Llama 4 などの多くのオープンモデル(Ollama サーバーは自分でホストする必要があります)。
モデル プラグインの読み込みと構成
Genkit を使用してコンテンツの生成を開始する前に、モデル プラグインを読み込んで構成する必要があります。スタートガイドから開始している場合は、すでにこの手順を完了しています。それ以外の場合は、スタートガイドまたは個々のプラグインのドキュメントで手順を確認し、続行してください。
genkit.Generate()
関数
Genkit では、生成 AI モデルを操作するための主なインターフェースは genkit.Generate()
関数です。
最も簡単な genkit.Generate()
呼び出しでは、使用するモデルとテキスト プロンプトを指定します。
import (
"context"
"log"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
}
この簡単な例を実行すると、デバッグ情報が出力され、その後に genkit.Generate()
呼び出しの出力が出力されます。通常、この出力は次の例のような Markdown テキストになります。
## The Blackheart's Bounty
**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**
**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.
スクリプトを再度実行すると、別の出力が表示されます。
上記のコードサンプルでは、Genkit インスタンスの構成時に指定したデフォルトモデルに生成リクエストを送信しています。
1 回の genkit.Generate()
呼び出しにモデルを指定することもできます。
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.5-pro"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
モデルの文字列識別子は providerid/modelid
のようになります。プロバイダ ID(この場合は googleai
)はプラグインを識別し、モデル ID は特定のバージョンのモデルのプラグイン固有の文字列識別子です。
これらの例は、重要なポイントも示しています。genkit.Generate()
を使用して生成 AI モデルを呼び出す場合、使用するモデルを変更するには、モデル パラメータに別の値を渡すだけです。ネイティブ モデル SDK の代わりに genkit.Generate()
を使用すると、アプリで複数のモデルを簡単に使用したり、将来的にモデルを変更したりできます。
ここまでに説明したのは、最も単純な genkit.Generate()
呼び出しの例のみです。ただし、genkit.Generate()
には、生成モデルとの高度なインタラクション用のインターフェースも用意されています。これについては、後のセクションで説明します。
システム プロンプト
一部のモデルでは、システム プロンプトの提供がサポートされています。これは、ユーザーからのメッセージにどのように応答するかをモデルに指示します。システム プロンプトを使用して、モデルに採用するペルソナ、レスポンスのトーン、レスポンスの形式などを指定できます。
使用しているモデルがシステム プロンプトをサポートしている場合は、WithSystem()
オプションを使用してプロンプトを指定できます。
resp, err := genkit.Generate(ctx, g,
ai.WithSystem("You are a food industry marketing consultant."),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
システム プロンプトをサポートしていないモデルの場合、WithSystem()
はリクエストを変更してシステム プロンプトのように見せることで、システム プロンプトをシミュレートします。
モデル パラメータ
genkit.Generate()
関数は WithConfig()
オプションを取ります。これにより、モデルがコンテンツを生成する方法を制御するオプション設定を指定できます。
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithConfig(&googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
}),
)
サポートされるパラメータは、個々のモデルとモデル API によって異なります。ただし、前の例のパラメータはほとんどのモデルに共通しています。これらのパラメータの説明は次のとおりです。
出力の長さを制御するパラメータ
MaxOutputTokens
LLM は、トークンと呼ばれる単位で動作します。トークンは通常、特定の文字列にマッピングされますが、必ずしもそうである必要はありません。プロンプトをモデルに渡す際、最初のステップの一つは、プロンプト文字列をトークンのシーケンスにトークン化することです。次に、LLM はトークン化された入力からトークンのシーケンスを生成します。最後に、トークンのシーケンスがテキストに変換され、これが出力になります。
最大出力トークン パラメータは、LLM を使用して生成するトークンの数に上限を設定します。モデルごとに異なるトークン化ツールを使用する可能性がありますが、1 つの英単語は 2~4 つのトークンで構成されていると見なすのが一般的です。
前述のとおり、一部のトークンは文字列にマッピングされない場合があります。たとえば、シーケンスの終了を示すトークンは、しばしば大量に存在します。LLM がこのトークンを生成すると、生成が停止します。そのため、LLM が「停止」トークンを生成したために、最大数よりも少ないトークンを生成することがあります。
StopSequences
このパラメータを使用すると、生成時に LLM 出力の終了を示すトークンまたはトークン シーケンスを設定できます。ここで使用する正しい値は通常、モデルのトレーニング方法によって異なり、通常はモデル プラグインによって設定されます。ただし、別の停止シーケンスを生成するようにモデルに指示した場合は、ここで指定できます。
指定するのはトークン自体ではなく、文字列です。ほとんどの場合、モデルのトークナイザーが単一のトークンにマッピングする文字列を指定します。
「クリエイティブさ」を制御するパラメータ
Temperature、Top-P、Top-K パラメータは、モデルの「クリエイティブさ」を制御します。以下に、これらのパラメータの意味について簡単に説明しますが、特に重要なのは、これらのパラメータは LLM の出力の文字を調整するために使用されることです。最適な値は目標と設定内容によって異なり、テストを実施して見極める必要があります。
Temperature
LLM は基本的にトークンを予測するマシンです。LLM は、特定のトークン シーケンス(プロンプトなど)について、その語彙内の各トークンがシーケンス内で次に出現する可能性を予測します。Temperature は、0~1 の確率に正規化される前に、これらの予測を分割するスケーリング ファクタです。
低い Temperature 値(0.0~1.0)は、トークン間の確率の差を増幅します。その結果、モデルは、すでに評価して確率が低いと判断したトークンを生成する可能性がさらに低くなります。多くの場合、これはクリエイティブさが低い出力と見なされます。技術的には 0.0 は有効な値ではありませんが、多くのモデルでは、モデルが確定的に動作し、最も可能性の高いトークンのみを考慮することを示すものとして扱います。
Temperature 値が高い(1.0 より大きい)と、トークン間の確率の差が圧縮され、以前に評価された可能性の低いトークンが生成される可能性がさらに高くなります。多くの場合、これはクリエイティブさが高い出力と見なされます。一部のモデル API には最大の Temperature(多くの場合 2.0)が設定されています。
TopP
Top-p は 0.0~1.0 の値で、トークンの累積確率を指定して、モデルで検討する可能性のあるトークンの数を制御します。たとえば、値が 1.0 の場合、考えられるすべてのトークンを考慮することを意味しますが、各トークンの確率も考慮します。値が 0.4 の場合、確率の合計が 0.4 になる可能性が最も高いトークンのみを考慮し、残りのトークンは考慮から除外されます。
TopK
Top-K は整数値で、モデルで考慮する可能性のあるトークンの数も制御します。ただし、この場合はトークンの最大数を明示的に指定します。値を 1 に指定すると、モデルは確定的に動作します。
モデル パラメータをテストする
デベロッパー UI を使用して、さまざまなモデルとプロンプトの組み合わせによって生成される出力に対するこれらのパラメータの影響をテストできます。genkit start
コマンドでデベロッパー UI を起動すると、プロジェクトで構成されたプラグインによって定義されたすべてのモデルが自動的に読み込まれます。コードでこれらの変更を繰り返し行う必要はなく、さまざまなプロンプトと構成値をすばやく試すことができます。
モデルとその構成をペア設定する
各プロバイダや特定のモデルに独自の構成スキーマが存在する場合や、特定の設定が必要な場合、WithModelName()
と WithConfig()
を使用して個別のオプションを設定すると、後者が前者に対して厳密に型付けされていないため、エラーが発生する可能性があります。
モデルと構成をペア設定するには、代わりに生成呼び出しに渡すことができるモデル リファレンスを作成します。
model := googlegenai.GoogleAIModelRef("gemini-2.0-flash", &googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
})
resp, err := genkit.Generate(ctx, g,
ai.WithModel(model),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
モデル リファレンスのコンストラクタは、正しい構成タイプが指定されていることを強制するため、不一致が減る可能性があります。
構造化出力
生成 AI をアプリケーションのコンポーネントとして使用する場合は、多くの場合、出力を書式なしテキスト以外の形式で出力する必要があります。ユーザーに表示するコンテンツを生成する場合でも、ユーザーに魅力的に表示するために構造化出力を利用できます。ただし、モデルの出力をプログラムで使用したり、あるモデルの出力を別のモデルにフィードしたりするなど、生成 AI の高度なアプリケーションでは、構造化された出力が必要です。
Genkit では、genkit.Generate()
を呼び出すときに出力タイプを指定して、モデルから構造化出力をリクエストできます。
type MenuItem struct {
Name string `json:"name"`
Description string `json:"description"`
Calories int `json:"calories"`
Allergens []string `json:"allergens"`
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithOutputType(MenuItem{}),
)
if err != nil {
log.Fatal(err) // One possible error is that the response does not conform to the type.
}
モデルの出力タイプは、invopop/jsonschema
パッケージを使用して JSON スキーマとして指定されます。これにより、静的な Go 型と生成 AI モデルの予測不可能な出力のギャップを埋めるランタイム型チェックが提供されます。このシステムを使用すると、生成呼び出しが成功すると常に Go 型に適合した出力が返されるという事実に依存できるコードを作成できます。
genkit.Generate()
で出力タイプを指定すると、Genkit はバックグラウンドでいくつかの処理を行います。
- 目的の出力形式に関する追加のガイダンスをプロンプトに追加します。また、生成するコンテンツをモデルに正確に指定する副作用もあります(メニュー項目を提案するだけでなく、説明やアレルゲンのリストも生成するなど)。
- 出力がスキーマに適合していることを確認します。
- モデル出力を Go 型にマーシャリングします。
生成呼び出しが成功したときに構造化出力を取得するには、次の型の空の値を使用してモデル レスポンスで Output()
を呼び出します。
var item MenuItem
if err := resp.Output(&item); err != nil {
log.Fatalf(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
または、genkit.GenerateData()
を使用してより簡潔な呼び出しを行うこともできます。
item, resp, err := genkit.GenerateData[MenuItem](ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
この関数には出力タイプ パラメータが必要ですが、WithOutputType()
オプションが自動的に設定され、値を返す前に resp.Output()
が呼び出されます。
エラー処理
前の例では、genkit.Generate()
呼び出しでエラーが発生する可能性があります。モデルがスキーマに適合した出力を生成できない場合に、エラーが発生する可能性があります。このようなエラーに対処するための最善の方法は、具体的なユースケースによって異なりますが、ここでは一般的なヒントをいくつかご紹介します。
別のモデルを試す。構造化出力を成功させるには、モデルが JSON で出力を生成できる必要があります。Gemini などの最も強力な LLM は、これを行うのに十分な汎用性があります。ただし、Ollama で使用するローカルモデルなど、小さいモデルは、そのために特別にトレーニングされていない限り、構造化出力を確実に生成できない場合があります。
スキーマを簡素化する。LLM では、複雑な型やネストされた型を生成できない場合があります。構造化データを確実に生成できない場合は、明確な名前、フィールド数の削減、フラット化された構造を試してください。
genkit.Generate()
呼び出しを再試行する選択したモデルが適合出力の生成に失敗するのがまれな場合、ネットワーク エラーと同じようにエラーを処理し、なんらかの増分バックオフ戦略を使用してリクエストを再試行できます。
ストリーミング
大量のテキストを生成する場合は、出力が生成されるときに出力を表示する(つまり、出力をストリーミングする)ことで、ユーザー エクスペリエンスを向上させることができます。ストリーミングの動作のよくある例は、ほとんどの LLM チャットアプリで見られます。ユーザーは、メッセージに対するモデルのレスポンスが生成されるときにそれを確認できます。これにより、アプリケーションの応答性が向上し、インテリジェントな相手とチャットしているような錯覚をユーザーに与えることができます。
Genkit では、WithStreaming()
オプションを使用して出力をストリーミングできます。
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Suggest a complete menu for a pirate themed restaurant."),
ai.WithStreaming(func(ctx context.Context, chunk *ai.ModelResponseChunk) error {
// Do something with the chunk...
log.Println(chunk.Text())
return nil
}),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
マルチモーダル入力
これまでの例では、モデル プロンプトとしてテキスト文字列を使用していました。これは生成 AI モデルにプロンプトを送信する最も一般的な方法ですが、多くのモデルでは他のメディアをプロンプトとして使用することもできます。メディア プロンプトは、画像へのキャプションの追加や音声録音の文字起こしなど、メディアに対してなんらかのオペレーションを実行するようモデルに指示するテキスト プロンプトと組み合わせて使用されることがほとんどです。
メディア入力を受け入れる機能と使用できるメディアのタイプは、モデルとその API に完全に依存します。たとえば、Gemini 2.0 シリーズのモデルは、画像、動画、音声をプロンプトとして受け入れることができます。
メディア プロンプトをサポートするモデルにメディア プロンプトを提供するには、単純なテキスト プロンプトを genkit.Generate()
に渡すのではなく、メディア部分とテキスト部分で構成される配列を渡します。
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "https://example.com/photo.jpg"),
NewTextPart("Compose a poem about this image."),
),
),
)
上記の例では、一般公開されている HTTPS URL を使用してイメージを指定しました。メディアデータをデータ URL としてエンコードして直接渡すこともできます。次に例を示します。
image, err := ioutil.ReadFile("photo.jpg")
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(image)),
NewTextPart("Compose a poem about this image."),
),
),
)
メディア入力をサポートするすべてのモデルは、データ URL と HTTPS URL の両方をサポートしています。一部のモデル プラグインでは、他のメディアソースのサポートが追加されています。たとえば、Vertex AI プラグインでは、Cloud Storage(gs://
)URL を使用することもできます。
次のステップ
Genkit の詳細
- アプリ デベロッパーが生成 AI モデルの出力に影響を与える主な方法は、プロンプトを使用することです。Dotprompt を使用したプロンプトの管理で、Genkit を使用して効果的なプロンプトを開発し、コードベースで管理する方法を確認してください。
genkit.Generate()
は、生成 AI を活用したすべてのアプリケーションの中核ですが、実際のアプリケーションでは通常、生成 AI モデルの呼び出しの前後に追加の作業が必要になります。これを反映するために、Genkit ではフローのコンセプトが導入されています。フローの関数としての定義に加えて、オブザーバビリティやデプロイの簡素化などの機能が追加されています。詳細については、AI ワークフローの定義をご覧ください。
LLM の高度な使用
- LLM の機能を強化する方法の一つは、ユーザーに詳細情報をリクエストする方法や、ユーザーになんらかのアクションをリクエストする方法のリストをプロンプトで提示することです。これはツール呼び出しまたは関数呼び出しと呼ばれます。この機能をサポートするようにトレーニングされたモデルは、特別な形式のレスポンスでプロンプトに応答できます。これは、呼び出し元のアプリケーションに、なんらかのアクションを実行し、結果を元のプロンプトとともに LLM に送り返す必要があることを示します。Genkit には、プロンプトの生成と、ツール呼び出しの実装の呼び出し / レスポンス ループ要素の両方を自動化するライブラリ関数があります。詳細については、ツールの呼び出しをご覧ください。
- 検索拡張生成(RAG)は、ドメイン固有の情報をモデルの出力に導入するために使用される手法です。これは、関連する情報をプロンプトに挿入してから、言語モデルに渡すことで実現されます。完全な RAG を実装するには、テキスト エンベディング生成モデル、ベクトル データベース、大規模言語モデルなど、複数のテクノロジーを組み合わせる必要があります。Genkit がこれらのさまざまな要素を調整するプロセスを簡素化する方法については、検索拡張生成(RAG)をご覧ください。