{"id":7213,"date":"2024-09-11T09:42:42","date_gmt":"2024-09-11T07:42:42","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=7213"},"modified":"2024-09-11T11:53:54","modified_gmt":"2024-09-11T09:53:54","slug":"come-creare-un-agent-ai-con-claude-3-aws-bedrock-amazon-api-gateway-e-aws-lambda-e-migliorare-la-customer-experience","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/come-creare-un-agent-ai-con-claude-3-aws-bedrock-amazon-api-gateway-e-aws-lambda-e-migliorare-la-customer-experience\/","title":{"rendered":"Come creare un Agent AI con Claude 3, AWS Bedrock, Amazon API Gateway e AWS Lambda e migliorare la customer experience"},"content":{"rendered":"\n
Nel panorama tecnologico odierno, in cui la customer experience viene prima di tutto, l’Intelligenza Artificiale \u00e8 sempre pi\u00f9 protagonista.<\/p>\n\n\n\n
Tra le sue infinite applicazioni, la creazione di Agent “intelligenti”, capaci di interagire con sistemi API-based o direttamente con gli utenti suscita grande interesse sia nel B2B, che nel B2C.<\/p>\n\n\n\n
In questo articolo-tutorial vediamo come sviluppare un Agent AI con Claude 3 utilizzando AWS Bedrock. Lo esporremo tramite Amazon API Gateway e AWS Lambda e lo integreremo con con una knowledge base Pinecone per sfruttare l’ottimizzazione dell’output attraverso Retrieval-Augmented Generation (RAG). <\/p>\n\n\n\n
Inoltre, vedremo come il sistema pu\u00f2 utilizzare AWS Lambda e gli agenti Amazon Bedrock per recuperare informazioni degli utenti direttamente da un database relazionale e visualizzarle in una chat.<\/p>\n\n\n\n
Per il tutorial ci serviremo di un esempio pratico: un Agent di assistenza clienti fittizio, capace di gestire richieste su servizi elettrici a Roma. Al termine dell’articolo, avremo ottenuto un Agent AI funzionante, in grado di aiutare i clienti con i servizi, recuperare informazioni sulle fatture e persino inviare email con allegati.<\/p>\n\n\n\n
Ti servir\u00e0 solo una conoscenza di base dei servizi AWS e un po’ di esperienza di programmazione.<\/p>\n\n\n\n
Cominciamo!<\/p>\n\n\n\n
Prima di entrare nel vivo dell’implementazione, discutiamo brevemente le tecnologie chiave che utilizzeremo:<\/p>\n\n\n\n
Claude 3, sviluppato da Anthropic, \u00e8 uno dei modelli di linguaggio avanzati disponibili tramite Amazon Bedrock. Eccelle nella comprensione e generazione del linguaggio naturale, rendendolo ideale per la creazione di Agent AI conversazionali<\/em>.<\/p>\n\n\n\n Le Knowledge Base di Amazon Bedrock ti permettono di collegare gli Agent AI a repository di dati esistenti, consentendo loro di accedere e utilizzare informazioni rilevanti per migliorare le risposte.<\/p>\n\n\n\n Ecco alcuni punti chiave sulle Knowledge Base e sugli Agent in Amazon Bedrock:<\/p>\n\n\n\n 2. Amazon API Gateway e AWS Lambda<\/strong>: Amazon API Gateway \u00e8 un servizio completamente gestito che semplifica per gli sviluppatori creazione, pubblicazione, gestione, monitoraggio e sicurezza delle API su qualsiasi scala. AWS Lambda \u00e8 il servizio di calcolo Serverless di AWS che consente di eseguire codice senza dover configurare o gestire server. Insieme, offrono un modo scalabile e conveniente per esporre il nostro Agent AI al mondo.<\/p>\n\n\n\n 3. Pinecone<\/strong>: Pinecone \u00e8 un database vettoriale che consente l’archiviazione e il recupero efficienti di vettori ad alta dimensione, ideale per applicazioni di ricerca semantica.<\/p>\n\n\n\n Progettato specificamente per la gestione, archiviazione e ricerca di vector embeddings<\/strong>, Pinecone offre una soluzione potente per sviluppatori e data scientist che lavorano su progetti di Intelligenza Artificiale.<\/p>\n\n\n\n Pinecone eccelle nella gestione degli embeddings<\/strong>, rappresentazioni numeriche di dati comunemente usate nei modelli di Machine Learning. Questi embeddings possono rappresentare una vasta gamma di informazioni, dai testi e immagini fino ai suoni e ai modelli di comportamento degli utenti. La capacit\u00e0 del servizio di archiviare e interrogare miliardi di questi vettori in modo efficiente lo distingue nel campo della gestione dei dati per le applicazioni AI.<\/p>\n\n\n\n Una delle caratteristiche pi\u00f9 rilevanti di Pinecone \u00e8 la sua scalabilit\u00e0<\/strong>. Il servizio pu\u00f2 gestire miliardi di vettori e processare migliaia di query al secondo senza problemi, rendendolo la scelta ideale per applicazioni su larga scala che richiedono alte prestazioni. Questa scalabilit\u00e0 \u00e8 accompagnata da una bassa latenza<\/strong>, con tempi di query tipicamente misurati in millisecondi, il che \u00e8 utile per applicazioni in tempo reale che necessitano di risposte immediate.<\/p>\n\n\n\n Il cuore della funzionalit\u00e0 di Pinecone risiede nelle sue capacit\u00e0 avanzate di ricerca per similarit\u00e0<\/strong>.<\/p>\n\n\n\n Sfruttando tecniche sofisticate di indicizzazione, tra cui la ricerca approssimativa del “vicino pi\u00f9 prossimo” (ANN), Pinecone consente di trovare rapidamente i vettori pi\u00f9 simili a un vettore di query, un aspetto cruciale per applicazioni come i sistemi di raccomandazione, la ricerca semantica e il rilevamento di somiglianze in immagini o audio, oltre che, ovviamente, per preparare RAG (Retrieval-Augmented Generation) per i modelli linguistici di grandi dimensioni (LLM). Come soluzione cloud-native<\/strong>, Pinecone offre i vantaggi di un servizio Serverless completamente gestito, riducendo significativamente l’onere operativo per gli utenti e permettendo loro di concentrarsi sullo sviluppo delle applicazioni invece che sulla gestione dell’infrastruttura. Il servizio fornisce una API semplice che si integra facilmente con vari linguaggi di programmazione e framework, rendendolo accessibile a un’ampia gamma di sviluppatori.<\/p>\n\n\n\n La versatilit\u00e0 di Pinecone \u00e8 ulteriormente migliorata dal supporto per il filtro dei metadati<\/strong>: gli utenti possono allegare informazioni aggiuntive ai loro vettori e utilizzare questi metadati per affinare i risultati di ricerca, cosa fondamentale in scenari dove le informazioni contestuali giocano un ruolo cruciale nel determinare la rilevanza. Il servizio offre anche solide capacit\u00e0 di gestione dei dati, inclusa l’operazione upsert<\/strong>, che consente di aggiornare e inserire facilmente dati vettoriali.<\/p>\n\n\n\n La combinazione di velocit\u00e0, scalabilit\u00e0 e capacit\u00e0 di ricerca avanzata lo rende uno strumento inestimabile per le organizzazioni che desiderano sfruttare al massimo il loro patrimonio di dati vettoriali.<\/p>\n\n\n\n Nel nostro caso, lo utilizzeremo per archiviare e interrogare informazioni tokenizzate sui servizi elettrici prese da un sito istituzionale.<\/p>\n\n\n\n 4. Aurora Serverless PostgreSQL v2<\/strong>: Aurora Serverless \u00e8 una configurazione on-demand e auto-scalabile per Amazon Aurora. In questo caso, lo utilizzeremo con compatibilit\u00e0 PostgreSQL per archiviare e recuperare dati dei clienti in modo efficiente, sfruttando le Aurora Data API<\/strong> per interagire con il database. L’Aurora Data API \u00e8 una API HTTPS sicura che consente di eseguire query SQL su un database Amazon Aurora senza la necessit\u00e0 di driver di database o di gestione delle connessioni. <\/p>\n\n\n\n Ecco alcuni motivi per considerare l’uso dell’Aurora Data API:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n 2. Configurazione di Pinecone<\/strong>: Crea un account Pinecone e imposta un nuovo indice per archiviare le informazioni sul servizio. Per iscriversi a Pinecone dal AWS Marketplace<\/strong>, segui questi passaggi:<\/p>\n\n\n\n Dopo l’iscrizione, puoi accedere e utilizzare Pinecone all’interno del tuo account AWS: vai su Marketplace > Gestisci iscrizioni > Configura Prodotto (voce Pinecone) > Configura Account<\/strong>.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n 3. Configurazione di Aurora Serverless PostgreSQL v2<\/strong>: 4. Creazione dell’Agente Claude 3 con AWS Bedrock<\/strong>: 5. Configurazione del Knowledge Base in Bedrock<\/strong>:<\/p>\n\n\n\n Abbiamo scaricato il testo dalle pagine web dei clienti, ma puoi caricare tutti i documenti che ritieni utili nel KB. I formati supportati sono testo<\/strong> e PDF<\/strong>. Se utilizzi Opensearch Serverless<\/strong> (il database vettoriale nativo di AWS), puoi anche collegare fonti di dati aziendali interne come Sharepoint<\/strong>, Confluence<\/strong>, Salesforce<\/strong> e crawler web generici.<\/p>\n\n\n\n 6. Definizione del Comportamento dell’Agent<\/strong>: Esempio di metaprompt<\/strong>:<\/p>\n\n\n\n 7. Implementazione della Logica dell’Agent<\/strong>: Ecco un semplice esempio di codice per la funzione Lambda:<\/p>\n\n\n\n Ora che abbiamo la funzione Lambda, possiamo proseguire aggiungendo le azioni API e registrando la Knowledge Base (KB) nell’agente che abbiamo creato in precedenza. Torna alla dashboard dell’agente e modifica l’agent aggiungendo la Knowledge Base creando un nuovo gruppo di azioni.<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Puoi aggiungere un nuovo gruppo di azioni inserendo le istruzioni e un file OpenAPI Swagger YAML. <\/p>\n\n\n\n Ecco il nostro esempio:<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Dopo aver completato questa configurazione, dovresti essere in grado di invocare l’agent tramite l’ambiente di test integrato. Ricorda di salvare e pubblicare l’agent prima di effettuare il test. Se qualcosa dovesse fallire, puoi trovare l’errore nell’ambiente integrato; un errore molto comune \u00e8 non impostare correttamente la policy delle risorse Lambda<\/p>\n\n\n\n <\/p>\n\n\n <\/p>\n\n\n\n Lo statement dell’agentsInvokeFunction dovrebbe essere simile a questo:<\/p>\n\n\n\n 8. Impostazione della Registrazione (Logging)<\/strong>: Dovresti anche abilitare la registrazione per il Knowledge Base.<\/p>\n\n\n\n 9. Esposizione dell’Agent tramite Amazon API Gateway<\/strong> Ecco un semplice esempio:<\/p>\n\n\n\n Nella console di API Gateway<\/strong>, crea una nuova API REST<\/strong>. Configura una risorsa e un metodo POST<\/strong> che attiver\u00e0 la tua funzione Lambda, quindi configura l’integrazione tra Amazon API Gateway e la tua funzione Lambda. Assicurati che siano in atto i permessi necessari affinch\u00e9 Amazon API Gateway possa invocare Lambda. Distribuisci la tua API su uno stage (ad es., “prod”) e annota l’URL di invocazione<\/strong>, che \u00e8 l’URL che i clienti utilizzeranno per interagire con il tuo agente.<\/p>\n\n\n\n 10. Test e Affinamento<\/strong> Affina poi il comportamento del tuo agent regolando il metaprompt, ottimizzando i parametri del modello Claude 3 o modificando la logica della tua funzione Lambda.<\/p>\n\n\n\n Sii consapevole dei modelli di pricing dei servizi che stai utilizzando:<\/p>\n\n\n\n In questo tutorial, abbiamo esaminato il processo di creazione di un agente Claude 3 utilizzando Amazon Bedrock e la sua esposizione tramite Amazon API Gateway e AWS Lambda. L’abbiamo integrato con una Knowledge Base Pinecone per le informazioni sui servizi e collegato ad Aurora Serverless per il recupero dei dati dei clienti. <\/p>\n\n\n\n Questa configurazione offre una soluzione potente, scalabile e conveniente per la creazione di agent di customer service basati su AI. <\/p>\n\n\n\n Sfruttare i servizi Serverless di AWS, consente di concentrarsi sul perfezionamento delle capacit\u00e0 del tuo agent senza preoccuparti della gestione dell’infrastruttura. <\/p>\n\n\n\n Man mano che continui a sviluppare e migliorare il tuo agente, ricorda di rivedere regolarmente le sue prestazioni, raccogliere feedback dagli utenti e rimanere aggiornato sugli ultimi sviluppi in ambito AI e tecnologie Cloud.<\/p>\n\n\n\n Speriamo che questo articolo ti sia stato utile per trovare ispirazione per migliorare i tuoi servizi. <\/p>\n\n\n\n Ci vediamo tra 14 giorni su Proud2beCloud per un nuovo articolo!<\/p>\n\n\n\n\n
\n
<\/figure><\/div>\n\n\n
Configurazione dell’Ambiente<\/h3>\n\n\n\n
\n
\n
<\/figure><\/div>\n\n\n
Crea un cluster Aurora Serverless PostgreSQL nel tuo account AWS. Configura le tabelle necessarie per i dati. (Consulta la guida specifica<\/a> per questo passaggio)<\/p>\n\n\n\n
Accesso ad Amazon Bedrock<\/strong>
Naviga nella console di Amazon Bedrock e richiedi l’accesso al modello Claude 3:<\/p>\n\n\n\n\n
\n
Utilizzando il seguente metaprompt<\/strong>, o qualcosa di simile, definisci il comportamento dell’agent. Questo include specificare il suo ruolo come agent del servizio clienti, delineare i compiti principali e impostare le linee guida per l’interazione.<\/p>\n\n\n\nYou are a customer service agent. Your main task is to help the customer by answering their questions about provided services. You have to:\n\n1. Provide information about these services: Interventi sul punto di fornitura, Illuminazione cimiteriale, Allaccio alla rete elettrica. You can find the information in your knowledge base.\n\n2. List all the customer's invoice. The customer has to provide numero utenza and tipo utenza (bollette energia oppure bolletta illuminazione cimiteriale) in the prompt.\n\n3. Get all the information of a single invoice. The customer has to provide numero bolletta in the prompt.\n\n4. Send mail with a single invoice attached. The customer has to provide numero bolletta and email address in the prompt.\n\nYou need to have all the required parameters to invoke the action group. Don't complete the missing parameters. Ask the customer to provide the missing one.\n\nIf the provided email is formally wrong you have to ask the customer to insert a valid email\n\nIf you have found invoices that match the user's criteria print them in a user friendly format. Always reply in italian.\n\nIf you can't find any invoice on the criteria provided by the user, use a polite tone to let him know that you were unable to find any invoices that met the user's search criteria. Ask them to try again and give them guidance on what criteria their missing to get results that best meet their criteria. You also need to be flexible. If it doesn't match their exact criteria, you can still state other invoices you have in the desired period.\n\nWhen you provide answers don't link any vector db source reference.\nDon't answer to other topic questions.<\/code><\/pre>\n\n\n\n
Crea una nuova funzione Lambda<\/strong> che funger\u00e0 da backend per il nostro agent. Questa funzione permetter\u00e0 a Claude di eseguire operazioni definite nel file OpenAPI<\/strong> che dovrai caricare nell’agent, nel gruppo di azioni.<\/p>\n\n\n\nimport json\nimport boto3\n\n# Replace these with your actual ARNs\ndb_clust_arn = \"your_database_cluster_arn\"\ndb_secret_arn = \"your_database_secret_arn\"\n\nrds_data = boto3.client(\"rds-data\")\ns3_client = boto3.client(\"s3\")\n\n\ndef lambda_handler(event, context):\n\tprint(event)\n\n\tagent = event[\"agent\"]\n\taction_group = event[\"actionGroup\"]\n\n\t# Flatten parameters for easier access\n\tflattened_params = {param[\"name\"]: param[\"value\"] for param in event[\"parameters\"]}\n\n\tprint(flattened_params)\n\n\tparameters = event.get(\"parameters\", [])\n\tprint(parameters)\n\tinvoice_number = parameters[0].get(\"value\")\n\treceiver_email = parameters[1].get(\"value\")\n\n\t# Construct SQL query\n\tget_invoice_information_sql = f\"\"\"\n \tSELECT *\n \tFROM invoices\n \tWHERE account_number = '{flattened_params['account_number']}'\n\t\"\"\"\n\n\tif flattened_params.get(\"account_type\"):\n \tget_invoice_information_sql += (\n \tf\" AND account_type = '{flattened_params['account_type']}'\"\n \t)\n\n\tprint(get_invoice_information_sql)\n\n\t# Execute SQL query\n\tresponse = rds_data.execute_statement(\n \tresourceArn=db_clust_arn,\n \tsecretArn=db_secret_arn,\n \tdatabase=\"your_database_name\",\n \tsql=get_invoice_information_sql,\n\t)\n\n\tprint(response)\n\n\trecords = response.get(\"records\")\n\tprint(records)\n\n\t# Prepare response\n\tresponse_body = {\"TEXT\": {\"body\": f\"{records}\"}}\n\n\taction_response = {\n \t\"actionGroup\": action_group,\n \t\"functionResponse\": {\n \t\"responseState\": \"REPROMPT\",\n \t\"responseBody\": response_body,\n \t},\n\t}\n\n\tsession_attributes = event[\"sessionAttributes\"]\n\tprompt_session_attributes = event[\"promptSessionAttributes\"]\n\n\t# Construct final Lambda response\n\tlambda_response = {\n \t\"response\": action_response,\n \t\"messageVersion\": event[\"messageVersion\"],\n \t\"sessionAttributes\": session_attributes,\n \t\"promptSessionAttributes\": prompt_session_attributes,\n\t}\n\n\treturn lambda_response<\/code><\/pre>\n\n\n\n
<\/figure><\/div>\n\n\n
openapi: 3.0.0\ninfo:\n title: invoices service\n version: 1.0.0\n description: APIs for retrieving customer's invoices\npaths:\n \/list-invoices\/:\n\tget:\n \tsummary: recupera la lista di bollette dati numero utenza e tipo utenza\n \tdescription: recupera la lista di bollette, quindi numero bolletta, periodo e importo, dati numero utenza e tipo utenza\n \toperationId: listInvoices\n \tparameters:\n \t- name: numero_utenza\n \tin: path\n \tdescription: Numero di utenza dell'utente che fa la richesta, \u00e8 necessario che sia fornito dall'utente\n \trequired: true\n \tschema:\n \ttype: string\n \t- name: tipo_utenza\n \tin: path\n \tdescription: Tipo di utenza dell'utente che fa la richiesta, valori ammessi \"Energia Elettrica\" e \"Illuminazione Cimiteriale\"\n \trequired: false\n \tschema:\n \ttype: string\n \tenum:\n \t- Energia Elettrica\n \t- Illuminazione Cimiteriale\n \tresponses:\n \t\"200\":\n \tdescription: recupera la lista di bollette dati numero utenza e tipo utenza\n \tcontent:\n \tapplication\/json:\n \tschema:\n \ttype: array\n \titems:\n \ttype: object\n \tproperties:\n \tnumero_utenza:\n \ttype: string\n \tdescription: Numero di utenza dell'utente che fa la richesta\n \ttipo_utenza:\n \ttype: string\n \tdescription: Tipo di utenza dell'utente che fa la richiesta\n \tlink_pdf_bolletta:\n \ttype: string\n \tdescription: S3 URI del pdf della\/delle bolletta\/e richieste\n \/get-invoices\/:\n\tget:\n \tsummary: Recupera tutti i dettagli di una singola bolletta, dato il numero di bolletta\n \tdescription: Recupera tutti i dettagli di una singola bolletta, dato il numero di bolletta\n \toperationId: getInvoices\n \tparameters:\n \t- name: numero_bolletta\n \tin: path\n \tdescription: Numero della bolletta, \u00e8 necessario che sia fornito dall'utente\n \trequired: true\n \tschema:\n \ttype: string\n \tresponses:\n \t\"200\":\n \tdescription: Recupera tutti i dettagli di una singola bolletta, dato il numero di bolletta\n \tcontent:\n \tapplication\/json:\n \tschema:\n \ttype: array\n \titems:\n \ttype: object\n \tproperties:\n \tnumero_utenza:\n \ttype: string\n \tdescription: Numero di utenza dell'utente che fa la richesta\n \ttipo_utenza:\n \ttype: string\n \tdescription: Tipo di utenza dell'utente che fa la richiesta\n \tlink_pdf_bolletta:\n \ttype: string\n \tdescription: S3 URI del pdf della\/delle bolletta\/e richieste\n \/list-readings\/:\n\tget:\n \tsummary: Recupera tutti le letture per codice contratto\n \tdescription: Recupera tutte le letture per codice contratto\n \toperationId: listReadings\n \tparameters:\n \t- name: codice_contratto\n \tin: path\n \tdescription: codice contratto, \u00e8 necessario che sia fornito dall'utente\n \trequired: true\n \tschema:\n \ttype: string\n \tresponses:\n \t\"200\":\n \tdescription: Recupera tutti le letture tramite codice contratto\n \tcontent:\n \tapplication\/json:\n \tschema:\n \ttype: array\n \titems:\n \ttype: object\n \tproperties:\n \tcodice_contratto:\n \ttype: string\n \tdescription: Codice del contratto utenza\n \t \n \/send-mail\/:\n\tget:\n \tsummary: Inviare una mail con allegata la bolletta richiesta, dato il numero bolletta e l'indirizzo email del cliente\n \tdescription: Inviare una mail con allegata la bolletta richiesta, dato il numero bolletta e l'indirizzo email del cliente\n \toperationId: sendMail\n \tparameters:\n \t- name: numero_bolletta\n \tin: path\n \tdescription: Numero della bolletta, \u00e8 necessario che sia fornito dall'utente\n \trequired: true\n \tschema:\n \ttype: string\n \t- name: email\n \tin: path\n \tdescription: Inviare una mail con allegata la bolletta richiesta, dato il numero bolletta e l'indirizzo email del cliente\n \trequired: true\n \tschema:\n \ttype: string\n \tresponses:\n \t\"200\":\n \tdescription: Recupera tutti i dettagli di una singola bolletta, dato il numero di bolletta\n \tcontent:\n \tapplication\/json:\n \tschema:\n \ttype: array\n \titems:\n \ttype: object\n \tproperties:\n \tnumero_utenza:\n \ttype: string\n \tdescription: Numero di utenza dell'utente che fa la richesta\n \ttipo_utenza:\n \ttype: string\n \tdescription: Tipo di utenza dell'utente che fa la richiesta\n \tlink_pdf_bolletta:\n \ttype: string\n \tdescription: S3 URI del pdf della\/delle bolletta\/e richieste<\/code><\/pre>\n\n\n\n
Di seguito puoi trovare la nostra configurazione nella sezione dei gruppi di azione:<\/p>\n\n\n\n<\/figure><\/div>\n\n\n
<\/figure><\/div>\n\n\n
{\n \"Version\": \"2012-10-17\",\n \"Id\": \"default\",\n \"Statement\": [\n\t{\n \t\"Sid\": \"agentsInvokeFunction\",\n \t\"Effect\": \"Allow\",\n \t\"Principal\": {\n \t\"Service\": \"bedrock.amazonaws.com\"\n \t},\n \t\"Action\": \"lambda:invokeFunction\",\n \t\"Resource\": \"arn:aws:lambda:us-east-1:471112860008:function:generic-invoice-request-pg1aj\"\n\t}\n ]\n}<\/code><\/pre>\n\n\n\n
Per configurare la registrazione in AWS Bedrock:<\/p>\n\n\n\n\n
Nella console AWS Lambda, crea una nuova funzione Lambda in Python. La funzione Lambda utilizzer\u00e0 boto3<\/strong> per invocare l’agent Bedrock con il prompt dell’utente. <\/p>\n\n\n\nimport boto3\nimport json\nimport random\nimport string\n\n# Replace these with your actual Agent IDs\nAGENT_ID = \"YOUR_AGENT_ID\"\nAGENT_ALIAS_ID = \"YOUR_AGENT_ALIAS_ID\"\n\nbedrock_agent_runtime = boto3.client(\"bedrock-agent-runtime\")\n\n\ndef lambda_handler(event, context):\n\tprint(event)\n\n\t# Parse the incoming event body\n\tbody = json.loads(event[\"body\"])\n\tprint(body)\n\n\tsession_id = body[\"sessionId\"]\n\tinput_text = body[\"message\"]\n\tclient_code = body[\"clientCode\"]\n\n\t# Invoke the Bedrock agent\n\tresponse = bedrock_agent_runtime.invoke_agent(\n \tenableTrace=True,\n \tagentId=AGENT_ID,\n \tagentAliasId=AGENT_ALIAS_ID,\n \tsessionId=session_id,\n \tinputText=input_text,\n\t)\n\n\tprint(response)\n\n\t# Process the response chunks\n\tresp_text = \"\"\n\tfor chunk in response[\"completion\"]:\n \tprint(chunk)\n \tif \"chunk\" in chunk:\n \tdecoded_chunk = chunk[\"chunk\"][\"bytes\"].decode()\n \tprint(decoded_chunk)\n \tresp_text += decoded_chunk\n\n\t# Prepare the response\n\tresponse = {\n \t\"statusCode\": 200,\n \t\"headers\": {\n \t\"Content-Type\": \"application\/json\",\n \t\"Access-Control-Allow-Origin\": \"*\",\n \t\"Access-Control-Allow-Credentials\": True,\n \t},\n \t\"body\": resp_text,\n\t}\n\n\treturn response\n<\/code><\/pre>\n\n\n\n
Utilizza strumenti come Postman<\/strong> o curl<\/strong> per inviare richieste al tuo endpoint API e verificare che l’agent risponda correttamente. Testa vari scenari, inclusi:<\/p>\n\n\n\n\n
Considerazioni e Best Practice<\/h3>\n\n\n\n
\n
\n
<\/li>\n\n\n\n\n
Conclusione<\/h2>\n\n\n\n
\n\n\n\nAbout Proud2beCloud<\/h4>\n\n\n\n