Crea applicazioni AI generative pronte per la produzione per la ricerca aziendale utilizzando le pipeline di Haystack e Amazon SageMaker JumpStart con LLMs

Crea applicazioni AI generative per la ricerca aziendale con Haystack, Amazon SageMaker JumpStart e LLMs pronte per la produzione.

Questo post sul blog è scritto in collaborazione con Tuana Çelik di deepset.

La ricerca aziendale è un componente critico dell’efficienza organizzativa attraverso la digitalizzazione dei documenti e la gestione delle conoscenze. La ricerca aziendale riguarda la memorizzazione di documenti come file digitali, l’indicizzazione dei documenti per la ricerca e la fornitura di risultati pertinenti in base alle query degli utenti. Con l’avvento dei grandi modelli di linguaggio (LLM), possiamo implementare esperienze conversazionali nella fornitura dei risultati agli utenti. Tuttavia, è necessario assicurarsi che gli LLM limitino le risposte ai dati dell’azienda, mitigando così le allucinazioni del modello.

In questo post, mostriamo come costruire un’applicazione AI generativa end-to-end per la ricerca aziendale con Retrieval Augmented Generation (RAG) utilizzando le pipeline di Haystack e il modello Falcon-40b-instruct di Amazon SageMaker JumpStart e Amazon OpenSearch Service. Il codice sorgente per l’esempio mostrato in questo post è disponibile nel repository GitHub.

Panoramica della soluzione

Per limitare le risposte dell’applicazione AI generativa solo ai dati dell’azienda, è necessario utilizzare una tecnica chiamata Retrieval Augmented Generation (RAG). Un’applicazione che utilizza l’approccio RAG recupera le informazioni più pertinenti alla richiesta dell’utente dalla base di conoscenza o dal contenuto aziendale, le raggruppa come contesto insieme alla richiesta dell’utente come prompt e le invia quindi all’LLM per ottenere una risposta. Gli LLM hanno limitazioni per il conteggio massimo di parole per i prompt di input, quindi la scelta dei passaggi giusti tra migliaia o milioni di documenti aziendali ha un impatto diretto sull’accuratezza dell’LLM.

La tecnica RAG è diventata sempre più importante nella ricerca aziendale. In questo post mostriamo un flusso di lavoro che sfrutta SageMaker JumpStart per distribuire un modello Falcon-40b-instruct e utilizza Haystack per progettare ed eseguire una pipeline di question answering con recupero aumentato. Il flusso di lavoro di recupero finale copre i seguenti passaggi di alto livello:

  1. La query dell’utente viene utilizzata per un componente di recupero, che effettua una ricerca vettoriale, per recuperare il contesto più pertinente dal nostro database.
  2. Questo contesto viene incorporato in un prompt progettato per istruire un LLM a generare una risposta solo dal contesto fornito.
  3. L’LLM genera una risposta alla query originale considerando solo il contesto incorporato nel prompt ricevuto.

SageMaker JumpStart

SageMaker JumpStart funge da hub di modelli che racchiude una vasta gamma di modelli di deep learning per casi d’uso di testo, visione, audio e embedding. Con oltre 500 modelli, il suo hub di modelli comprende modelli pubblici e proprietari dei partner di AWS come AI21, Stability AI, Cohere e LightOn. Ospita anche modelli di base sviluppati esclusivamente da Amazon, come AlexaTM. Alcuni dei modelli offrono funzionalità per consentire di ottimizzarli con i propri dati. SageMaker JumpStart fornisce inoltre modelli di soluzione che configurano l’infrastruttura per casi d’uso comuni e notebook eseguibili di esempio per il machine learning (ML) con SageMaker.

Haystack

Haystack è un framework open-source di deepset che consente agli sviluppatori di orchestrare applicazioni LLM composte da diversi componenti come modelli, database vettoriali, convertitori di file e innumerevoli altri moduli. Haystack fornisce pipeline e Agenti, due strutture potenti per la progettazione di applicazioni LLM per vari casi d’uso, tra cui ricerca, question answering e conversational AI. Con un grande focus sui metodi di recupero all’avanguardia e su metriche di valutazione solide, fornisce tutto il necessario per sviluppare un’applicazione affidabile e sicura. È possibile serializzare le pipeline in file YAML, esporle tramite un’API REST e scalarle in modo flessibile in base ai carichi di lavoro, semplificando il passaggio dell’applicazione dalla fase di prototipo alla produzione.

Amazon OpenSearch

