Infrastruttura per un'applicazione di AI generativa compatibile con RAG che utilizza 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 di AI generativa con RAG (Retrieval Augmented Generation) 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 vengono fornite un'applicazione di esempio e una configurazione Terraform.

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

Architettura

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

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

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

  • Il sottosistema di pubblicazione gestisce il flusso di 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 servizio interagisce con il sottosistema di incorporamento tramite un database vettoriale.
  • Il sottosistema di incorporamento abilita la funzionalità RAG nell'architettura. Questo sottosistema esegue le seguenti operazioni:
    • Importa i dati da origini dati in Google Cloud, on-premise e altre piattaforme cloud.
    • Converte i dati importati in incorporamenti vettoriali.
    • Archivia gli incorporamenti in un database vettoriale.

Il seguente diagramma mostra una vista dettagliata dell'architettura:

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

Come mostrato nel diagramma precedente, il deployment del server frontend, del server di inferenza e del servizio di incorporamento viene eseguito 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 dimensionalità.

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

Incorporamento di sottosistema

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

  1. I dati provenienti da origini esterne e interne vengono caricati nel bucket Cloud Storage da utenti umani o in modo programmatico. I dati caricati potrebbero essere in file, database o dati trasmessi in flusso.
  2. (non mostrato nel diagramma dell'architettura). L'attività di caricamento dati attiva un evento che viene 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 di dati, fa quanto segue:
    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 il chunking dei dati e la loro trasformazione in un formato adatto per la generazione dell'incorporamento.
    3. Esegue un job Ray per creare incorporamenti vettorializzati 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 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 specifici del dominio pertinenti.

Sottosistema di pubblicazione

Di seguito è riportato il flusso di 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 esegue 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 degli incorporamenti nel database vettoriale. La ricerca semantica aiuta a trovare gli incorporamenti in base all'intento di un prompt anziché al contenuto testuale.
    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 pubblicazione Hugging Face TGI per gestire un LLM open source come Mistral-7B-Instructo 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 configurare il monitoraggio basato su log utilizzando Cloud Monitoring. Puoi anche caricare le risposte generate in BigQuery per l'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 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 dall'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 economico e senza limiti per diversi tipi di dati. I dati sono accessibili dall'interno e dall'esterno di Google Cloud e sono replicati in più località per la ridondanza.
  • Cloud SQL: un servizio di database relazionale completamente gestito che ti consente di eseguire il provisioning, il funzionamento e la gestione dei 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 pubblicazione di LLM.
  • Ray: un framework di calcolo 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 applicazioni di AI generativa con funzionalità RAG.

Suggerimenti personalizzati sui prodotti

Un sito di shopping online potrebbe utilizzare un chatbot basato su LLM per assistere i clienti nel trovare prodotti o ricevere assistenza per gli acquisti. Le domande di un utente possono essere ampliate utilizzando dati storici sul comportamento di acquisto dell'utente e sui modelli di interazione sul sito web. I dati possono includere recensioni e feedback degli utenti archiviati in un datastore non strutturato o metriche relative alla ricerca archiviate in un data warehouse per l'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 interessanti.

Sistemi di assistenza clinica

I medici negli ospedali devono analizzare e diagnosticare rapidamente le condizioni di salute di un paziente per prendere decisioni relative alle cure e ai farmaci appropriati. Un'applicazione di AI generativa che utilizza un LLM medico come Med-PaLM può essere utilizzata per assistere i medici nel loro processo di diagnosi clinica. Le risposte generate dall'applicazione possono essere basate sui dati storici dei pazienti, contestualizzando le richieste dei medici con i dati provenienti dal database della documentazione sanitaria elettronica (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 giurisprudenza per identificare precedenti legali pertinenti o riassumere concetti legali complessi. Il risultato di queste ricerche può essere migliorato aumentando le richieste di un avvocato con dati recuperati dal corpus proprietario dello studio legale, dalle comunicazioni legali passate e dagli atti interni. Questo approccio di progettazione garantisce che le risposte generate siano pertinenti per l'ambito legale in cui l'avvocato è specializzato.

Note sul layout

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

Per indicazioni alla progettazione relative agli strumenti open source in questa architettura di riferimento, come Hugging Face TGI, consulta la documentazione di questi strumenti.

Sicurezza, privacy e conformità

Questa sezione descrive i fattori da considerare quando progetti e crei un'applicazione di AI generativa compatibile con RAG in Google Cloud che soddisfi i 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 di sicurezza, il che ti consente di concentrarti sulla sicurezza specifica del carico di lavoro. Per ulteriori informazioni, consulta le seguenti risorse:

Per garantire un controllo avanzato dell'accesso per le 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 Identity and Access Management (IAM) corretto possano accedere alle applicazioni. Per maggiori informazioni, consulta Abilitazione di IAP per GKE.

Per impostazione predefinita, i dati in GKE vengono criptati at-rest e in transito utilizzando chiavi di proprietà di Google 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 di connessione tramite IAM. Il connettore utilizza una connessione TLS 1.3 con una crittografia AES a 256 bit per verificare le identità di client e server e criptare il traffico di dati. Per le connessioni create tramite Java, Python, Go o Node.js, utilizza il Connettore di linguaggio appropriato anziché il connettore Proxy di autenticazione.

Per impostazione predefinita, Cloud SQL utilizza le chiavi di crittografia dei dati (DEK) e le chiavi di crittografia delle chiavi (KEK) di proprietà di Google e gestite da Google per criptare i dati at-rest. Se hai bisogno di utilizzare KEK che puoi controllare e gestire, puoi utilizzare le 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 su come configurare Cloud SQL al fine di soddisfare i requisiti di residenza dei dati, consulta Panoramica sulla residenza dei dati.

Cloud Storage

Per impostazione predefinita, i dati archiviati in Cloud Storage sono criptati utilizzando chiavi di proprietà e gestite da Google. Se necessario, puoi utilizzare le 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 ed elenchi di controllo dell'accesso (ACL). Nella maggior parte dei casi, consigliamo di utilizzare IAM, che consente di concedere autorizzazioni a livello di bucket e 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 Utilizzare 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 di 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.
  • L'utente richiede di creare, modificare o leggere i dati delle risorse forniti dall'utente.

Per linee guida generali sui principi di sicurezza da considerare per le applicazioni di IA, consulta Introduzione al Secure AI Framework di Google.

Affidabilità

Questa sezione descrive i fattori di progettazione che dovresti prendere in considerazione per creare e utilizzare un'infrastruttura affidabile per un'applicazione di AI generativa compatibile con RAG in Google Cloud.

Prodotto Note sul layout
GKE

Con la modalità operativa Autopilot usata 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 zone diverse all'interno di una regione. I tuoi carichi di lavoro sono affidabili contro le interruzioni di zona. 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 in modo automatico in base ai requisiti dei tuoi carichi di lavoro.

Per assicurarti che sia disponibile una capacità GPU sufficiente quando richiesto 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 di un progetto o condivisa tra più progetti. Ti vengono addebitati dei costi per le risorse prenotate anche se non viene eseguito il provisioning o l'utilizzo delle risorse. Per maggiori informazioni, consulta Utilizzo di risorse di zona riservate.

Cloud SQL

Per garantire la solidità del database vettoriale contro errori del database e interruzioni delle zone, utilizza un'istanza Cloud SQL configurata ad alta disponibilità. In caso di errore del database principale o interruzione di una zona, Cloud SQL esegue automaticamente il failover sul 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 CPU e 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 in bucket a livello di regione vengono replicati in modo sincrono tra più zone all'interno di una regione. Per una maggiore disponibilità, puoi utilizzare bucket a due o più regioni, dove 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 compatibile con RAG in Google Cloud.

Prodotto Note sul layout
GKE

In modalità Autopilot, GKE ottimizza l'efficienza dell'infrastruttura del 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 ottenendo sconti per l'utilizzo impegnato. Per maggiori informazioni, consulta la pagina Sconti per impegno di utilizzo di GKE.

Per ridurre il costo di esecuzione dell'applicazione, puoi utilizzare le VM spot per i nodi GKE. Le VM spot hanno un prezzo inferiore rispetto alle VM standard, ma non forniscono alcuna garanzia di disponibilità. Per informazioni sui vantaggi dei nodi che utilizzano le VM spot, su come funzionano 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

Una configurazione ad alta disponibilità (HA) aiuta a 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 è robusta contro le interruzioni delle zone.

Puoi rilevare se l'istanza Cloud SQL è in overprovisioning e ottimizzare la fatturazione utilizzando gli insight sui costi e i suggerimenti 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 della tua istanza Cloud SQL, puoi risparmiare denaro ottenendo sconti per l'impegno di utilizzo. Per maggiori informazioni, consulta la pagina relativa agli 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 la 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 l'eliminazione degli oggetti in base alle condizioni impostate.

Per stimare il costo 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 compatibile con RAG in Google Cloud che soddisfi i tuoi requisiti di prestazioni.

Prodotto Note sul layout
GKE Scegli classi di calcolo 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 maggiori informazioni, consulta Ottimizzare le istanze Cloud SQL con provisioning insufficiente.

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

Per aiutarti ad analizzare e migliorare le prestazioni delle query dei database, Cloud SQL offre lo strumento 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 avere una panoramica dello stato e delle prestazioni dei tuoi database e per visualizzare metriche dettagliate come il picco di connessioni e l'utilizzo del disco, puoi utilizzare la dashboard di System Insights. Per maggiori informazioni, 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 compositi paralleli. Con questa strategia, il file di grandi dimensioni viene suddiviso in blocchi. I blocchi vengono caricati in Cloud Storage in parallelo e quindi i dati vengono ricomposti nel cloud. Se la larghezza di banda della rete e la velocità del disco non costituiscono una limitazione, i caricamenti compositi 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 compositi paralleli.

Deployment

Per eseguire il deployment di una topologia basata su questa architettura di riferimento, puoi scaricare e utilizzare il codice campione open source disponibile in un repository in GitHub. Il codice campione non è destinato a casi d'uso di 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 da utilizzare come 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 basata sul web di esempio nel cluster GKE per consentirti di verificare la funzionalità RAG.

Per istruzioni su come utilizzare il 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 di 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 | Sviluppatore di soluzioni cross-product

Altri collaboratori: