関数呼び出しのチュートリアル

<ph type="x-smartling-placeholder"></ph>

関数呼び出しを使用すると、構造化データの出力を 説明します。その後、これらの出力を使用して他の API を呼び出し、 レスポンス データをモデルに送ります。つまり関数呼び出しは 生成モデルを外部システムに接続して、生成されたコンテンツが に最新の正確な情報が含まれています。

Gemini モデルに関数の説明を提供できます。これらは アプリケーションの言語で記述する関数(つまり、 Google Cloud Functions)。モデルから、関数を呼び出して値を返すよう求められる場合があります。 モデルがクエリを処理できるよう支援します。

まだご覧になっていない場合は、 関数呼び出しの概要で学習する できます。

照明制御用の API の例

基本的な照明制御システムとアプリケーション プログラミング インターフェース(API)を使用していて、ユーザーがシンプルな テキスト リクエスト。関数呼び出し機能を使用してライティングを解釈できる API 呼び出しに変換して照明を設定する API 呼び出しに変換し、 使用できます。この架空の照明制御システムを使用して、 明るさと色温度です parameters:

パラメータ タイプ 必須 / 省略可 説明
brightness 数値 あり 光レベル(0 ~ 100)。ゼロがオフで、100 が最大の明るさです。
colorTemperature 文字列 あり 照明器具の色温度(daylightcoolwarm)。

わかりやすくするため、この架空の照明システムにはライトが 1 つしかないため、ユーザーは 客室や場所を指定する必要はありません。これが JSON リクエストの例です。 照明制御 API に送信して照明レベルを 50% に 昼光色温度を使うと次の式になります

{
  "brightness": "50",
  "colorTemperature": "daylight"
}

このチュートリアルでは、Gemini API の関数呼び出しを設定して、 ユーザーの照明リクエストを解釈し、API 設定にマッピングして 明るさと色温度の値に基づいて変化します

始める前に: プロジェクトと API キーを設定する

Gemini API を呼び出す前に、プロジェクトをセットアップして、 取得します。

API 関数を定義する

API リクエストを行う関数を作成します。この関数を定義する必要があります。 コード内で使用できますが、外部からサービスや API を呼び出すことはできます。 説明します。Gemini API は、この関数を直接呼び出しません。そのため、 この機能をアプリケーションで実行する方法とタイミングを制御できます。 できます。デモを目的として、このチュートリアルで定義するモック API 関数では、 リクエストされた照明の値を返すだけです。

func setLightValues(brightness int, colorTemp string) map[string]any {
    // This mock API returns the requested lighting values
    return map[string]any{
        "brightness":       brightness,
        "colorTemperature": colorTemp}
}

関数宣言を作成する

生成モデルに渡す関数宣言を作成します。日時 モデルで使用する関数を宣言する場合は、その関数を 可能な限り多くしてください。生成モデル この情報を基に、どの機能を選択するのか、またどのような機能を パラメータの値です。次のコードは、 照明コントロール関数を宣言します。

lightControlTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "controlLight",
        Description: "Set the brightness and color temperature of a room light.",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "brightness": {
                    Type:        genai.TypeString,
                    Description: "Light level from 0 to 100. Zero is off and"+
                        " 100 is full brightness.",
                },
                "colorTemperature": {
                    Type:        genai.TypeString,
                    Description: "Color temperature of the light fixture which" +
                        " can be `daylight`, `cool` or `warm`.",
                },
            },
            Required: []string{"brightness", "colorTemperature"},
        },
    }},
}

モデルの初期化時に関数を宣言する

モデルで関数呼び出しを使用する場合は、 モデル オブジェクトを初期化するときに明示的に指定します。関数を宣言する モデルの Tools パラメータを設定します。

// ...

lightControlTool := &genai.Tool{
    // ...
}

// Use a model that supports function calling, like a Gemini 1.5 model
model := client.GenerativeModel("gemini-1.5-flash")

// Specify the function declaration.
model.Tools = []*genai.Tool{lightControlTool}

関数呼び出しを生成する

関数宣言でモデルを初期化したら、プロンプトを使用して、 モデルを定義します。関数呼び出しを使用するには、 チャット プロンプト(SendMessage())。関数呼び出しのメリットは一般的に プロンプトやレスポンスのコンテキストがあります。

// Start new chat session.
session := model.StartChat()

prompt := "Dim the lights so the room feels cozy and warm."

// Send the message to the generative model.
resp, err := session.SendMessage(ctx, genai.Text(prompt))
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Check that you got the expected function call back.
part := resp.Candidates[0].Content.Parts[0]
funcall, ok := part.(genai.FunctionCall)
if !ok {
    log.Fatalf("Expected type FunctionCall, got %T", part)
}
if g, e := funcall.Name, lightControlTool.FunctionDeclarations[0].Name; g != e {
    log.Fatalf("Expected FunctionCall.Name %q, got %q", e, g)
}
fmt.Printf("Received function call response:\n%q\n\n", part)

apiResult := map[string]any{
    "brightness":  "30",
    "colorTemperature":  "warm" }

// Send the hypothetical API result back to the generative model.
fmt.Printf("Sending API result:\n%q\n\n", apiResult)
resp, err = session.SendMessage(ctx, genai.FunctionResponse{
    Name:     lightControlTool.FunctionDeclarations[0].Name,
    Response: apiResult,
})
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Show the model's response, which is expected to be text.
for _, part := range resp.Candidates[0].Content.Parts {
    fmt.Printf("%v\n", part)
}