OpenSearch Service è un servizio completamente gestito che semplifica la distribuzione, l’escalabilità e il funzionamento di OpenSearch nel cloud AWS. OpenSearch è una suite di software open source scalabile, flessibile ed estensibile per applicazioni di ricerca, analisi, monitoraggio della sicurezza e osservabilità, con licenza Apache 2.0.

Negli ultimi anni, le tecniche di apprendimento automatico sono diventate sempre più popolari per migliorare la ricerca. Tra queste vi sono l’utilizzo di modelli di embedding, un tipo di modello in grado di codificare un grande corpo di dati in uno spazio n-dimensionale in cui ogni entità è codificata in un vettore, un punto dati in tale spazio, e organizzata in modo tale che le entità simili siano più vicine tra loro. Un database vettoriale fornisce una ricerca efficiente delle similarità vettoriali fornendo indici specializzati come gli indici k-NN.

Con le capacità del database vettoriale di OpenSearch Service, è possibile implementare la ricerca semantica, RAG con LLM, motori di raccomandazione e ricerca di contenuti multimediali ricchi. In questo post, utilizziamo RAG per consentirci di integrare LLM generativi con una base di conoscenza esterna che di solito viene creata utilizzando un database vettoriale arricchito con articoli di conoscenza codificati in vettori.

Panoramica dell’applicazione

Il diagramma seguente rappresenta la struttura dell’applicazione finale.

In questa applicazione, utilizziamo la Haystack Indexing Pipeline per gestire i documenti caricati e indicizzare i documenti, e la Haystack Query Pipeline per eseguire il recupero delle conoscenze dai documenti indicizzati.

La Haystack Indexing Pipeline include i seguenti passaggi di alto livello:

  1. Carica un documento.
  2. Inizializza DocumentStore e indica i documenti.

Utilizziamo OpenSearch come il nostro DocumentStore e una pipeline di indicizzazione Haystack per elaborare e indicizzare i nostri file su OpenSearch. I FileConverters e il PreProcessor di Haystack ti consentono di pulire e preparare i tuoi file grezzi in modo che possano essere gestiti dalla tua pipeline di elaborazione del linguaggio naturale (NLP) e dal modello linguistico scelto. La pipeline di indicizzazione che abbiamo utilizzato qui utilizza anche sentence-transformers/all-MiniLM-L12-v2 per creare embedding per ogni documento, che utilizziamo per un recupero efficiente.

La Haystack Query Pipeline include i seguenti passaggi di alto livello:

  1. Inviare una query alla pipeline RAG.
  2. Un componente EmbeddingRetriever agisce come un filtro che recupera i documenti più rilevanti top_k dai nostri documenti indicizzati in OpenSearch. Utilizziamo il nostro modello di embedding per incorporare sia la query che i documenti (nell’indicizzazione) per ottenere questo risultato.
  3. I documenti recuperati vengono incorporati nella nostra richiesta al modello Falcon-40b-instruct.
  4. LLM restituisce una risposta basata sui documenti recuperati.

Per il rilascio del modello, utilizziamo SageMaker JumpStart, che semplifica il rilascio dei modelli con un semplice clic. Sebbene abbiamo utilizzato e testato Falcon-40b-instruct per questo esempio, è possibile utilizzare qualsiasi modello Hugging Face disponibile su SageMaker.

La soluzione finale è disponibile sul repository haystack-sagemaker e utilizza il sito web e la documentazione di OpenSearch (per OpenSearch 2.7) come dati di esempio per eseguire il recupero delle risposte alle domande.

Prerequisiti

La prima cosa da fare prima di poter utilizzare i servizi AWS è assicurarsi di aver effettuato l’iscrizione e creato un account AWS. Successivamente, è necessario creare un utente e un gruppo amministrativo. Per istruzioni su entrambi i passaggi, fare riferimento a “Configurazione dei prerequisiti di Amazon SageMaker”.

Per poter utilizzare Haystack, è necessario installare il pacchetto farm-haystack con le dipendenze richieste. Per fare ciò, utilizzare il file requirements.txt nel repository di GitHub eseguendo il comando pip install requirements.txt.

Indicizzazione dei documenti su OpenSearch

Haystack offre diversi connettori per i database, chiamati DocumentStores. Per questo flusso di lavoro RAG, utilizziamo OpenSearchDocumentStore. Il repository di esempio include una pipeline di indicizzazione e un modello di CloudFormation di AWS per configurare un OpenSearchDocumentStore con documenti acquisiti dal sito web e dalle pagine di documentazione di OpenSearch.

Spesso, per far funzionare un’applicazione NLP per casi d’uso di produzione, è necessario pensare alla preparazione e alla pulizia dei dati. Questo è coperto dalle pipeline di indicizzazione di Haystack, che ti permettono di progettare i tuoi passaggi di preparazione dati, che alla fine scrivono i tuoi documenti nel database scelto.

