Datastore にアクセスするように OpenAPI ツールを設定する

OpenAPI ツールを使用すると、AI コーチは会話のコンテキストに基づいてリモート API からデータを動的に取得できます。

始める前に

既存の API で問題が発生した場合は、次の柔軟なアプローチを使用します。

  1. 既存の API のラッパーとして Cloud Run functions を作成します。Cloud Run functions は、追加の必須パラメータを入力し、API レスポンスの後処理を行います。
  2. Cloud Run functions を呼び出す OpenAPI ツールを作成します。

Datastore API では、検索結果モードの設定など、追加の入力パラメータが必要になる場合がありますが、Cloud Run functions では、AI コーチが会話のコンテキストから抽出できる 1 つのパラメータ(クエリ)のみが必要です。レスポンス処理に関して、Cloud Run functions はすべての結果ではなく、上位の一致のみを返します。

次の手順に沿って、Datastore にアクセスします。

  1. Datastore の手順に沿って、Datastore を作成します。
  2. 検索アプリを作成するの手順に沿って設定します。
  3. API を使用して Datastore と検索アプリを確認し、ソリューション タイプ、検索階層、チャンク分割が有効になっているかどうかを確認します。

次のコマンドを実行して、チャンク分割を取得します。

gcurl -sX GET \
"https://discoveryengine.googleapis.com/v1alpha/projects/${project_id}/locations/global/collections/default_collection/dataStores/${data_store_id}/documentProcessingConfig"

次の例は、チャンク分割が有効になっていることを示しています。

{
  "name": "projects/${project_id}/locations/global/collections/default_collection/dataStores/${data_store_id}/documentProcessingConfig",
  "chunkingConfig": {
    "layoutBasedChunkingConfig": {
      "chunkSize": 500,
      "includeAncestorHeadings": true
    }
  },
  "defaultParsingConfig": {
    "digitalParsingConfig": {}
  }
}

次のコマンドを実行して、ソリューション タイプと検索階層を取得します。

gcurl -X GET \
"https://discoveryengine.googleapis.com/v1alpha/projects/${project_id}/locations/global/collections/default_collection/engines/${data_store_id}"

次の例は、ソリューション タイプと検索階層が検証されていることを示しています。

{
  "name": "projects/${project_id}/locations/global/collections/default_collection/engines/${data_store_id}",
  "displayName": "iphone_",
  "dataStoreIds": [
    "${data_store_id}"
  ],
  "solutionType": "SOLUTION_TYPE_SEARCH",
  "searchEngineConfig": {
    "searchTier": "SEARCH_TIER_ENTERPRISE"
  },
  "commonConfig": {
    "companyName": "Google"
  },
  "industryVertical": "GENERIC"
}

ステップ 2: Datastore を呼び出す Cloud Run functions を作成する

認証を行うには、ID トークンを要求するように Cloud Run functions を構成します。Cloud Run functions は、複雑な API を基本的な API にラップするのに役立ちます。次の処理を行います。

  1. リクエストに追加のフィールドを入力します。
  2. Datastore API を呼び出して検索を実行します。
  3. API レスポンスを処理し、上位の結果を返します。

Cloud Run functions を作成したら、OpenAPI ツールを作成して Cloud Run functions を呼び出します。

次の例では、Cloud Run functions は Datastore API を変換して検索を実行し、検索結果のリストを表示します。

import os
import requests
import google.auth
import google.auth.transport.requests
import functions_framework

