Infrastruttura per un'applicazione di AI generativa con funzionalità RAG utilizzando GKE

Last reviewed 2024-04-02 UTC

Questo documento fornisce un'architettura di riferimento che puoi utilizzare per progettare l'infrastruttura per eseguire un'applicazione diAIA generativa con generazione aumentata di recupero (RAG) utilizzando Google Kubernetes Engine (GKE), Cloud SQL e strumenti open source come Ray, Hugging Face e LangChain. Per aiutarti a sperimentare con questa architettura di riferimento, in GitHub sono disponibili un'applicazione di esempio e la configurazione di Terraform.

Questo documento è rivolto agli sviluppatori che vogliono creare ed eseguire il deployment di applicazioni di AI generativa con funzionalità RAG in modo rapido utilizzando strumenti e modelli open source. Si presume che tu abbia esperienza nell'utilizzo di GKE e Cloud SQL e che tu abbia una conoscenza concettuale di AI, machine learning (ML) e modelli linguistici di grandi dimensioni (LLM). Questo documento non fornisce linee guida su come progettare e sviluppare un'applicazione di AI generativa.

Architettura

Il seguente diagramma mostra una vista generale di un'architettura per un'applicazione di AI generativa con funzionalità RAG in Google Cloud:

Un'architettura di alto livello per un'applicazione di AI generativa con funzionalità RAG in Google Cloud.

L'architettura contiene un sottosistema di pubblicazione e un sottosistema di incorporamento.

  • Il sottosistema di pubblicazione gestisce il flusso richiesta-risposta tra l'applicazione e i suoi utenti. Il sottosistema include un server frontend, un server di inferenza e un servizio di IA responsabile (RAI). Il sottosistema di pubblicazione interagisce con il sottosistema di incorporamento tramite un database vettoriale.
  • Il sottosistema di incorporamento abilita la funzionalità RAG nell'architettura. Questo sottosistema svolge le seguenti operazioni:
    • Importa dati da origini dati in Google Cloud, on-premise e in altre piattaforme cloud.
    • Converte i dati importati in incorporamenti vettoriali.
    • Archivia gli incorporamenti in un database vettoriale.

Il seguente diagramma mostra una visualizzazione dettagliata dell'architettura:

Un'architettura dettagliata per un'applicazione di AI generativa con funzionalità RAG in Google Cloud.

Come mostrato nel diagramma precedente, viene eseguito il deployment del server frontend, del server di inferenza e del servizio di incorporamento in un cluster GKE a livello di regione in modalità Autopilot. I dati per RAG vengono importati tramite un bucket Cloud Storage. L'architettura utilizza un'istanza Cloud SQL per PostgreSQL con l'estensione pgvector come database vettoriale per archiviare gli incorporamenti ed eseguire ricerche semantiche. I database vettoriali sono progettati per archiviare e recuperare in modo efficiente vettori ad alta dimensione.

Le seguenti sezioni descrivono i componenti e il flusso di dati all'interno di ciascun sottosistema dell'architettura.

Sottosistema di incorporamento