Una pipeline di indicizzazione può includere anche un passaggio per creare embedding per i tuoi documenti. Questo è molto importante per il passaggio di recupero. Nel nostro esempio, utilizziamo sentence-transformers/all-MiniLM-L12-v2 come modello di embedding. Questo modello viene utilizzato per creare embedding per tutti i nostri documenti indicizzati, ma anche per la query dell’utente al momento della ricerca.

Per indicizzare i documenti nel OpenSearchDocumentStore, forniamo due opzioni con istruzioni dettagliate nel file README del repository di esempio. Qui, spiegheremo i passaggi per l’indicizzazione su un servizio OpenSearch distribuito su AWS.

Avviare un servizio OpenSearch

Utilizzare il modello di CloudFormation fornito per configurare un servizio OpenSearch su AWS. Eseguendo il comando seguente, otterrai un servizio OpenSearch vuoto. Puoi quindi scegliere se indicizzare i dati di esempio che abbiamo fornito o utilizzare i tuoi dati, che puoi pulire e preprocessare utilizzando la pipeline di indicizzazione di Haystack. Si noti che ciò crea un’istanza aperta a Internet, il che non è consigliato per l’uso in produzione.

```bash
aws cloudformation create-stack --stack-name HaystackOpensearch --template-body file://cloudformation/opensearch-index.yaml --parameters ParameterKey=InstanceType,ParameterValue=r5.large.search ParameterKey=InstanceCount,ParameterValue=3 ParameterKey=OSPassword,ParameterValue=Password123!
```

Permetti circa 30 minuti per il completamento del lancio dello stack. Puoi controllare il suo progresso sulla console di AWS CloudFormation navigando alla pagina Stacks e cercando lo stack chiamato HaystackOpensearch.

Indicizza i documenti in OpenSearch

Ora che abbiamo un servizio OpenSearch in esecuzione, possiamo utilizzare la classe OpenSearchDocumentStore per connetterci ad esso e scrivere i nostri documenti.

Per ottenere l’hostname di OpenSearch, esegui il seguente comando:

```bash
aws cloudformation describe-stacks --stack-name HaystackOpensearch --query "Stacks[0].Outputs[?OutputKey=='OpenSearchEndpoint'].OutputValue" --output text
```

Prima di tutto, esporta quanto segue:

```bash
export OPENSEARCH_HOST='your_opensearch_host'
export OPENSEARCH_PORT=443
export OPENSEARCH_USERNAME=admin
export OPENSEARCH_PASSWORD=Password123!
```

Successivamente, puoi utilizzare lo script opensearch_indexing_pipeline.py per preprocessare ed indicizzare i dati demo forniti.

Se desideri utilizzare i tuoi dati, modifica la pipeline di indicizzazione in opensearch_indexing_pipeline.py per includere le fasi di setup del FileConverter e del PreProcessor che richiedi.

Implementa la pipeline di Answering delle domande di recupero aumentate

Ora che abbiamo indicizzato i dati in OpenSearch, possiamo eseguire il Question Answering su questi documenti. Per questa pipeline RAG, utilizziamo il modello Falcon-40b-instruct che abbiamo distribuito su SageMaker JumpStart.

Hai anche la possibilità di distribuire il modello in modo programmato da un notebook Jupyter. Per istruzioni, consulta il repository GitHub.

  1. Cerca il modello Falcon-40b-instruct su SageMaker JumpStart.

  2. Effettua il deploy del tuo modello su SageMaker JumpStart e prendi nota del nome del punto di accesso.

  3. Esporta i seguenti valori:

    ```bash
    export SAGEMAKER_MODEL_ENDPOINT=your_falcon_40b_instruc_endpoint
    export AWS_PROFILE_NAME=your_aws_profile
    export AWS_REGION_NAME=your_aws_region
    ```
  4. Esegui python rag_pipeline.py.

Questo avvierà un’utilità a linea di comando che attende una domanda dall’utente. Ad esempio, chiediamo “Come posso installare la cli di OpenSearch?”

Questo risultato viene ottenuto perché abbiamo definito la nostra prompt nella Haystack PromptTemplate come segue:

```python
question_answering = PromptTemplate(prompt="Dato il contesto, per favore rispondi alla domanda. Se la risposta non è contenuta nel contesto sottostante, dì 'Non lo so'.\n" 
"Contesto: {join(documents)};\n Domanda: {query};\n Risposta: ", output_parser=AnswerParser(reference_pattern=r"Document\[(\d+)\]"))
```

