Vai al contenuto principale
BlogCalcoloPerché i sistemi di intelligenza artificiale usano i database vettoriali per migliorare le prestazioni e ridurre i costi

Perché i sistemi di intelligenza artificiale utilizzano i database vettoriali per migliorare le prestazioni e ridurre i costi

Perché i sistemi_AI utilizzano i database vettoriali per migliorare le prestazioni e ridurre i costi

L'addestramento dell'intelligenza artificiale richiede molte risorse. Per insegnare a un modello a comprendere il linguaggio, le immagini o l'audio sono necessari enormi set di dati, algoritmi avanzati e hardware specializzato (leggi: costose GPU). Ma anche una volta completato l'addestramento, l'esecuzione delle inferenze (il processo di generazione dei risultati) può essere altrettanto impegnativo.

Interrogare un LLM in tempo reale per ogni richiesta dell'utente non è solo costoso, ma anche inefficiente. Soprattutto quando la risposta potrebbe già esistere. Per risolvere questa sfida, i team di sviluppo si sono rivolti ai database vettoriali.

A differenza dei database tradizionali, che si basano sulle corrispondenze esatte delle parole chiave, i database vettoriali memorizzano le informazioni sotto forma di incorporazioni ad alta dimensione, come rappresentazioni numeriche di dati quali testo, immagini o suoni. In questo modo è possibile eseguire ricerche semantiche. Invece di cercare parole esatte, si cerca un significato.

Questa distinzione è essenziale in casi d'uso come:

  • Generazione aumentata dal recupero (RAG)
  • Motori di raccomandazione
  • Sistemi di risposta alle domande
  • Ricerca semantica

Con i database vettoriali, i sistemi di intelligenza artificiale possono recuperare informazioni rilevanti in modo più rapido ed efficiente, saltando inutili chiamate di inferenza quando la risposta esiste già nell'indice vettoriale. Esistono diverse soluzioni di database vettoriali, ma oggi vi parlerò di pgvector, un'estensione open-source di PostgreSQL che uso personalmente e che consiglio. Analizzeremo i motivi per cui ritengo che sia un ottimo strumento e come potete iniziare a usarlo.

Perché pgvector è un ottimo strumento per gli sviluppatori

Per cominciare, pgvector integra le funzionalità di ricerca vettoriale direttamente in PostgreSQL, uno dei database relazionali più diffusi al mondo. Per gli sviluppatori e i team che già lavorano in un ambiente basato su PostgreSQL, questo rappresenta un'opzione senza soluzione di continuità e a basso attrito per la creazione di applicazioni intelligenti.

Invece di introdurre un nuovo stack separato da gestire, pgvector consente ai team di archiviare e interrogare sia i dati relazionali che quelli vettoriali in un unico luogo. Questa unificazione elimina la complessità di sincronizzare database diversi e consente un ciclo di vita di sviluppo più semplice. Le applicazioni di intelligenza artificiale spesso richiedono la combinazione di diversi tipi di query, come filtri strutturati, ricerca full-text e similarità semantica, il tutto in un'unica operazione. pgvector supporta questo modello di ricerca ibrida in modo nativo, consentendo agli sviluppatori di combinare il punteggio di similarità vettoriale con filtri e join basati su SQL. In questo modo è possibile ricercare un corpus di documenti non solo per parola chiave, ma anche per significato semantico, applicando filtri come la categoria del documento o i permessi dell'utente, all'interno di un'unica query SQL.

pgvector è costruito per garantire scalabilità e prestazioni reali. Per le applicazioni che devono fornire risultati rapidi su milioni di incorporazioni, pgvector supporta la ricerca approssimativa del vicino (ANN) attraverso il metodo di indicizzazione IVFFlat. Ciò consente di ottenere risposte rapide per le applicazioni sensibili alla latenza, come le barre di ricerca alimentate dall'intelligenza artificiale o i sistemi di raccomandazione, mantenendo un buon equilibrio tra precisione e velocità. Per i team che sviluppano in Python, pgvector si integra senza problemi nelle librerie client PostgreSQL più diffuse, come psycopg2, asyncpg e SQLAlchemy, rendendolo facile da inserire nelle pipeline di dati e nei flussi di lavoro ML esistenti.

La versatilità di pgvector si sta rivelando preziosa in tutti i settori. Le organizzazioni di e-commerce lo usano per creare raccomandazioni personalizzate e aumentare le conversioni. Una grande piattaforma mediatica lo utilizza per far emergere contenuti rilevanti, mantenendo gli utenti impegnati. I team del settore sanitario e delle scienze della vita si affidano a questo sistema per velocizzare la ricerca, la scoperta di composti e le analisi diagnostiche. In molte aziende tecnologiche, il sistema consente di fornire assistenza basata su LLM e strumenti interni più intelligenti. 

Ciò che rende pgvector ancora più potente è la sua distribuzione su una piattaforma come Akamai Cloud. La soluzione cloud di Akamai offre ai team l'infrastruttura gestita, la scalabilità e le prestazioni globali di cui hanno bisogno per carichi di lavoro di livello produttivo. PostgreSQL gestito su Akamai consente agli sviluppatori di distribuire applicazioni supportate da pgvector senza preoccuparsi dei costi operativi. Grazie ai backup automatici, alla sicurezza integrata e alle opzioni di autoscaling, il vostro stack rimane resistente mentre il vostro team rimane concentrato sulla costruzione. Inoltre, poiché l'infrastruttura di rete e di calcolo di Akamai è ottimizzata per la distribuzione globale, le applicazioni che si basano su motori di inferenza veloce o di raccomandazione in tempo reale beneficiano di una latenza inferiore e di una maggiore affidabilità su scala.

Se state già usando PostgreSQL o state cercando un motore di ricerca vettoriale pronto per l'intelligenza artificiale che non richieda una revisione completa dello stack, nella prossima sezione vi spiegherò come iniziare con pgvector. 

