Utilizza un modello di base di intelligenza artificiale generativa per la sintesi e la risposta alle domande utilizzando i tuoi dati

Usa un modello AI generativo per rispondere alle domande con i tuoi dati

I modelli linguistici di grandi dimensioni (LLM) possono essere utilizzati per analizzare documenti complessi e fornire riassunti e risposte alle domande. L’articolo “Domain-adaptation Fine-tuning of Foundation Models in Amazon SageMaker JumpStart on Financial data” descrive come ottimizzare un LLM utilizzando il proprio set di dati. Una volta ottenuto un solido LLM, si desidera esporlo agli utenti aziendali per elaborare nuovi documenti, che potrebbero essere lunghi centinaia di pagine. In questo post, mostriamo come costruire un’interfaccia utente in tempo reale per consentire agli utenti aziendali di elaborare un documento PDF di lunghezza arbitraria. Una volta elaborato il file, è possibile riassumere il documento o fare domande sul contenuto. La soluzione di esempio descritta in questo post è disponibile su GitHub.

Lavorare con documenti finanziari

I documenti finanziari come i rapporti sugli utili trimestrali e i rapporti annuali agli azionisti sono spesso lunghi decine o centinaia di pagine. Questi documenti contengono molte frasi predefinite come avvertenze e termini legali. Se si desidera estrarre i punti chiave da uno di questi documenti, è necessario sia tempo che una certa familiarità con le frasi predefinite per poter identificare i fatti interessanti. E naturalmente, non è possibile fare domande a un LLM su un documento che non ha mai visto.

I LLM utilizzati per il riassunto hanno un limite sul numero di token (caratteri) passati al modello e, con alcune eccezioni, questi sono di solito non più di qualche migliaio di token. Questo di solito esclude la possibilità di riassumere documenti più lunghi.

La nostra soluzione gestisce documenti che superano la lunghezza massima della sequenza di token di un LLM e rende tale documento disponibile al LLM per rispondere alle domande.

Panoramica della soluzione

Il nostro progetto ha tre componenti importanti:

  • Ha un’applicazione web interattiva per gli utenti aziendali per caricare e elaborare PDF
  • Utilizza la libreria langchain per suddividere un grande PDF in pezzi più gestibili
  • Utilizza la tecnica di generazione con recupero potenziato per consentire agli utenti di fare domande su nuovi dati che il LLM non ha mai visto prima

Come mostrato nel diagramma seguente, utilizziamo un front end implementato con React JavaScript ospitato in un bucket di Amazon Simple Storage Service (Amazon S3) fronteggiato da Amazon CloudFront. L’applicazione front-end consente agli utenti di caricare documenti PDF su Amazon S3. Dopo il completamento del caricamento, è possibile avviare un lavoro di estrazione del testo alimentato da Amazon Textract. Come parte dell’elaborazione successiva, una funzione AWS Lambda inserisce marcatori speciali nel testo che indicano i limiti delle pagine. Quando il lavoro è completato, è possibile invocare un’API che riassume il testo o risponde alle domande su di esso.

Poiché alcune di queste operazioni richiedono del tempo, l’architettura utilizza un approccio asincrono disaccoppiato. Ad esempio, la chiamata per riassumere un documento invoca una funzione Lambda che invia un messaggio a una coda di Amazon Simple Queue Service (Amazon SQS). Un’altra funzione Lambda raccoglie quel messaggio e avvia un’attività Amazon Elastic Container Service (Amazon ECS) AWS Fargate. L’attività Fargate chiama il punto di inferenza di Amazon SageMaker. Utilizziamo un’attività Fargate qui perché il riassunto di un PDF molto lungo potrebbe richiedere più tempo e memoria di quanto una funzione Lambda abbia a disposizione. Quando il riassunto è completo, l’applicazione front-end può recuperare i risultati da una tabella di Amazon DynamoDB.

Per il riassunto, utilizziamo il modello di riassunto di AI21, uno dei modelli di base disponibili tramite Amazon SageMaker JumpStart. Anche se questo modello gestisce documenti di fino a 10.000 parole (circa 40 pagine), utilizziamo lo splitter di testo langchain per assicurarci che ogni chiamata di riassunto al LLM non superi le 10.000 parole. Per la generazione di testo, utilizziamo il modello VoAGI di Cohere e utilizziamo GPT-J per le incorporazioni, entrambi tramite JumpStart.

Elaborazione del riassunto

Quando si gestiscono documenti più grandi, è necessario definire come suddividere il documento in pezzi più piccoli. Quando riceviamo i risultati dell’estrazione del testo da Amazon Textract, inseriamo marcatori per blocchi di testo più grandi (un numero configurabile di pagine), singole pagine e interruzioni di linea. Langchain si dividerà in base a quei marcatori e assemblerà documenti più piccoli che rientrano nel limite dei token. Vedere il codice seguente:

text_splitter = RecursiveCharacterTextSplitter(
      separators = ["<CHUNK>", "<PAGE>", "\n"],
         chunk_size = int(chunk_size),
         chunk_overlap  = int(chunk_overlap))

 with open(local_path) as f:
     doc = f.read()
 texts = text_splitter.split_text(doc)
 print(f"Numero di divisioni: {len(texts)}")


 llm = SageMakerLLM(endpoint_name = endpoint_name)

 responses = []
 for t in texts:
     r = llm(t)
     responses.append(r)
 summary = "\n".join(responses)