Ulteriori personalizzazioni

Puoi apportare ulteriori personalizzazioni a diversi elementi della soluzione, come ad esempio:

  • I dati – Abbiamo fornito la documentazione di OpenSearch e i dati del sito web come dati di esempio. Ricordati di modificare lo script opensearch_indexing_pipeline.py per adattarlo alle tue esigenze se hai scelto di utilizzare i tuoi dati.
  • Il modello – In questo esempio, abbiamo utilizzato il modello Falcon-40b-instruct. Sei libero di distribuire e utilizzare qualsiasi altro modello di Hugging Face su SageMaker. Tieni presente che cambiare un modello probabilmente significa che dovresti adattare il tuo prompt a qualcosa che è progettato per gestire.
  • Il prompt – Per questo post, abbiamo creato il nostro PromptTemplate che istruisce il modello a rispondere alle domande in base al contesto fornito e a rispondere “Non lo so” se il contesto non include informazioni rilevanti. Puoi cambiare questo prompt per sperimentare con diversi prompt con Falcon-40b-instruct. Puoi anche semplicemente prendere alcuni dei nostri prompt da PromptHub.
  • Il modello di embedding – Per la fase di recupero, utilizziamo un modello di embedding leggero: sentence-transformers/all-MiniLM-L12-v2. Tuttavia, puoi anche cambiare questo in base alle tue esigenze. Ricordati di modificare le dimensioni di embedding previste nel tuo DocumentStore di conseguenza.
  • Il numero di documenti recuperati – Puoi anche scegliere di sperimentare con il numero di documenti che richiedi all’EmbeddingRetriever di recuperare per ogni query. Nella nostra configurazione, questo è impostato su top_k=5. Puoi sperimentare con il cambio di questa cifra per vedere se fornire più contesto migliora l’accuratezza dei risultati.

Preparazione alla produzione

La soluzione proposta in questo post può accelerare il tempo per ottenere valore nel processo di sviluppo del progetto. Puoi costruire un progetto che è facile da scalare con l’ambiente di sicurezza e privacy su AWS Cloud.

Per la sicurezza e la privacy, OpenSearch Service fornisce protezione dei dati con gestione delle identità e degli accessi e prevenzione dei proxy confusi tra i servizi. Puoi utilizzare il controllo degli accessi degli utenti a grana fine in modo che l’utente possa accedere solo ai dati a cui è autorizzato. Inoltre, SageMaker fornisce impostazioni di sicurezza configurabili per il controllo degli accessi, la protezione dei dati e la registrazione e il monitoraggio. Puoi proteggere i tuoi dati a riposo e in transito con le chiavi del servizio di gestione delle chiavi AWS (AWS KMS). Puoi anche tenere traccia dei log del deployment del modello SageMaker o dell’accesso all’endpoint utilizzando Amazon CloudWatch. Per ulteriori informazioni, consulta Monitorare Amazon SageMaker con Amazon CloudWatch.

Per l’alta scalabilità su OpenSearch Service, puoi regolarla dimensionando i domini OpenSearch Service e adottando le migliori pratiche operative. Puoi anche sfruttare il ridimensionamento automatico del tuo endpoint SageMaker: puoi ridimensionare automaticamente i modelli SageMaker per adattare l’endpoint sia quando il traffico aumenta che quando le risorse non vengono utilizzate.

Pulizia

Per risparmiare sui costi, elimina tutte le risorse che hai distribuito come parte di questo post. Se hai lanciato lo stack di CloudFormation, puoi eliminarlo tramite la console di AWS CloudFormation. Allo stesso modo, puoi eliminare eventuali endpoint SageMaker che hai creato tramite la console di SageMaker.

Conclusioni

In questo post, abbiamo mostrato come costruire un’applicazione AI generativa end-to-end per la ricerca aziendale con RAG utilizzando le pipeline di Haystack e il modello Falcon-40b-instruct di SageMaker JumpStart e OpenSearch Service. L’approccio RAG è fondamentale nella ricerca aziendale perché garantisce che le risposte generate siano in-domain e quindi mitigando le allucinazioni. Utilizzando le pipeline di Haystack, siamo in grado di orchestrare applicazioni LLM composte da diversi componenti come modelli e database vettoriali. SageMaker JumpStart ci fornisce una soluzione con un solo clic per il deployment di LLM e abbiamo utilizzato OpenSearch Service come database vettoriale per i nostri dati indicizzati. Puoi iniziare a sperimentare e a costruire prove di concetto RAG per le tue applicazioni aziendali di AI generativa, utilizzando i passaggi descritti in questo post e il codice sorgente disponibile nel repository GitHub.