Di seguito è riportato il flusso di dati nel sottosistema di incorporamento:

  1. I dati di origini esterne e interne vengono caricati nel bucket Cloud Storage da utenti umani o in modo programmatico. I dati caricati potrebbero trovarsi in file, database o flussi di dati.
  2. (non viene mostrato nel diagramma dell'architettura). L'attività di caricamento dei dati attiva un evento pubblicato in un servizio di messaggistica come Pub/Sub. Il servizio di messaggistica invia una notifica al servizio di incorporamento.
  3. Quando il servizio di incorporamento riceve una notifica di un evento di caricamento dei dati, effettua le seguenti operazioni:
    1. Recupera i dati dal bucket Cloud Storage tramite il driver CSI di Cloud Storage FUSE.
    2. Legge i dati caricati e li pre-elabora utilizzando Ray Data. La pre-elaborazione può includere la suddivisione dei dati e la loro trasformazione in un formato adatto per la generazione dell'incorporamento.
    3. Esegue un job Ray per creare incorporamenti vettoriali dei dati pre-elaborati utilizzando un modello open source come intfloat/multilingual-e5-small di cui viene eseguito il deployment nello stesso cluster.
    4. Scrive gli incorporamenti vettoriali nel database vettoriale di Cloud SQL per PostgreSQL.

Come descritto nella sezione seguente, quando il sottosistema di gestione elabora le richieste degli utenti, utilizza gli incorporamenti nel database vettoriale per recuperare i dati pertinenti specifici del dominio.

Sottosistema di pubblicazione

Di seguito è riportato il flusso richiesta-risposta nel sottosistema di pubblicazione:

  1. Un utente invia una richiesta in linguaggio naturale a un server frontend tramite un'interfaccia di chat basata sul web. Il server frontend viene eseguito su GKE.
  2. Il server frontend esegue un processo LangChain che effettua le seguenti operazioni:
    1. Converte la richiesta in linguaggio naturale in incorporamenti utilizzando lo stesso modello e gli stessi parametri utilizzati dal servizio di incorporamento.
    2. Recupera i dati di grounding pertinenti eseguendo una ricerca semantica per gli incorporamenti nel database vettoriale. La ricerca semantica aiuta a trovare gli incorporamenti in base all'intento di un prompt anziché ai suoi contenuti testuali.
    3. Crea un prompt contestualizzato combinando la richiesta originale con i dati di grounding recuperati.
    4. Invia il prompt contestualizzato al server di inferenza, che viene eseguito su GKE.
  3. Il server di inferenza utilizza il framework di gestione Hugging Face TGI per gestire un LLM open source come Mistral-7B-Instruct o un modello aperto Gemma.
  4. L'LLM genera una risposta al prompt e il server di inferenza invia la risposta al server frontend.

    Puoi archiviare e visualizzare i log dell'attività richiesta-risposta in Cloud Logging e puoi configurare il monitoraggio basato su log utilizzando Cloud Monitoring. Puoi anche caricare le risposte generate in BigQuery per le analisi offline.

  5. Il server frontend richiama un servizio RAI per applicare i filtri di sicurezza richiesti alla risposta. Puoi utilizzare strumenti come Sensitive Data Protection e l'API Cloud Natural Language per scoprire, filtrare, classificare e anonimizzare i contenuti sensibili nelle risposte.

  6. Il server frontend invia la risposta filtrata all'utente.

Prodotti utilizzati

Di seguito è riportato un riepilogo dei prodotti Google Cloud e open source utilizzati nell'architettura precedente:

Prodotti Google Cloud

  • Google Kubernetes Engine (GKE): un servizio Kubernetes che puoi utilizzare per eseguire il deployment e gestire applicazioni containerizzate su larga scala utilizzando l'infrastruttura di Google.
  • Cloud Storage: un archivio di oggetti a basso costo e senza limitazioni per tipi di dati diversi. I dati sono accessibili dall'interno e dall'esterno di Google Cloud e sono replicati tra località per ridondanza.
  • Cloud SQL: un servizio di database relazionale completamente gestito che ti consente di eseguire il provisioning, l'esecuzione e la gestione dei tuoi database MySQL, PostgreSQL e SQL Server su Google Cloud.

Prodotti open source

  • Hugging Face Text Generation Inference (TGI): un toolkit per il deployment e la gestione degli LLM.
  • Ray: un framework di computing unificato open source che consente di scalare i carichi di lavoro di AI e Python.
  • LangChain: un framework per lo sviluppo e il deployment di applicazioni basate su LLM.

Casi d'uso

RAG è una tecnica efficace per migliorare la qualità dell'output generato da un LLM. Questa sezione fornisce esempi di casi d'uso per cui puoi usare applicazioniAIA generativa con funzionalità RAG.

Suggerimenti personalizzati sui prodotti

Un sito di shopping online potrebbe utilizzare un chatbot LLM per aiutare i clienti a trovare prodotti o a ricevere assistenza in merito agli acquisti. Le domande di un utente possono essere migliorate utilizzando i dati storici sul comportamento di acquisto dell'utente e sui modelli di interazione sul sito web. I dati potrebbero includere recensioni e feedback degli utenti archiviati in un datastore non strutturato o metriche relative alla ricerca archiviate in un data warehouse di analisi dei dati web. La domanda aumentata può quindi essere elaborata dall'LLM per generare risposte personalizzate che l'utente potrebbe trovare più accattivanti e convincenti.

Sistemi di assistenza clinica

I medici negli ospedali devono analizzare e diagnosticare rapidamente la condizione di salute di un paziente per prendere decisioni sulle cure e sui farmaci appropriati. Un'applicazione di AI generativa che utilizza un LLM medico come Med-PaLM può essere utilizzata per assistere i medici nel processo di diagnosi clinica. Le risposte generate dall'applicazione possono basarsi su cartelle cliniche storiche dei pazienti, contestualizzando le richieste dei medici con i dati del database delle cartelle cliniche elettroniche (EHR) dell'ospedale o da una knowledge base esterna come PubMed.

La ricerca legale basata sull'IA generativa consente agli avvocati di interrogare rapidamente grandi volumi di statuti e di giurisdizioni per identificare precedenti giuridici pertinenti o riassumere concetti legali complessi. I risultati di questa ricerca possono essere migliorati potenziando le richieste di un avvocato con dati recuperati dal corpus di contratti di proprietà dello studio legale, dalle comunicazioni legali passate e dai registri interni dei casi. Questo approccio di progettazione garantisce che le risposte generate siano pertinenti per il dominio legale in cui l'avvocato è specializzato.

Note sul layout

Questa sezione fornisce indicazioni per aiutarti a sviluppare ed eseguire un'architettura di AI generativa con funzionalità RAG ospitata da GKE che soddisfa i tuoi requisiti specifici di sicurezza e conformità, affidabilità, costi e prestazioni. Le indicazioni contenute in questa sezione non sono esaustive. A seconda dei requisiti specifici della tua applicazione e dei prodotti e delle funzionalità Google Cloud che utilizzi, potresti dover prendere in considerazione ulteriori fattori di progettazione e compromessi.

Per indicazioni sulla progettazione relativi agli strumenti open source in questa architettura di riferimento, ad esempio Hugging Face TGI, consulta la documentazione relativa a questi strumenti.

Sicurezza, privacy e conformità

Questa sezione descrive i fattori da considerare quando progetti e crei un'applicazione di AI generativa con funzionalità RAG in Google Cloud che soddisfi i tuoi requisiti di sicurezza, privacy e conformità.

Prodotto Note sul layout
GKE

Nella modalità operativa Autopilot, GKE preconfigura il cluster e gestisce i nodi in base alle best practice per la sicurezza, consentendoti di concentrarti sulla sicurezza specifica del carico di lavoro. Per ulteriori informazioni, consulta le seguenti risorse:

Per garantire un controllo dell'accesso avanzato dell'accesso alle applicazioni in esecuzione su GKE, puoi utilizzare Identity-Aware Proxy (IAP). IAP si integra con la risorsa GKE Ingress e garantisce che solo gli utenti autenticati con il ruolo IAM (Identity and Access Management) corretto possano accedere alle applicazioni. Per maggiori informazioni, consulta Abilitazione di IAP per GKE.

Per impostazione predefinita, i dati in GKE sono criptati at-rest e in transito utilizzando chiavi di proprietà e gestite da Google. Come ulteriore livello di sicurezza per i dati sensibili, puoi criptare i dati a livello di applicazione utilizzando una chiave di tua proprietà e gestita con Cloud KMS. Per maggiori informazioni, consulta Criptare i secret a livello di applicazione.

Se utilizzi un cluster GKE standard, puoi utilizzare le seguenti funzionalità aggiuntive di crittografia dei dati:

Cloud SQL

L'istanza Cloud SQL nell'architettura non deve essere accessibile dalla rete internet pubblica. Se è necessario un accesso esterno all'istanza Cloud SQL, puoi criptare le connessioni esterne utilizzando SSL/TLS o il connettore proxy di autenticazione Cloud SQL. Il connettore proxy di autenticazione fornisce l'autorizzazione della connessione utilizzando IAM. Il connettore utilizza una connessione TLS 1.3 con una crittografia AES a 256 bit per verificare le identità client e server e criptare il traffico dati. Per le connessioni create utilizzando Java, Python, Go o Node.js, utilizza il connettore di lingua appropriato anziché il connettore proxy di autenticazione.

Per impostazione predefinita, Cloud SQL utilizza chiavi di crittografia dei dati (DEK) e chiavi di crittografia delle chiavi (KEK) di proprietà e gestite da Google per criptare i dati at-rest. Se devi utilizzare KEK controllate e gestite da te, puoi utilizzare chiavi di crittografia gestite dal cliente (CMEK).

Per impedire l'accesso non autorizzato all'API Cloud SQL Admin, puoi creare un perimetro di servizio utilizzando i Controlli di servizio VPC.

Per informazioni sulla configurazione di Cloud SQL per soddisfare i requisiti di residenza dei dati, consulta la panoramica sulla residenza dei dati.

Cloud Storage

Per impostazione predefinita, i dati archiviati in Cloud Storage vengono criptati utilizzando chiavi di proprietà e gestite da Google. Se necessario, puoi utilizzare CMEK o le tue chiavi che gestisci utilizzando un metodo di gestione esterno come le chiavi di crittografia fornite dal cliente (CSEK). Per maggiori informazioni, consulta Opzioni di crittografia dei dati.

Cloud Storage supporta due metodi per controllare l'accesso degli utenti ai bucket e agli oggetti: IAM e elenchi di controllo dell'accesso (ACL). Nella maggior parte dei casi, consigliamo di utilizzare IAM, che consente di concedere le autorizzazioni a livello di bucket e di progetto. Per maggiori informazioni, consulta Panoramica del controllo dell'accesso.

I dati caricati nel sottosistema di importazione dati tramite Cloud Storage potrebbero includere dati sensibili. Per proteggere questi dati, puoi utilizzare Sensitive Data Protection per scoprire, classificare e anonimizzare i dati. Per maggiori informazioni, consulta Utilizzo di Sensitive Data Protection con Cloud Storage.

Per ridurre il rischio di esfiltrazione di dati da Cloud Storage, puoi creare un perimetro di servizio utilizzando i Controlli di servizio VPC.

Cloud Storage ti aiuta a soddisfare i requisiti di residenza dei dati. I dati vengono archiviati o replicati all'interno delle regioni specificate.

Tutti i prodotti in questa architettura

Gli audit log delle attività di amministrazione sono abilitati per impostazione predefinita per tutti i servizi Google Cloud utilizzati in questa architettura di riferimento. Puoi accedere ai log tramite Cloud Logging e utilizzarli per monitorare le chiamate API o altre azioni che modificano la configurazione o i metadati delle risorse Google Cloud.

Anche gli audit log di accesso ai dati sono abilitati per impostazione predefinita per tutti i servizi Google Cloud in questa architettura. Puoi utilizzare questi log per monitorare quanto segue:

  • Chiamate API che leggono la configurazione o i metadati delle risorse.
  • Gli utenti richiedono di creare, modificare o leggere i dati delle risorse forniti dall'utente.

Per indicazioni generali sui principi di sicurezza da considerare per le applicazioni dell'IA, consulta la pagina Introduzione al framework di IA sicuro di Google.

Affidabilità

Questa sezione descrive i fattori di progettazione che devi prendere in considerazione per creare e gestire un'infrastruttura affidabile per un'applicazione di AI generativa con funzionalità RAG in Google Cloud.

Prodotto Note sul layout
GKE

Con la modalità operativa Autopilot utilizzata in questa architettura, GKE offre le seguenti funzionalità di affidabilità integrate:

  • Il carico di lavoro utilizza un cluster GKE a livello di regione. Il piano di controllo e i nodi worker sono distribuiti in tre diverse zone all'interno di una regione. I tuoi carichi di lavoro sono affidabili contro le interruzioni delle zone. I cluster GKE a livello di regione hanno uno SLA di uptime più elevato rispetto ai cluster di zona.
  • Non è necessario creare nodi o gestire i pool di nodi. GKE crea automaticamente i pool di nodi e li scala automaticamente in base ai requisiti dei tuoi carichi di lavoro.

Per assicurarti che sia disponibile una capacità GPU sufficiente quando richiesta per la scalabilità automatica del cluster GKE, puoi creare e utilizzare prenotazioni. Una prenotazione fornisce capacità garantita in una zona specifica per una risorsa specificata. Una prenotazione può essere specifica per un progetto o condivisa tra più progetti. Ti vengono addebitati dei costi per le risorse prenotate anche se le risorse non vengono sottoposte a provisioning o non vengono utilizzate. Per maggiori informazioni, consulta Utilizzo di risorse di zona riservate.

Cloud SQL

Per garantire che il database vettoriale sia robusto contro guasti del database e interruzioni delle zone, utilizza un'istanza Cloud SQL configurata ad alta disponibilità. In caso di errore del database principale o di interruzione di una zona, Cloud SQL esegue il failover automatico nel database in standby in un'altra zona. Non è necessario modificare l'indirizzo IP per l'endpoint del database.

Per assicurarti che le tue istanze Cloud SQL siano coperte dallo SLA, segui le linee guida operative consigliate. Ad esempio, assicurati che la CPU e la memoria siano dimensionate correttamente per il carico di lavoro e abilita gli aumenti automatici dello spazio di archiviazione. Per maggiori informazioni, consulta le linee guida operative.

Cloud Storage Puoi creare bucket Cloud Storage in uno dei tre tipi di località: a livello di regione, a due regioni o a più regioni. I dati archiviati nei bucket a livello di regione vengono replicati in modo sincrono in più zone all'interno di una regione. Per una maggiore disponibilità, puoi utilizzare bucket a due o più regioni, in cui i dati vengono replicati in modo asincrono tra le regioni.

Ottimizzazione dei costi

Questa sezione fornisce indicazioni per aiutarti a ottimizzare i costi di configurazione e gestione di un'applicazione di AI generativa con funzionalità RAG in Google Cloud.

Prodotto Note sul layout
GKE

In modalità Autopilot, GKE ottimizza l'efficienza dell'infrastruttura del tuo cluster in base ai requisiti dei carichi di lavoro. Non è necessario monitorare costantemente l'utilizzo delle risorse o gestire la capacità per controllare i costi.

Se puoi prevedere l'utilizzo di CPU, memoria e spazio di archiviazione temporaneo del tuo cluster GKE Autopilot, puoi risparmiare denaro ottenendo sconti per l'utilizzo per impegno di utilizzo. Per maggiori informazioni, consulta Sconti per impegno di utilizzo di GKE.

Per ridurre i costi di esecuzione dell'applicazione, puoi utilizzare le VM spot per i nodi GKE. Le VM spot hanno un costo inferiore rispetto alle VM standard, ma non offrono alcuna garanzia di disponibilità. Per informazioni sui vantaggi dei nodi che utilizzano le VM spot, sul loro funzionamento in GKE e su come pianificare i carichi di lavoro su questi nodi, consulta VM spot.

Per ulteriori indicazioni sull'ottimizzazione dei costi, consulta le best practice per l'esecuzione di applicazioni Kubernetes con ottimizzazione dei costi su GKE.

Cloud SQL

La configurazione ad alta disponibilità consente di ridurre i tempi di inattività per il database Cloud SQL quando la zona o l'istanza non è più disponibile. Tuttavia, il costo di un'istanza configurata ad alta disponibilità è superiore a quello di un'istanza autonoma. Se non hai bisogno dell'alta disponibilità per il database vettoriale, puoi ridurre i costi utilizzando un'istanza autonoma, che non è affidabile in caso di interruzioni delle zone.

Puoi rilevare se per la tua istanza Cloud SQL è stato eseguito l'overprovisioning e ottimizzare la fatturazione utilizzando gli insight e i suggerimenti sui costi di Cloud SQL basati su Active Assist. Per maggiori informazioni, consulta Ridurre le istanze Cloud SQL con overprovisioning.

Se puoi prevedere i requisiti di CPU e memoria dell'istanza Cloud SQL, puoi risparmiare ottenendo sconti per impegno di utilizzo. Per maggiori informazioni, consulta gli sconti per impegno di utilizzo di Cloud SQL.

Cloud Storage Per il bucket Cloud Storage che utilizzi per caricare i dati nel sottosistema di importazione dati, scegli una classe di archiviazione appropriata. Quando scegli la classe di archiviazione, considera i requisiti di conservazione dei dati e frequenza di accesso dei tuoi carichi di lavoro. Ad esempio, per controllare i costi di archiviazione, puoi scegliere la classe Standard e utilizzare Gestione del ciclo di vita degli oggetti. In questo modo è possibile eseguire il downgrade automatico degli oggetti a una classe di archiviazione a costi inferiori o eliminare gli oggetti in base alle condizioni impostate.

Per stimare i costi delle risorse Google Cloud, utilizza il Calcolatore prezzi di Google Cloud.

Ottimizzazione delle prestazioni

Questa sezione descrive i fattori da considerare quando progetti e crei un'applicazione di AI generativa con funzionalità RAG in Google Cloud che soddisfi i tuoi requisiti di prestazioni.

Prodotto Note sul layout
GKE Scegli le classi di computing appropriate per i tuoi pod in base ai requisiti di prestazioni dei carichi di lavoro. Per i pod che eseguono il server di inferenza e il servizio di incorporamento, ti consigliamo di utilizzare un tipo di macchina GPU come nvidia-l4.
Cloud SQL

Per ottimizzare le prestazioni dell'istanza Cloud SQL, assicurati che la CPU e la memoria allocate all'istanza siano adeguate per il carico di lavoro. Per saperne di più, consulta Ottimizzare le istanze Cloud SQL con provisioning insufficiente.

Per migliorare il tempo di risposta per la ricerca vettoriale approssimativa del vicino più prossimo (ANN), utilizza l'indice Inverted File with Flat Compression (IVFFlat) o Hierarchical Navigable Small World (HNSW).

Per aiutarti ad analizzare e migliorare le prestazioni delle query dei database, Cloud SQL fornisce uno strumento di Query Insights. Puoi utilizzare questo strumento per monitorare le prestazioni e tracciare l'origine di una query problematica. Per maggiori informazioni, consulta Utilizzare Query Insights per migliorare le prestazioni delle query.

Per ottenere una panoramica dello stato e delle prestazioni dei tuoi database e per visualizzare metriche dettagliate come picchi di connessioni e utilizzo del disco, puoi utilizzare la dashboard di System Insights. Per saperne di più, consulta Utilizzare gli insight sul sistema per migliorare le prestazioni del sistema.

Cloud Storage Per caricare file di grandi dimensioni, puoi utilizzare un metodo chiamato caricamenti composti paralleli. Con questa strategia, il file di grandi dimensioni viene suddiviso in blocchi. I blocchi vengono caricati in Cloud Storage in parallelo, quindi i dati vengono ricomposti nel cloud. Quando la larghezza di banda e la velocità del disco non sono un fattore limitante, i caricamenti composti paralleli possono essere più veloci delle normali operazioni di caricamento. Tuttavia, questa strategia presenta alcune limitazioni e implicazioni in termini di costi. Per maggiori informazioni, consulta Caricamenti composti paralleli.

Deployment

Per eseguire il deployment di una topologia basata su questa architettura di riferimento, puoi scaricare e utilizzare il codice open source di esempio disponibile in un repository in GitHub. Il codice campione non è destinato ai casi d'uso in produzione. Puoi utilizzare il codice per sperimentare la configurazione dell'infrastruttura AI per un'applicazione di AI generativa abilitata per RAG.

Il codice di esempio esegue queste operazioni:

  1. Esegue il provisioning di un'istanza Cloud SQL per PostgreSQL in modo che funga da database vettoriale.
  2. Esegue il deployment di Ray, JupyterHub e Hugging Face TGI in un cluster GKE da te specificato.
  3. Esegue il deployment di un'applicazione chatbot di esempio basata sul web nel tuo cluster GKE per consentirti di verificare la funzionalità RAG.

Per istruzioni sull'utilizzo del codice campione, consulta il documento README per il codice. Se si verificano errori quando utilizzi il codice campione e se non esistono problemi di GitHub aperti per gli errori, crea i problemi in GitHub.

Il codice campione esegue il deployment delle risorse Google Cloud fatturabili. Quando hai finito di utilizzare il codice, rimuovi tutte le risorse che non ti servono più.

Passaggi successivi

Collaboratori

Autore: Kumar Dhanagopal | Cross-Product Solution Developer

Altri collaboratori: