Usare Ricerca vettoriale con un token OAuth

Questo notebook illustra come chiamare un endpoint di Ricerca vettoriale usando l'SDK di ricerca vettoriale o HTTP con un nuovo token OAuth. In entrambi i casi viene usato il percorso ottimizzato per la rete, come consigliato per qualsiasi carico di lavoro di produzione.

Le chiamate HTTP per la creazione di un token e la chiamata dell'endpoint possono essere implementate in un linguaggio di propria scelta. Per le applicazioni di produzione, tenere presente che il token deve essere aggiornato ogni 60 minuti. Per evitare errori dovuti a un token non aggiornato, Databricks consiglia di aggiornarlo a intervalli inferiori a 60 minuti.

Setup

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

Costanti di configurazione

Per informazioni dettagliate su come creare un Principal del Servizio, consultare la documentazione di 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')}"

Ricerca vettoriale di query usando il client Python

Per informazioni dettagliate, vedere la documentazione dell'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)

Chiamare La ricerca vettoriale usando una richiesta HTTP

Questa sezione illustra come chiamare un indice di ricerca vettoriale usando HTTP, che è quindi possibile implementare in uno strumento o in un linguaggio di propria scelta.

Generare un token OAuth usando una chiamata API

Per chiamare un endpoint usando un percorso ottimizzato per la rete, è necessario un token OAuth. Il codice seguente crea il token.

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")

Ricerca vettoriale con query utilizzando il client Python

Per usare JavaScript o altri strumenti per eseguire query sulla ricerca vettoriale, creare la query e inviarla all'endpoint di ricerca vettoriale.

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))

Notebook di esempio

Usare Ricerca vettoriale con un token OAuth

Ottieni il notebook