L’LLM nella catena di riassunto è un sottile involucro intorno al nostro endpoint SageMaker:

class SageMakerLLM(LLM):

endpoint_name: str
    
@property
def _llm_type(self) -> str:
    return "riassumi"
    
def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
    response = ai21.Summarize.execute(
                      source=prompt,
                      sourceType="TESTO",
                      sm_endpoint=self.endpoint_name
    )
    return response.summary 

Domanda e risposta

Nel metodo di generazione con recupero, dividiamo prima il documento in segmenti più piccoli. Creiamo embedding per ogni segmento e li archiviamo nel database di vettori Chroma open-source tramite l’interfaccia di langchain. Salviamo il database in un sistema di file Amazon Elastic File System (Amazon EFS) per un uso successivo. Ecco il codice seguente:

documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500,
                                                chunk_overlap  = 0)
texts = text_splitter.split_documents(documents)
print(f"Numero di divisioni: {len(texts)}")

embeddings = SMEndpointEmbeddings(
    endpoint_name=endpoint_name,
)
vectordb = Chroma.from_documents(texts, embeddings, 
    persist_directory=persist_directory)
vectordb.persist()

Quando gli embedding sono pronti, l’utente può fare una domanda. Cerchiamo nel database di vettori i frammenti di testo che corrispondono più da vicino alla domanda:

embeddings = SMEndpointEmbeddings(
    endpoint_name=endpoint_embed
)
vectordb = Chroma(persist_directory=persist_directory, 
embedding_function=embeddings)
docs = vectordb.similarity_search_with_score(question)

Prendiamo il frammento più simile e lo utilizziamo come contesto per il modello di generazione di testo per rispondere alla domanda:

cohere_client = Client(endpoint_name=endpoint_qa)
context = docs[high_score_idx][0].page_content.replace("\n", "")
qa_prompt = f'Contesto={context}\nDomanda={question}\nRisposta='
response = cohere_client.generate(prompt=qa_prompt, 
                                  max_tokens=512, 
                                  temperature=0.25, 
                                  return_likelihoods='GENERATION')
answer = response.generations[0].text.strip().replace('\n', '')

Esperienza utente

Anche se gli LLM rappresentano una scienza dei dati avanzata, la maggior parte dei casi d’uso per gli LLM coinvolge infine l’interazione con utenti non tecnici. La nostra applicazione web di esempio gestisce un caso d’uso interattivo in cui gli utenti aziendali possono caricare e elaborare un nuovo documento PDF.

Il diagramma seguente mostra l’interfaccia utente. Un utente inizia caricando un PDF. Dopo che il documento è archiviato in Amazon S3, l’utente può avviare il processo di estrazione del testo. Quando ciò è completo, l’utente può invocare il compito di riassunto o fare domande. L’interfaccia utente espone alcune opzioni avanzate come la dimensione dei frammenti e la sovrapposizione dei frammenti, che sarebbero utili per utenti avanzati che testano l’applicazione su nuovi documenti.

Prossimi passi

Gli LLM forniscono significative nuove capacità di recupero delle informazioni. Gli utenti aziendali hanno bisogno di un accesso comodo a tali capacità. Ci sono due direzioni per il lavoro futuro da considerare:

  • Sfruttare gli LLM potenti già disponibili nei modelli di base di Jumpstart. Con poche righe di codice, la nostra applicazione di esempio potrebbe distribuire e utilizzare LLM avanzati da AI21 e Cohere per il riassunto e la generazione di testo.
  • Rendere queste capacità accessibili agli utenti non tecnici. Un prerequisito per l’elaborazione dei documenti PDF è l’estrazione del testo dal documento, e i lavori di riassunto potrebbero richiedere diversi minuti per essere eseguiti. Ciò richiede un’interfaccia utente semplice con capacità di elaborazione di backend asincrone, che è facile da progettare utilizzando servizi nativi del cloud come Lambda e Fargate.

<p.Notiamo anche che un documento PDF è un'informazione semi-strutturata. Gli indizi importanti come le intestazioni di sezione sono difficili da identificare in modo programmato, perché si basano su dimensioni dei caratteri e altri indicatori visivi. Identificare la struttura sottostante delle informazioni aiuta l'LLM a elaborare i dati in modo più accurato, almeno fino a quando gli LLM possono gestire input di lunghezza illimitata.

Conclusione

In questo articolo, abbiamo mostrato come costruire un’applicazione web interattiva che consente agli utenti aziendali di caricare e elaborare documenti PDF per la sintesi e la risposta alle domande. Abbiamo visto come sfruttare i modelli di base di Jumpstart per accedere a LLM avanzati e utilizzare tecniche di divisione del testo e generazione arricchita tramite recupero per elaborare documenti più lunghi e renderli disponibili come informazioni per il LLM.

In questo momento, non c’è motivo di non rendere queste potenti capacità disponibili ai tuoi utenti. Ti incoraggiamo a iniziare a utilizzare i modelli di base di Jumpstart oggi stesso.