Iniziare con pgvector su Akamai

  1. Eseguite il provisioning di un cluster PostgreSQL utilizzando il dashboard Managed Databases di Akamai.
    1. Accedere a Cloud Manager.
    2. Dal menu principale, selezionare Database.
    3. Fate clic su Crea cluster di database.
    4. Nel campo Etichetta cluster, inserire un'etichetta per identificare facilmente il cluster sul proprio account. L'etichetta deve essere alfanumerica e compresa tra 3 e 32 caratteri.
    5. Selezionare il motore del database per il nuovo database.
    6. Selezionare la regione in cui risiederà il cluster di database. 
    7. Ogni nodo di un cluster di database è costruito su un proprio Linode. Nella sezione Scegliere un piano, selezionare il tipo di Linode e il piano che i nodi utilizzeranno. 
    8. Cliccare Creare un cluster di database. Il provisioning completo del cluster richiede circa 10-15 minuti. È possibile monitorare lo stato esaminando il file Stato nell'elenco Cluster di database.

      Nota: è possibile eseguire il provisioning anche utilizzando le API.
  2. Accedere al cluster
    Per collegarsi direttamente al database dalla riga di comando, è possibile utilizzare lo strumento psql. Questo strumento è incluso nella maggior parte delle installazioni del server PostgreSQL, anche se è possibile installarlo separatamente sulla maggior parte dei sistemi operativi.

    Usate il comando psql qui sotto per connettervi al vostro database, sostituendo [host] e [username] con i valori corrispondenti nella sezione dei dettagli del collegamento.

    psql --host=[host] --username=[username] --password --dbname=postgres
  3. Installare un'estensione
    Per installare una delle estensioni disponibili sul database, utilizzare il comando CREATE EXTENSION, sostituendo [nome_estensione] con il nome dell'estensione che si desidera installare. In questo caso, l'estensione è vector.

    CREATE EXTENSION vector;
  4. Definire le colonne del vettore
    Dopo aver installato l'estensione vettoriale, si ha accesso a un nuovo tipo di dati chiamato vettore. La dimensione del vettore (indicata tra parentesi) rappresenta il numero di dimensioni memorizzate nel vettore. Per questo esempio, useremo 13, ma per un caso d'uso reale sarebbe nell'ordine delle migliaia.

    CREATE TABLE items ( id serial PRIMARY KEY, description text, embedding vector(13) );
  5. Inserire gli embeddings del modello ML (come ad es. OpenAI o Viso abbracciato). Per raccogliere embeddings di esempio, è possibile utilizzare il seguente script Python , adattato dalla demo di Hugging Face. È necessario ottenere un token Hugging Face perché questo esempio funzioni.

    import requests
    import psycopg2
    import os

    # Hugging Face Configuration
    model_id = "sentence-transformers/all-MiniLM-L6-v2"
    hf_token = os.environ.get("HF_TOKEN") # Set an environmental variable called HF_TOKEN with your Hugging Face token
    api_url = f"https://router.huggingface.co/hf-inference/models/{model_id}"
    headers = {"Authorization": f"Bearer {hf_token}"}

    # Database Configuration
    db_conn_string = os.environ.get("DB_CONN_STRING") # Replace with your connection string or set an env var

    # Source for Embeddings
    source_sentence = "How do I get Medicare?"
    sentences = [
        "How do I get a replacement Medicare card?",
        "What is the monthly premium for Medicare Part B?",
        "How do I terminate my Medicare Part B (medical insurance)?",
        "How do I sign up for Medicare?",
        "Can I sign up for Medicare Part B if I am working and have health insurance through an employer?",
        "How do I sign up for Medicare Part B if I already have Part A?",
        "What are Medicare late enrollment penalties?",
        "What is Medicare and who can get it?",
        "How can I get help with my Medicare Part A and Part B premiums?",
        "What are the different parts of Medicare?",
        "Will my Medicare premiums be higher because of my higher income?",
        "What is TRICARE ?",
        "Should I sign up for Medicare Part B if I have Veterans' Benefits?"
    ]

    # Hugging Face API Query Function
    def get_embeddings(source_sentence, sentences):
        """Queries the Hugging Face API to get sentence embeddings."""
        try:
            response = requests.post(
                Api_url,
                headers=headers,
                json={"inputs": { "source_sentence": source_sentence, "sentences": sentences }, "options": {"wait_for_model": True}}
            )
            response.raise_for_status()  # Raise an exception for bad status codes (4xx or 5xx)
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"Error querying Hugging Face API: {e}")
            return None

    # Main Execution
    print("Fetching embeddings from Hugging Face...")
    embeddings = get_embeddings(source_sentence, sentences)

    if embeddings:
        print(f"Successfully fetched {len(embeddings)} embeddings.")
        conn = None
        Try:
            # Establish connection to the database
            print("Connecting to the PostgreSQL database...")
            conn = psycopg2.connect(db_conn_string)
            cur = conn.cursor()
            print("Connection successful.")

            # Insert descriptions and embeddings into the database
            print("Inserting data into the 'items' table...")
            for description, embedding in zip(sentences, embeddings):
                # The pgvector extension expects the vector as a string representation of a list
                cur.execute(
                    "INSERT INTO items (description, embedding) VALUES (%s, %s)",
                    (description, embeddings)
                )

            # Commit the transaction to make the changes permanent
            conn.commit()
            print(f"Successfully inserted {cur.rowcount} records into the database.")

        except psycopg2.Error as e:
            print(f"Database error: {e}")
            if conn:
                conn.rollback() # Rollback the transaction on error

        Finally:
            # Ensure the connection is closed
            if conn:
                cur.close()
                conn.close()
                print("Database connection closed.")

  6. Utilizzare l'indicizzazione e la ricerca di pgvector
    Create the index after the table has some data

    CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);

    SELECT *, embedding <-> query_embedding AS similarity FROM items ORDER BY similarity LIMIT 5;

I database vettoriali stanno aiutando i team a ottimizzare le prestazioni, a ridurre i costi di inferenza e a offrire esperienze utente più intelligenti e veloci, e le estensioni come pgvector rendono più facile portare la ricerca semantica e le query ibride in ambienti familiari come PostgreSQL, senza rivedere la vostra architettura. 

Per saperne di più su come distribuire e usare pgVector e le altre estensioni disponibili, consultate i nostri documenti

Ti potrebbe interessare anche...

Commenti

Lascia una risposta

Il vostro indirizzo e-mail non sarà pubblicato. I campi obbligatori sono contrassegnati da *