Utiliser la recherche vectorielle avec un jeton OAuth

Ce notebook montre comment appeler un point de terminaison de recherche vectorielle en utilisant le SDK de recherche vectorielle ou via HTTP avec un nouveau jeton OAuth. Dans les deux cas, le chemin optimisé pour le réseau est utilisé, comme recommandé pour toute charge de travail de production.

Les appels HTTP pour créer un jeton et appeler le point de terminaison peuvent être implémentés dans une langue de votre choix. Pour les applications de production, gardez à l’esprit que le jeton doit être actualisé toutes les 60 minutes. Pour éviter les erreurs en raison d’un jeton obsolète, Databricks recommande de l’actualiser à un intervalle de moins de 60 minutes.

Paramétrage

%pip install databricks-sdk
%pip install databricks-vectorsearch
dbutils.library.restartPython()
import requests
import json
import random
from databricks.sdk import WorkspaceClient
import logging

Constantes de configuration

Pour plus d’informations sur la création d’un principal de service, consultez la documentation Databricks.

# Define the secret ID and secret for the service principal
CLIENT_ID = dbutils.secrets.get(scope="scope", key="service_principal_client_id")
CLIENT_SECRET = dbutils.secrets.get(scope="scope", key="service_principal_client_secret")

# You can get it by clicking the copy button next to the index name
INDEX_NAME="UC_CATALOG_INDEX_NAME"
ENDPOINT_NAME="ENDPOINT_NAME"

workspace_url = f"https://{spark.conf.get('spark.databricks.workspaceUrl')}"

Recherche vectorielle de requête à l’aide du client Python

Pour plus d’informations, consultez la documentation de l’API.

from databricks.vector_search.client import VectorSearchClient

vsc_dp = VectorSearchClient(
  service_principal_client_id=CLIENT_ID,
  service_principal_client_secret=CLIENT_SECRET,
  workspace_url=workspace_url)

index = vsc_dp.get_index(endpoint_name=ENDPOINT_NAME, index_name=INDEX_NAME)
index.similarity_search(["text"], query_vector=[0]*2560, num_results=5, debug_level=0)

Appeler la recherche vectorielle à l’aide d’une requête HTTP

Cette section montre comment appeler un index de recherche vectorielle à l’aide de HTTP, que vous pouvez ensuite implémenter dans un outil ou un langage de votre choix.

Générer un jeton OAuth à l’aide d’un appel d’API

Pour appeler un point de terminaison à l’aide d’un chemin optimisé réseau, vous avez besoin d’un jeton OAuth. Le code suivant crée le jeton.

url = f"{workspace_url}/oidc/v1/token"
deets = json.dumps([
                {
                    "type": "unity_catalog_permission",
                    "securable_type": "table",
                    "securable_object_name": INDEX_NAME,
                    "operation": ("ReadVectorIndex"),
                },
            ])
payload = { 'grant_type': 'client_credentials', 'scope': 'all-apis', 'authorization_details': deets}

response = requests.post(
    url=url,
    auth=(CLIENT_ID, CLIENT_SECRET),
    headers={"Content-Type": "application/x-www-form-urlencoded"},
    data=payload,
)
if response.status_code != 200:
    logging.error(f"OAuth token request failed: {response.status_code} - {response.text}")
    response.raise_for_status()

token_data = response.json()
access_token = token_data.get("access_token")
if not access_token:
    raise ValueError("Failed to get access token")

Recherche vectorielle de requête à l’aide du client Python

Pour utiliser JavaScript ou un autre outil pour interroger la recherche vectorielle, créez la requête et envoyez-la au point de terminaison de recherche vectorielle.

index = vsc_dp.get_index(endpoint_name=ENDPOINT_NAME, index_name=INDEX_NAME)
index_url = index.index_url
print(index_url)

headers = {"Authorization": f"Bearer {access_token}"}
payload = {
    "query_vector": [0]*2560,
    "num_results": 5,
    "columns": ["text"]}

response = requests.post(index_url+"/query", headers=headers, data=json.dumps(payload))
print(response.status_code)
print(json.dumps(response.json(), indent=2))

Exemple de bloc-notes

Utiliser la recherche vectorielle avec un jeton OAuth

Obtenir un ordinateur portable