Les outils OpenAPI permettent au coach IA de récupérer dynamiquement des données à partir d'API à distance en fonction du contexte de la conversation.
Avant de commencer
Si vous rencontrez des difficultés avec des API préexistantes, utilisez l'approche flexible suivante :
- Créez des fonctions Cloud Run en tant qu'encapsuleur de l'API préexistante. Les fonctions Cloud Run renseignent les paramètres requis supplémentaires et effectuent le post-traitement des réponses de l'API.
- créer un outil OpenAPI pour appeler vos fonctions Cloud Run ;
Alors que l'API Datastore peut nécessiter des paramètres d'entrée supplémentaires, tels que la définition du mode de résultat de recherche, une fonction Cloud Run ne nécessite qu'un seul paramètre (requête), que le coach IA peut extraire du contexte de la conversation. En termes de traitement des réponses, les fonctions Cloud Run ne renvoient que le résultat le plus pertinent au lieu de tous les résultats.
Pour accéder à Datastore, procédez comme suit :
Étape 1 : Créer un datastore et une application de recherche
- Suivez les étapes décrites dans Datastore pour créer Datastore.
- Suivez les étapes pour créer une application de recherche.
- Vérifiez l'application Datastore et de recherche à l'aide de l'API pour vérifier son type de solution, son niveau de recherche et si le découpage est activé.
Exécutez la commande suivante pour récupérer le chunking.
gcurl -sX GET \ "https://discoveryengine.googleapis.com/v1alpha/projects/${project_id}/locations/global/collections/default_collection/dataStores/${data_store_id}/documentProcessingConfig"
L'exemple suivant montre que le découpage est activé.
{ "name": "projects/${project_id}/locations/global/collections/default_collection/dataStores/${data_store_id}/documentProcessingConfig", "chunkingConfig": { "layoutBasedChunkingConfig": { "chunkSize": 500, "includeAncestorHeadings": true } }, "defaultParsingConfig": { "digitalParsingConfig": {} } }
Exécutez la commande suivante pour récupérer le type de solution et le niveau de recherche.
gcurl -X GET \ "https://discoveryengine.googleapis.com/v1alpha/projects/${project_id}/locations/global/collections/default_collection/engines/${data_store_id}"
L'exemple suivant montre que le type de solution et le niveau de recherche sont validés.
{ "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" }
Étape 2 : Créer des fonctions Cloud Run pour appeler Datastore
Pour vous authentifier, configurez vos fonctions Cloud Run de sorte qu'elles nécessitent un jeton d'identité. Les fonctions Cloud Run permettent d'encapsuler des API complexes dans des API de base. Voici ce qu'ils permettent de faire :
- Renseigne les champs supplémentaires de la demande.
- Appelle l'API Datastore pour effectuer la recherche.
- Traite la réponse de l'API et renvoie les meilleurs résultats.
Après avoir créé des fonctions Cloud Run, créez un outil OpenAPI pour les appeler.
Dans l'exemple suivant, les fonctions Cloud Run convertissent l'API Datastore pour effectuer des recherches et vous fournir une liste de résultats.
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
Utilisez Shell pour tester les fonctions Cloud Run. Essayez d'envoyer une requête comme quel est le prix de l'iPhone 13, comme indiqué dans l'exemple suivant.
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"
Vous devriez obtenir une réponse semblable à la suivante :
{"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"}
Étape 3 : Créer un outil OpenAPI
Suivez les étapes décrites dans les outils OpenAPI et Integration Connectors pour créer un outil OpenAPI.
L'exemple suivant montre comment l'outil OpenAPI interagit avec la nouvelle API fournie par vos fonctions Cloud Run.
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."
Étape 4 : Créez un générateur
Suivez les étapes décrites dans Outil OpenAPI pour créer un générateur de coachs IA. Utilisez le contenu du générateur de coach IA pour créer des requêtes LLM.