Genkit モデル プラグインの作成

Genkit モデル プラグインは、1 つ以上の生成 AI モデルを Genkit レジストリに追加します。モデルは、プロンプトを入力として受け取り、テキスト、メディア、またはデータを出力として生成できる生成モデルを表します。

始める前に

モデル プラグインなど、あらゆる種類の Genkit プラグインの作成については、Genkit プラグインの作成をご覧ください。特に、すべてのプラグインは Init 関数をエクスポートする必要があります。この関数は、ユーザーがプラグインを使用する前に呼び出すことが想定されています。

モデル定義

通常、モデル プラグインは Init 関数で 1 つ以上の ai.DefineModel 呼び出しを行います。プラグインがインターフェースを提供するモデルごとに 1 回ずつ呼び出します。

モデル定義は次の 3 つのコンポーネントで構成されます。

  1. モデルの機能を宣言するメタデータ。
  2. モデルでサポートされている特定のパラメータを含む構成タイプ。
  3. ai.GenerateRequest を受け取り、ai.GenerateResponse を返す生成関数。おそらく、AI モデルを使用して後者を生成します。

大まかに言うと、コードでは次のようになります。

type MyModelConfig struct {
	ai.GenerationCommonConfig
	CustomOption int
	AnotherCustomOption string
}
ai.DefineModel(
	providerID, "my-model",
	&ai.ModelMetadata{
		Label: "my-model",
		Supports: ai.ModelCapabilities{
			Multiturn:  true,  // Does the model support multi-turn chats?
			SystemRole: true,  // Does the model support syatem messages?
			Media:      false, // Can the model accept media input?
			Tools:      false, // Does the model support function calling (tools)?
		},
	},
	func(ctx context.Context,
		genRequest *ai.GenerateRequest,
		_ ai.ModelStreamingCallback,
	) (*ai.GenerateResponse, error) {
		// Verify that the request includes a configuration that conforms to
		// your schema .
		if _, ok := genRequest.Config.(MyModelConfig); !ok {
			return nil, fmt.Errorf("request config must be type MyModelConfig")
		}

		// Use your custom logic to convert Genkit's ai.GenerateRequest
		// into a form usable by the model's native API.
		apiRequest, err := apiRequestFromGenkitRequest(genRequest)
		if err != nil {
			return nil, err
		}

		// Send the request to the model API, using your own code or the
		// model API's client library.
		apiResponse, err := callModelAPI(apiRequest)
		if err != nil {
			return nil, err
		}

		// Use your custom logic to convert the model's response to Genkin's
		// ai.GenerateResponse.
		response, err := genResponseFromAPIResponse(apiResponse)
		if err != nil {
			return nil, err
		}

		return response, nil
	},
)

モデルの機能の宣言

すべてのモデル定義には、メタデータの一部として、モデルがサポートする機能を宣言する ai.ModelCapabilities 値を含める必要があります。Genkit は、この情報を使用して、特定の入力がモデルに対して有効かどうかを確認するなど、特定の動作を決定します。たとえば、モデルがマルチターン インタラクションをサポートしていない場合、メッセージ履歴を渡すとエラーになります。

これらの宣言は、プラグインによって提供されるモデルの機能を参照するものであり、必ずしも基盤となるモデルとモデル API の機能に 1 対 1 でマッピングされるわけではないことに注意してください。たとえば、モデル API にシステム メッセージを定義する特定の方法が提供されていなくても、プラグインはシステムロールのサポートを宣言し、ユーザー プロンプトにシステム メッセージを挿入する特別なロジックとして実装できます。

モデルの構成スキーマの定義

モデルがサポートする生成オプションを指定するには、構成タイプを定義してエクスポートします。Genkit には、生成 AI モデルサービスでよくサポートされているオプションを含む ai.GenerationCommonConfig タイプがあります。このタイプは、埋め込むことも、そのまま使用することもできます。

生成関数は、リクエストに正しいオプション タイプが含まれていることを確認する必要があります。

リクエストやレスポンスの変換

生成関数は、Genkit モデル プラグインの主な処理を行います。ai.GenerateRequest をGenkit の共通形式からモデルの API でサポートされている形式に変換し、モデルからのレスポンスを Genkit で使用される ai.GenerateResponse 形式に変換します。

モデルの制限を回避するために、データの調整や操作が必要になる場合があります。たとえば、モデルが system メッセージをネイティブにサポートしていない場合は、プロンプトのシステム メッセージをユーザーモデル メッセージのペアに変換する必要があります。

エクスポートしたファイル

モデル プラグインは、すべてのプラグインがエクスポートしなければならないリソース(Init 関数と Config 型)に加えて、以下もエクスポートする必要があります。

  • 前述した生成構成タイプ。

  • Model 関数。プラグインで定義されたモデルへの参照を返します。多くの場合、これは単純に次のようになります。

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • オプション: DefineModel 関数。この関数により、ユーザーは、プラグインが提供できるモデルを定義できますが、自動的に定義されるわけではありません。このような関数を提供する理由は主に 2 つあります。

    • プラグインは、あまりにも多くのモデルにアクセスできるため、それぞれのモデルに登録するのは実用的ではありません。たとえば、Ollama プラグインは、数十種類のモデルにアクセスできるうえ、頻繁に追加されます。そのため、モデルは自動的に定義されず、ユーザーが使用するモデルごとに DefineModel を呼び出す必要があります。

    • まだプラグインに追加していない新しくリリースされたモデルをユーザーが使用できるようにします。

    プラグインの DefineModel 関数は通常、生成関数を定義する ai.DefineModel のフロントエンドですが、ユーザーがモデル名とモデル機能を指定できるようにします。