@functions_framework.http
def call_vertex_search(request):
  """
  HTTP Cloud Function to invoke a Vertex AI Search endpoint.
  """

  # --- Configuration - Tailor to your Vertex AI Search specifics ---
  project_id = ${project_id}
  engine_id = "${data_store_id}"

  # Establish the Vertex AI Search endpoint URL
  endpoint = f"https://discoveryengine.googleapis.com/v1alpha/projects/${project_id}/locations/global/collections/default_collection/engines/{engine_id}/servingConfigs/default_chat:search"

  # --- Acquire Authentication Token ---
  try:
    credentials, project = google.auth.default()
    auth_req = google.auth.transport.requests.Request()
    credentials.refresh(auth_req)
    token = credentials.token
  except Exception as e:
    print(f"Authentication token retrieval error: {e}")
    return f"Authentication token retrieval error: {e}", 500

  headers = {
      "Authorization": f"Bearer {token}",
      "Content-Type": "application/json",
  }

  # --- Formulate Search Query ---
  # Extract the query from the request; otherwise, employ a default.
  request_json = request.get_json(silent=True)
  query = "what is the price of iphone 13?"  # Default query
  if request_json and 'query' in request_json:
    query = request_json['query']

  payload = {
      "query": query,
      "page_size": 5,
      "content_search_spec": {
          "search_result_mode": "CHUNKS"
      }
      # Additional search parameters, such as filters or boost_spec, can be appended here.
      # "filter": "some_attribute:ANY(\"value\")",
  }

  # --- Execute Vertex AI Search API Call ---
  try:
    response = requests.post(endpoint, headers=headers, json=payload)
    response.raise_for_status()  # Trigger an exception for unfavorable status codes.

    search_results = response.json()
    print(f"Search results: {search_results}")

    extracted_data = search_results["results"][0]["chunk"]["content"]

    if extracted_data is not None:
      print(f"Extracted data: {extracted_data}")
      return {"content": extracted_data}, 200
    else:
      print("Failed to extract search results from the response.")
      return "Failed to extract search results from the response", 404

  except requests.exceptions.RequestException as e:
    print(f"Vertex AI Search invocation error: {e}")
    if e.response is not None:
      print(f"Error details: {e.response.text}")
      return f"Vertex AI Search invocation error: {e.response.text}", e.response.status_code
    return f"Vertex AI Search invocation error: {e}", 500
  except Exception as e:
    print(f"An unanticipated error transpired: {e}")
    return f"An unanticipated error transpired: {e}", 500

Shell を使用して Cloud Run functions をテストします。次の例に示すように、「_iphone 13 の価格はいくらですか_」のようなクエリを送信してみてください。

export CLOUDSDK_CORE_PROJECT=${project_id}
curl -H "Authorization: Bearer "$(gcloud auth print-identity-token) -H "X-Goog-User-Project: ${CLOUDSDK_CORE_PROJECT}" -H "Content-Type: application/json; charset=utf-8" -X GET "https://${CLOUD_FUNCTION_ENDPOINT}/?query=what%20is%20the%20price%20of%20iphone%2013"

次のようなレスポンスが返されます。

