Gli agenti LLM (Large Language Model) sono programmi che estendono le capacità dei LLM autonomi con 1) accesso a strumenti esterni (API, funzioni, webhook, plug-in e così via) e 2) la capacità di pianificare ed eseguire attività in modo autonomo -moda diretta. Spesso gli LLM devono interagire con altri software, database o API per svolgere attività complesse. Ad esempio, un chatbot amministrativo che pianifica riunioni richiederebbe l'accesso ai calendari e alla posta elettronica dei dipendenti. Con l'accesso agli strumenti, gli agenti LLM possono diventare più potenti, al costo di ulteriore complessità.
In questo post, presentiamo gli agenti LLM e dimostriamo come creare e distribuire un agente LLM per l'e-commerce utilizzando Amazon SageMaker JumpStart e AWS Lambda. L'agente utilizzerà strumenti per fornire nuove funzionalità, come rispondere a domande sui resi (“È il mio reso rtn001
elaborato?") e fornire aggiornamenti sugli ordini ("Potresti dirmi se order 123456
ha spedito?"). Queste nuove funzionalità richiedono che gli LLM recuperino dati da più origini dati (ordini
, ritorna
) ed eseguire il recupero della generazione aumentata (RAG).
Per alimentare l'agente LLM, utilizziamo a Flan-UL2
modello distribuito come endpoint SageMaker e utilizza strumenti di recupero dati creati con AWS Lambda. L'agente può successivamente essere integrato con Amazon Lex e utilizzato come chatbot all'interno di siti Web o AWS Connect. Concludiamo il post con gli elementi da considerare prima di distribuire gli agenti LLM in produzione. Per un'esperienza completamente gestita per la creazione di agenti LLM, AWS fornisce anche gli agenti per la funzionalità Amazon Bedrock (in anteprima).
Una breve panoramica delle architetture degli agenti LLM
Gli agenti LLM sono programmi che utilizzano LLM per decidere quando e come utilizzare gli strumenti necessari per completare attività complesse. Con strumenti e capacità di pianificazione delle attività, gli agenti LLM possono interagire con sistemi esterni e superare i limiti tradizionali dei LLM, come interruzioni della conoscenza, allucinazioni e calcoli imprecisi. Gli strumenti possono assumere diverse forme, come chiamate API, funzioni Python o plug-in basati su webhook. Ad esempio, un LLM può utilizzare un "plug-in di recupero" per recuperare il contesto pertinente ed eseguire RAG.
Allora cosa significa per un LLM scegliere strumenti e pianificare attività? Esistono numerosi approcci (es Reagire, MRKL, Strumento formatore, AbbracciandoGPT, E Agente trasformatores) all'utilizzo degli LLM con strumenti e i progressi stanno avvenendo rapidamente. Ma un modo semplice è quello di richiedere a un LLM un elenco di strumenti e chiedergli di determinare 1) se uno strumento è necessario per soddisfare la query dell'utente e, in tal caso, 2) selezionare lo strumento appropriato. Tale richiesta in genere assomiglia all'esempio seguente e può includere esempi di poche riprese per migliorare l'affidabilità di LLM nella scelta dello strumento giusto.
Approcci più complessi prevedono l'utilizzo di un LLM specializzato in grado di decodificare direttamente le "chiamate API" o l'"utilizzo di strumenti", ad esempio GorillaLLM. Tali LLM ottimizzati vengono addestrati sui set di dati delle specifiche API per riconoscere e prevedere le chiamate API in base alle istruzioni. Spesso, questi LLM richiedono alcuni metadati sugli strumenti disponibili (descrizioni, yaml o schema JSON per i parametri di input) per restituire le invocazioni degli strumenti. Questo approccio è adottato dagli agenti per Amazon Bedrock e Chiamate di funzione OpenAI. Si noti che i LLM generalmente devono essere sufficientemente grandi e complessi per mostrare capacità di selezione degli strumenti.
Supponendo che vengano scelti i meccanismi di pianificazione delle attività e di selezione degli strumenti, un tipico programma agente LLM funziona nella seguente sequenza:
- Richiesta dell'utente – Il programma accetta un input dell'utente come “Dov'è il mio ordine
123456
?” da alcune applicazioni client. - Pianifica le azioni successive e seleziona gli strumenti da utilizzare – Successivamente, il programma utilizza un prompt per fare in modo che LLM generi l'azione successiva, ad esempio "Cerca la tabella degli ordini utilizzando
API degli ordini
.” A LLM viene richiesto di suggerire un nome strumento comeAPI degli ordini
da un elenco predefinito di strumenti disponibili e dalle relative descrizioni. In alternativa, è possibile istruire l'LLM a generare direttamente una chiamata API con parametri di input comeOrdiniAPI(12345)
.- Tieni presente che l'azione successiva potrebbe comportare o meno l'utilizzo di uno strumento o di un'API. In caso contrario, LLM risponderebbe all'input dell'utente senza incorporare contesto aggiuntivo dagli strumenti o semplicemente restituirebbe una risposta predefinita come "Non posso rispondere a questa domanda".
- Richiesta dello strumento di analisi – Successivamente, dobbiamo analizzare e convalidare la previsione dello strumento/azione suggerita dal LLM. La convalida è necessaria per garantire che i nomi degli strumenti, le API e i parametri della richiesta non siano allucinazioni e che gli strumenti vengano richiamati correttamente in base alle specifiche. Questa analisi potrebbe richiedere una chiamata LLM separata.
- Strumento Richiama – Una volta assicurati i nomi e i parametri validi dello strumento, invochiamo lo strumento. Potrebbe trattarsi di una richiesta HTTP, di una chiamata di funzione e così via.
- Analizza l'output – La risposta dello strumento potrebbe richiedere un'ulteriore elaborazione. Ad esempio, una chiamata API può comportare una lunga risposta JSON, in cui solo un sottoinsieme di campi interessa LLM. L'estrazione delle informazioni in un formato pulito e standardizzato può aiutare il LLM a interpretare il risultato in modo più affidabile.
- Interpretare l'output – Dato l’output dello strumento, al LLM viene nuovamente chiesto di dargli un senso e decidere se può generare la risposta finale all’utente o se sono necessarie azioni aggiuntive.
- Terminare o continuare con il passaggio 2 – Restituisce una risposta finale o una risposta predefinita in caso di errori o timeout.
Diversi framework di agenti eseguono il flusso del programma precedente in modo diverso. Per esempio, Reagire combina la selezione dello strumento e la generazione della risposta finale in un unico prompt, invece di utilizzare prompt separati per la selezione dello strumento e la generazione della risposta. Inoltre, questa logica può essere eseguita in un singolo passaggio o in un'istruzione while (il "loop dell'agente"), che termina quando viene generata la risposta finale, viene generata un'eccezione o si verifica un timeout. Ciò che rimane costante è che gli agenti utilizzano LLM come elemento centrale per orchestrare la pianificazione e le chiamate agli strumenti fino al termine dell'attività. Successivamente, mostriamo come implementare un semplice ciclo di agenti utilizzando i servizi AWS.
Panoramica della soluzione
Per questo post del blog, implementiamo un agente LLM di supporto e-commerce che fornisce due funzionalità basate su strumenti:
- Strumento di recupero dello stato del reso – Rispondi a domande sullo stato dei resi, ad esempio: “Cosa sta succedendo al mio reso
rtn001
?” - Strumento di recupero dello stato dell'ordine – Tieni traccia dello stato degli ordini, ad esempio “Qual è lo stato del mio ordine
123456
?”
L'agente utilizza effettivamente LLM come router di query. Data una query ("Qual è lo stato dell'ordine 123456
?”), seleziona lo strumento di recupero appropriato per eseguire query su più origini dati (ovvero resi e ordini). Realizziamo l'instradamento delle query scegliendo LLM tra più strumenti di recupero, che sono responsabili dell'interazione con un'origine dati e del recupero del contesto. Ciò estende il modello RAG semplice, che presuppone un'unica origine dati.
Entrambi gli strumenti di recupero sono funzioni Lambda che accettano un id (ID ordine
O returnId
) come input, recupera un oggetto JSON dall'origine dati e converte il JSON in una stringa di rappresentazione intuitiva adatta per essere utilizzata da LLM. L'origine dati in uno scenario reale potrebbe essere un database NoSQL altamente scalabile come DynamoDB, ma questa soluzione utilizza Python semplice Dict
con dati campione a scopo dimostrativo.
È possibile aggiungere ulteriori funzionalità all'agente aggiungendo Strumenti di recupero e modificando di conseguenza le richieste. Questo agente può essere testato come servizio autonomo che si integra con qualsiasi interfaccia utente su HTTP, operazione che può essere eseguita facilmente con Amazon Lex.
Ecco alcuni dettagli aggiuntivi sui componenti chiave:
- Endpoint di inferenza LLM – Il nucleo di un programma agente è un LLM. Utilizzeremo l'hub del modello di base SageMaker JumpStart per distribuire facilmente il file
Flan-UL2
modello. SageMaker JumpStart semplifica la distribuzione degli endpoint di inferenza LLM su istanze SageMaker dedicate. - Orchestratore dell'agente – L'agente di orchestrazione orchestra le interazioni tra LLM, strumenti e l'app client. Per la nostra soluzione, utilizziamo una funzione AWS Lambda per guidare questo flusso e utilizziamo le seguenti funzioni di supporto.
- Pianificatore di attività (strumenti) – Il pianificatore di attività utilizza LLM per suggerire una tra 1) richiesta di reso, 2) richiesta di ordine o 3) nessuno strumento. Usiamo solo ingegneria tempestiva e
Flan-UL2
modello così com'è senza messa a punto. - Analizzatore di strumenti – Il parser dello strumento garantisce che il suggerimento dello strumento dal pianificatore delle attività sia valido. In particolare, ci assicuriamo che un singolo
ID ordine
OreturnId
può essere analizzato. Altrimenti rispondiamo con un messaggio predefinito. - Distributore di strumenti – Il dispatcher degli strumenti richiama gli strumenti (funzioni Lambda) utilizzando i parametri validi.
- Analizzatore di output – Il parser di output pulisce ed estrae gli elementi rilevanti da JSON in una stringa leggibile dall'uomo. Questa attività viene eseguita sia da ogni strumento di recupero sia all'interno dell'agente di orchestrazione.
- Interprete di output – La responsabilità dell'interprete di output è 1) interpretare l'output dall'invocazione dello strumento e 2) determinare se la richiesta dell'utente può essere soddisfatta o se sono necessari passaggi aggiuntivi. In quest'ultimo caso, una risposta finale viene generata separatamente e restituita all'utente.
- Pianificatore di attività (strumenti) – Il pianificatore di attività utilizza LLM per suggerire una tra 1) richiesta di reso, 2) richiesta di ordine o 3) nessuno strumento. Usiamo solo ingegneria tempestiva e
Ora analizziamo un po' più a fondo i componenti chiave: orchestratore dell'agente, pianificatore delle attività e dispatcher degli strumenti.
Orchestratore di agenti
Di seguito è riportata una versione abbreviata del loop dell'agente all'interno della funzione Lambda dell'agente di orchestrazione. Il ciclo utilizza funzioni di supporto come task_planner
O tool_parser
, per modularizzare i compiti. Il ciclo qui è progettato per essere eseguito al massimo due volte per evitare che LLM rimanga bloccato in un ciclo inutilmente lungo.
Pianificatore di attività (previsione dello strumento)
L'agente di orchestrazione utilizza pianificatore di attività
per prevedere uno strumento di recupero basato sull'input dell'utente. Per il nostro agente LLM, utilizzeremo semplicemente il prompt engineering e pochi suggerimenti per insegnare al LLM questo compito nel contesto. Agenti più sofisticati potrebbero utilizzare un LLM ottimizzato per la previsione degli strumenti, che va oltre lo scopo di questo post. La richiesta è la seguente:
Dispacciatore di strumenti
Il meccanismo di invio dello strumento funziona tramite se altro
logica per chiamare le funzioni Lambda appropriate a seconda del nome dello strumento. Quello che segue è tool_dispatch
implementazione della funzione di supporto. È usato all'interno del agente
loop e restituisce la risposta grezza dalla funzione Lambda dello strumento, che viene quindi pulita da un file output_parser
funzione.
Distribuisci la soluzione
Prerequisiti importanti – Per iniziare con la distribuzione, è necessario soddisfare i seguenti prerequisiti:
- Accesso alla Console di gestione AWS tramite un utente che può avviare stack AWS CloudFormation
- Familiarità con la navigazione in AWSLambda E AmazonLex console
Flan-UL2
ne richiede uno singoloml.g5,12xgrande
per la distribuzione, che potrebbe richiedere l'aumento dei limiti delle risorse tramite un ticket di supporto. Nel nostro esempio, usiamonoi-est-1
come Regione, quindi assicurati di aumentare la quota di servizio (se necessario) innoi-est-1
.
Distribuisci utilizzando CloudFormation – È possibile distribuire la soluzione a noi-est-1
cliccando il pulsante qui sotto:
La distribuzione della soluzione richiederà circa 20 minuti e creerà un file LLMAgentStack
pila, che:
- distribuisce l'endpoint SageMaker utilizzando
Flan-UL2
modello da SageMaker JumpStart; - distribuisce tre funzioni Lambda:
LLMAgentOrchestratore
,LLMAgentReturnsTool
,LLMAgentOrdersTool
; E - distribuisce un AWSLex bot che può essere utilizzato per testare l'agente:
Sagemaker-Jumpstart-Flan-LLM-Agent-Fallback-Bot
.
Testare la soluzione
Lo stack distribuisce un bot Amazon Lex con il nome Sagemaker-Jumpstart-Flan-LLM-Agent-Fallback-Bot
. Il bot può essere utilizzato per testare l'agente end-to-end. Ecco un'ulteriore guida completa per testare i bot AWS Amazon Lex con un'integrazione Lambda e come funziona l'integrazione ad alto livello. Ma in breve, il bot Amazon Lex è una risorsa che fornisce un'interfaccia utente rapida per chattare con l'agente LLM in esecuzione all'interno di una funzione Lambda che abbiamo creato (LLMAgentOrchestratore
).
I casi di test di esempio da considerare sono i seguenti:
- Richiesta d'ordine valida (ad esempio: "Per quale articolo è stato ordinato
123456
?”)- L'ordine "123456" è un ordine valido, quindi dovremmo aspettarci una risposta ragionevole (ad esempio "Sapone per le mani alle erbe")
- Richiesta di reso valida per un reso (ad esempio, "Quando è il mio reso
rtn003
elaborato?")- Dovremmo aspettarci una risposta ragionevole sullo stato del reso.
- Irrilevante sia per i resi che per gli ordini (ad esempio, "Com'è il tempo in Scozia in questo momento?")
- Una domanda irrilevante per resi o ordini, pertanto dovrebbe essere restituita una risposta predefinita ("Mi spiace, non posso rispondere a questa domanda.")
- Richiesta d'ordine non valida (ad esempio: "Per quale articolo è stato ordinato
383833
?”)- L'ID 383832 non esiste nel set di dati degli ordini e quindi dovremmo fallire correttamente (ad esempio, "Ordine non trovato. Controlla il tuo ID ordine.")
- Richiesta di reso non valida (ad esempio: "Quando tornerò?"
rtn123
elaborato?")- Allo stesso modo, id
rtn123
non esiste nel set di dati dei rendimenti e quindi dovrebbe fallire correttamente.
- Allo stesso modo, id
- Richiesta di reso irrilevante (ad esempio: “Qual è l’impatto del rendimento?
rtn001
sulla pace nel mondo?”)- Questa domanda, sebbene sembri riguardare un ordine valido, è irrilevante. Il LLM viene utilizzato per filtrare le domande con contesto irrilevante.
Per eseguire personalmente questi test, ecco le istruzioni.
- Sulla console Amazon Lex (Console AWS > Amazon Lex), vai al bot intitolato
Sagemaker-Jumpstart-Flan-LLM-Agent-Fallback-Bot
. Questo bot è già stato configurato per chiamare ilLLMAgentOrchestratore
Funzione Lambda ogni volta cheIntento di fallback
E 'attivato. - Nel riquadro di navigazione, scegli Intenti.
- Scegliere Costruire nell'angolo in alto a destra
- 4. Attendi il completamento del processo di creazione. Al termine, riceverai un messaggio di successo, come mostrato nello screenshot seguente.
- Testare il bot inserendo i casi di test.
Ripulire
Per evitare costi aggiuntivi, elimina le risorse create dalla nostra soluzione seguendo questi passaggi:
- Sul AWS CloudFormation console, seleziona lo stack denominato
LLMAgentStack
(o il nome personalizzato che hai scelto). - Scegliere Eliminare
- Verifica che lo stack venga eliminato dalla console CloudFormation.
Importante: ricontrolla che lo stack sia stato eliminato correttamente assicurandoti che il file Flan-UL2
l'endpoint di inferenza viene rimosso.
- Per verificare, vai a Console AWS > Sagemaker > Endpoint > Inferenza pagina.
- La pagina dovrebbe elencare tutti gli endpoint attivi.
- Assicurarsi
sm-jumpstart-flan-bot-endpoint
non esiste come nello screenshot seguente.
Considerazioni sulla produzione
La distribuzione degli agenti LLM in produzione richiede l'adozione di misure aggiuntive per garantire affidabilità, prestazioni e manutenibilità. Di seguito sono riportate alcune considerazioni prima della distribuzione degli agenti in produzione:
- Selezione del modello LLM per alimentare il loop dell'agente: Per la soluzione discussa in questo post, abbiamo utilizzato a
Flan-UL2
modello senza messa a punto per eseguire la pianificazione delle attività o la selezione degli strumenti. In pratica, l'utilizzo di un LLM ottimizzato per l'output diretto di richieste API o strumenti può aumentare l'affidabilità e le prestazioni, oltre a semplificare lo sviluppo. Potremmo mettere a punto un LLM sulle attività di selezione degli strumenti o utilizzare un modello che decodifica direttamente i token degli strumenti come Toolformer.- L'utilizzo di modelli ottimizzati può anche semplificare l'aggiunta, la rimozione e l'aggiornamento degli strumenti disponibili per un agente. Con approcci basati solo sui prompt, l'aggiornamento degli strumenti richiede la modifica di ogni prompt all'interno dell'agente di orchestrazione, come quelli per la pianificazione delle attività, l'analisi degli strumenti e l'invio degli strumenti. Questo può essere complicato e le prestazioni potrebbero peggiorare se vengono forniti troppi strumenti nel contesto del LLM.
- Affidabilità e prestazioni: Gli agenti LLM possono essere inaffidabili, soprattutto per attività complesse che non possono essere completate in pochi cicli. L'aggiunta di convalide di output, nuovi tentativi, la strutturazione di output da LLM in JSON o yaml e l'applicazione di timeout per fornire porte di fuga per LLM bloccati in loop possono migliorare l'affidabilità.
Conclusione
In questo post, abbiamo esplorato come creare un agente LLM in grado di utilizzare più strumenti da zero, utilizzando il prompt engineering di basso livello, le funzioni AWS Lambda e SageMaker JumpStart come elementi costitutivi. Abbiamo discusso in dettaglio l'architettura degli agenti LLM e il ciclo degli agenti. I concetti e l'architettura della soluzione introdotti in questo post del blog potrebbero essere appropriati per gli agenti che utilizzano un numero limitato di un set predefinito di strumenti. Abbiamo anche discusso diverse strategie per l'utilizzo degli agenti nella produzione. Agenti per Bedrock, disponibile in anteprima, fornisce anche un'esperienza gestita per la creazione di agenti con supporto nativo per le chiamate agli strumenti agenti.
Circa l'autore
Giovanni Hwang è un Generative AI Architect presso AWS con particolare attenzione alle applicazioni Large Language Model (LLM), ai database vettoriali e alla strategia di prodotto AI generativa. La sua passione è aiutare le aziende con lo sviluppo di prodotti AI/ML e il futuro degli agenti e dei copiloti LLM. Prima di entrare in AWS, è stato Product Manager presso Alexa, dove ha contribuito a portare l'intelligenza artificiale conversazionale sui dispositivi mobili, nonché trader di derivati presso Morgan Stanley. Ha conseguito la laurea in informatica presso la Stanford University.
lascia un commento