{"content":"Table of contents\niPhone price history iPhone 4S (2011)\niPhone 4S original starting MSRP: $199\nInflation-adjusted iPhone 4S price: $280\niPhone 5 (2012)\niPhone 5 Original starting MSRP: $199\nInflation-adjusted iPhone 5 price: $276\niPhone 5S/5C (2013) iPhone 5S original starting MSRP: $199\niPhone 5C original starting MSRP: $99\nInflation-adjusted iPhone 5S price: $270\nInflation-adjusted iPhone 5C price: $134\niPhone 6/6 Plus (2014) Table of contents\niPhone price history iPhone 6 original starting MSRP: $199\niPhone 6 Plus original starting MSRP: $299\nInflation-adjusted iPhone 6 price: $266\nInflation-adjusted iPhone 6 Plus price: $398\niPhone 6S/6S Plus (2015)\niPhone 6S original starting MSRP: $199\niPhone 6S Plus original starting MSRP: $299\nInflation-adjusted iPhone 6S price: $265\nInflation-adjusted iPhone 6S Plus price: $397\niPhone 7/7 Plus (2016) Table of contents\niPhone price history iPhone 7 original starting MSRP: $649\niPhone 7 Plus original starting MSRP: $769\nInflation-adjusted iPhone 7 price: $854\nInflation-adjusted iPhone 7 Plus price: $1,011\niPhone 8/8 Plus (2017)\niPhone 8 original starting MSRP: $699\niPhone 8 Plus original starting MSRP: $799\nInflation-adjusted iPhone 8 price: $900\nInflation-adjusted iPhone 8 Plus price: $1,029\niPhone X (2017)\niPhone X original starting MSRP: $999\nInflation-adjusted iPhone X Plus price: $1,287\niPhone XR (2018)\niPhone XR original starting MSRP: $749\nInflation-adjusted iPhone XR Plus price: $942\niPhone XS/S Max (2018) Table of contents\niPhone price history iPhone XS original starting MSRP: $999\niPhone XS Max original starting MSRP: $1,099\nInflation-adjusted iPhone XS price: $1,254\nInflation-adjusted iPhone XS Plus price: $1,380\niPhone 11/Pro/Pro Max (2019)\niPhone 11 original starting MSRP: $699\niPhone 11 Pro original starting MSRP: $999\niPhone 11 Pro Max original starting MSRP: $1099\nInflation-adjusted iPhone 11 price: $863\nInflation-adjusted iPhone 11 Pro price: $1,232\nInflation-adjusted iPhone 11 Pro Max price: $1,355\niPhone 12/Mini/Pro/Pro Max (2020)\niPhone 12 original starting MSRP: $799 Table of contents\niPhone price history Login iPhone 12 Mini original starting MSRP: $699\niPhone 12 Pro original starting MSRP: $999\niPhone 12 Pro Max original starting MSRP: $1099\nInflation-adjusted iPhone 12 price: $976\nInflation-adjusted iPhone 12 Mini price: $853\nInflation-adjusted iPhone 12 Pro price: $1,218\nInflation-adjusted iPhone 12 Pro Max price: $1,340 iPhone 13/Mini/Pro/Pro Max (2021)\niPhone 13 original starting MSRP: $799\niPhone 13 Mini original starting MSRP: $699\niPhone 13 Pro original starting MSRP: $999\niPhone 13 Pro Max original starting MSRP: $1099\nInflation-adjusted iPhone 13 price: $931\nInflation-adjusted iPhone 13 Mini price: $814\nInflation-adjusted iPhone 13 Pro price: $1,163\nInflation-adjusted iPhone 13 Pro Max price: $1,279\niPhone 14/Plus/Pro/Pro Max (2022) Table of contents\niPhone price history Robert Triggs / Android Authority"}

ステップ 3: OpenAPI ツールを作成する

OpenAPI ツールと Integration Connectors ツールに記載されている手順に沿って、OpenAPI ツールを作成します。

次の例は、OpenAPI ツールが Cloud Run functions によって提供される新しい API とどのように連携するかを示しています。

openapi: 3.0.0
info:
  title: iphone_price_tool
  description: An API to search document about iPhone prices.
  version: 1.0.0
servers:
  - url: https://${CLOUD_FUNCTION_ENDPOINT}
paths:
  /:
    get:
      summary: Search information about iphone prices
      operationId: search
      parameters:
        - in: query
          name: query
          schema:
            type: string
          required: true
          description: The user's question about iphone price
      responses:
        '200':
          description: Retrieved information about iphone price
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                    description: Information about iphone price
        '400':
          description: Bad request, query parameter is missing.
          content:
            text/plain:
              schema:
                type: string
                example: "Please provide a 'query' as a URL parameter for POST requests (e.g., ?query=your_question)."
        '500':
          description: Internal server error.
          content:
            text/plain:
              schema:
                type: string
                example: "Error querying: An unexpected error occurred."

ステップ 4: ジェネレータを作成する

OpenAPI ツールに記載されている手順に沿って、AI コーチ ジェネレータを作成します。AI コーチ ジェネレータのコンテンツを使用して、LLM プロンプトを作成します。