Geospatial generative AI con Amazon Bedrock e Amazon Location Service

Intelligenza Artificiale generativa geospaziale con Amazon Bedrock e Amazon Location Service

Oggi, i workflow geospaziali di solito consistono nel caricare i dati, trasformarli e quindi produrre insight visivi come mappe, testo o grafici. L’IA generativa può automatizzare queste attività attraverso agenti autonomi .. In questo post, discutiamo come utilizzare modelli fondamentali di Amazon Bedrock per alimentare agenti nell’esecuzione di compiti geospaziali. Questi agenti possono svolgere varie attività e rispondere a domande utilizzando servizi basati sulla localizzazione come la geocodifica disponibile attraverso Amazon Location Service. Condividiamo anche del codice di esempio che utilizza un agente per collegare le capacità di Amazon Bedrock con Amazon Location. Inoltre, discutiamo delle considerazioni di progettazione che hanno portato alla sua realizzazione.

Amazon Bedrock è un servizio completamente gestito che offre un’API facile da usare per accedere a modelli fondamentali per testo, immagini e embedding. Amazon Location offre un’API per mappe, luoghi e itinerari con dati forniti da terze parti affidabili come Esri, HERE, Grab e OpenStreetMap. Se hai bisogno di pieno controllo della tua infrastruttura, puoi utilizzare Amazon SageMaker JumpStart, che ti offre la possibilità di distribuire modelli fondamentali e ha accesso a centinaia di modelli.

Panoramica della soluzione

Nell’ambito dei grandi modelli di linguaggio (LLM), un agente è un’entità in grado di ragionare autonomamente e completare compiti con l’aiuto di un LLM. Ciò consente ai LLM di andare oltre la generazione di testo per condurre conversazioni e completare compiti specifici del dominio. Per guidare questo comportamento, utilizziamo modelli di ragionamento. Secondo l’articolo di ricerca I grandi modelli di linguaggio sono ragionatori Zero-Shot, i LLM eccellono nel ragionamento di alto livello, nonostante abbiano un limite di conoscenza.

Abbiamo selezionato Claude 2 come nostro modello fondamentale da Amazon Bedrock con l’obiettivo di creare un agente geospaziale in grado di gestire compiti geospaziali. Il concetto generale era semplice: pensare come uno scienziato dei dati geospaziali. Il compito consisteva nel scrivere codice Python per leggere i dati, trasformarli e quindi visualizzarli in una mappa interessante. Abbiamo utilizzato un modello di sollecitazione noto come Sollecitazione di pianificazione e soluzione a questo scopo.

Utilizzare una strategia di pianificazione e soluzione consente il ragionamento a più passaggi e lo sviluppo di un piano di alto livello come primo compito. Questo funziona bene per il nostro flusso di lavoro di caricamento, trasformazione e visualizzazione ed è il piano di alto livello che il nostro agente utilizzerà. Ognuna di queste sottotasks viene inviata a Claude 2 per essere risolta separatamente.

Abbiamo ideato un compito di esempio per creare una mappa termica dei prezzi degli elencati Airbnb a New York. Per pianificare un percorso per completare il compito, l’agente deve comprendere il dataset. L’agente deve conoscere le colonne nel dataset e il tipo di dati in quelle colonne. Generiamo un riepilogo dal dataset in modo che l’agente possa pianificare il compito fornito dall’utente, in questo caso, generando una mappa termica.

Prerequisiti

Ci sono alcune prerequisiti per distribuire la demo. Avrai bisogno di accesso a un account AWS con una chiave di accesso o un ruolo di Identity and Access Management (IAM) di AWS con le autorizzazioni per Amazon Bedrock e Amazon Location. Dovrai creare una mappa, un indice dei luoghi e una chiave dell’API di Amazon Location utilizzando la console di Amazon Location. Avrai anche bisogno di accesso a un ambiente locale o virtuale in cui sia installato Docker. Nella nostra dimostrazione, utilizziamo un’istanza di Amazon Elastic Compute Cloud (EC2) che esegue Amazon Linux con Docker installato.

Leggi e riepiloga i dati

Per fornire contesto all’agente riguardo al dataset, chiediamo a Claude 2 di scrivere del codice Python che legga i dati e fornisca un riepilogo rilevante per il nostro compito. Di seguito sono riportati alcuni degli esempi che abbiamo incluso. La lista completa è disponibile nel file prompts.py del progetto.

Il tuo ruolo: sei un analizzatore di dati geospaziali progettato per analizzare lo schema di dati da dataset geospaziali arbitrari. Il tuo compito: ti vengono forniti un insieme di URL dei file. Devi generare una funzione Python che soddisfi quanto segue:    Leggi ogni file utilizzando geopandas. Ogni file può essere CSV, shape file o GeoJSON.    Utilizza la funzione integrata resolved_file_url= get_data_file_url(file_url, session_id) per ottenere URL scaricabili.

Dai questi esempi, Claude 2 ha generato il seguente codice Python:

import geopandas as gpdimport pandas as pdimport numpy as np def analizza_dati_geospaziali(file_urls):    dataframes = []    for file_url in file_urls:        resolved_file_url = get_data_file_url(file_url, 'a5b188fe-91f7-4f92-92fe-c4030721a427', 'locale')        if file_url.endswith('.csv'):            df = pd.read_csv(resolved_file_url)        elif file_url.endswith('.shp'):            df = gpd.read_file(resolved_file_url)        elif file_url.endswith('.parquet'):            df = pd.read_parquet(resolved_file_url)        elif file_url.endswith('.geojson'):            df = gpd.read_file(resolved_file_url)        else:            raise ValueError('Formato di file non supportato')         df = df.sample(n=3, random_state=42)        dataframes.append({            'file_url': file_url,             'resolved_file_url': resolved_file_url,            'data_frame': df,            'column_names': list(df.columns)        })    return dataframes file_urls = ['agent://airbnb_listings_price.csv']dataframes = analizza_dati_geospaziali(file_urls)

Il prefisso agent:// indica alla nostra CLI (Command Line Interface) che questo file è memorizzato all’interno della cartella di archiviazione della sessione. All’avvio della CLI, verrà creata una cartella denominata geospatial-agent-session-storage per memorizzare i dati locali. L’agente ora riconosce i dati caricati di Airbnb e i nomi delle colonne. Ora, chiediamo a Claude di fornire alcuni suggerimenti per generare una mappa di calore utilizzando queste colonne. Passiamo i seguenti esempi:

Il tuo ruolo: sei un analizzatore di dati geospaziali progettato per analizzare lo schema di dati da insiemi di dati geospaziali arbitrari. Il tuo compito: ti viene fornita una tabella con alcune righe di dati. Il tuo compito è generare un riepilogo che descriva i dati nella tabella seguendo i requisiti di seguito.    La prima frase dovrebbe essere un riepilogo dei dati nella tabella dal punto di vista dell'azione dell'utente.    Se non c'è una colonna di geometria nella tabella, la seconda frase dovrebbe indicare i nomi delle colonne che possono essere utilizzati per generare una colonna di geometria in geopandas.

Claude 2 risponde con un suggerimento

Riepilogo: La tabella contiene colonne per id dell'annuncio, nome, id dell'host, nome dell'host, dettagli sulla posizione come il quartiere, la latitudine e la longitudine che possono essere utilizzati per generare una colonna di geometria per la visualizzazione. La colonna del prezzo contiene i prezzi degli annunci che possono essere usati per generare una mappa di calore dei prezzi degli annunci.

Pianifica una soluzione

Ora possiamo chiedere a Claude 2 di elaborare un piano di alto livello. Possiamo utilizzare una libreria di grafici per Python chiamata NetworkX per mappare i passaggi per risolvere il nostro problema.

Come nel nostro ultimo prompt, forniamo alcuni requisiti per guidare Claude 2:

Il tuo ruolo: sei uno scienziato dei dati geospaziali ed un esperto sviluppatore Python. Il tuo compito: una serie di passaggi consecutivi. La tua risposta deve soddisfare i seguenti requisiti:    Crea un singolo grafo NetworkX.    Non sono ammessi componenti sconnessi.    Le prime operazioni sono il caricamento dei dati.    Usa geopandas per i dati spaziali.

Dai questi esempi, Claude 2 ha generato il seguente codice Python:

import networkx as nxG = nx.DiGraph()# Carica i datiG.add_node("airbnb_data_url", node_type="data", data_path="agent://airbnb_listings_price.csv",            description="URL per i dati sui prezzi degli annunci di Airbnb")G.add_node("load_data", node_type="operation", operation_type="load",           description="Carica i dati sui prezzi degli annunci di Airbnb")G.add_edge("airbnb_data_url", "load_data")G.add_node("airbnb_df", node_type="data",            description="Pandas DataFrame contenente i prezzi degli annunci di Airbnb")G.add_edge("load_data", "airbnb_df")# Trasforma i datiG.add_node("add_geometry", node_type="operation", operation_type="transform",           description="Crea una colonna di geometria utilizzando latitudine e longitudine")G.add_edge("airbnb_df", "add_geometry")G.add_node("airbnb_gdf", node_type="data",           description="GeoDataFrame con la colonna di geometria aggiunta")G.add_edge("add_geometry", "airbnb_gdf")# Visualizza i datiG.add_node("plot_heatmap", node_type="operation", operation_type="visualization",           description="Genera una mappa di calore dei prezzi di annunci")G.add_edge("airbnb_gdf", "plot_heatmap")G.add_node("price_heatmap", node_type="data",            description="La mappa di calore dei prezzi degli annunci di Airbnb")G.add_edge("plot_heatmap", "price_heatmap")

In questo grafo NetworkX, Claude 2 suddivide il processo in tre segmenti principali:

  • Caricamento dati – Importa i prezzi degli annunci Airbnb da un determinato URL in un DataFrame di Pandas
  • Trasformazione dei dati – Crea una colonna di geometria basata sulle coordinate di latitudine e longitudine
  • Visualizzazione dei dati – Genera una mappa termica per visualizzare i prezzi degli annunci Airbnb

Questo approccio consente un’implementazione chiara e diretta del compito geospaziale in questione. Possiamo utilizzare GraphViz per visualizzare il flusso di lavoro seguente.

Grafo

Implementare il piano

Ora che Claude 2 ci ha fornito un piano, è tempo di metterlo in pratica. Per ogni passo, chiediamo a Claude 2 di scrivere il codice corrispondente. Per mantenere Claude 2 concentrato, forniamo requisiti di alto livello per ogni attività. Approfondiamo il codice che Claude 2 ha generato per ciascuna fase individuale.

Carica i dati

Per caricare i dati dei prezzi degli annunci Airbnb in un DataFrame di Pandas, creiamo una richiesta e passiamo alcuni parametri. L'”Operazione_carica dati Airbnb” fa riferimento al nodo Carica dati nel nostro grafo creato in precedenza.

Il tuo ruolo: sei un data scientist geospaziale ed esperto sviluppatore Python.Operazione_carica dati: Devi generare una funzione Python per eseguire: Carica dati Airbnb.Il tuo riscontro deve soddisfare i seguenti requisiti:    La definizione della funzione è:     carica_dati(url_dati_airbnb='agent://airbnb_listings_price.csv').    Quando effettui unioni spaziali, mantieni almeno una colonna di geometria.    La funzione richiede l'importazione della libreria shapely per la funzione Point.

Dalle richieste, Claude 2 ha generato il seguente codice Python:

import pandas as pddef carica_dati(url_dati_airbnb='agent://airbnb_listings_price.csv'):    """    Carica dati sui prezzi degli annunci Airbnb    """    url_file = get_data_file_url(url_dati_airbnb, session_id, storage_mode)    airbnb_df = pd.read_csv(url_file)    return airbnb_df

Trasforma i dati

Successivamente, Claude 2 genera il codice per aggiungere una colonna geometria al nostro DataFrame utilizzando latitudine e longitudine. Per questa richiesta, passiamo i seguenti requisiti:

Il tuo ruolo: sei un data scientist geospaziale ed esperto sviluppatore Python.Operazione_carica dati: Devi generare una funzione Python per eseguire:     Aggiungi colonna di geometria da latitudine/longitudine.Il tuo riscontro deve soddisfare i seguenti requisiti:    La definizione della funzione è: aggiungi_geometria(df_filtrato).    La riga di ritorno della funzione è: return airbnb_gdf.

Dalle richieste, Claude 2 ha generato il seguente codice Python:

import geopandas as gpdfrom shapely.geometry import Pointdef aggiungi_geometria(df_airbnb):    """    Aggiungi colonna di geometria da latitudine e longitudine    """    df_airbnb['geometria'] = df_airbnb.apply(lambda riga: Point(riga['longitudine'], riga['latitudine']), axis=1)    airbnb_gdf = gpd.GeoDataFrame(df_airbnb, geometry='geometria')    return airbnb_gdf

Visualizza i dati

Infine, Claude 2 crea una visualizzazione a mappa termica utilizzando pydeck, che è una libreria Python per il rendering spaziale. Per questa richiesta, passiamo i seguenti requisiti:

Il tuo ruolo: sei un data scientist geospaziale ed esperto sviluppatore Python.Operazione_visualizza dati: Devi generare una funzione Python per eseguire: Genera mappa termica da prezzo.Il tuo riscontro deve soddisfare i seguenti requisiti:    La definizione della funzione è: genera_mappa_termica(df_airbnb).    La riga di ritorno della funzione è: return mappa_termica_airbnb.

Dalle richieste, Claude 2 ha generato il seguente codice Python:

import pandas as pdimport geopandas as gpdimport pydeck as pdk def plot_heatmap(df_airbnb):    """    Plotta la mappa termica dei prezzi degli annunci    """    mappa_prezzi = pdk.Deck(        map_style=location_map_style(),        initial_view_state=pdk.ViewState(            latitude=df_airbnb['latitudine'].mean(),            longitude=df_airbnb['longitudine'].mean(),            zoom=11,            pitch=50,        ),        layers=[            pdk.Layer(                'HexagonLayer',                data=df_airbnb,                get_position=['longitudine', 'latitudine'],                radius=100,                elevation_scale=4,                elevation_range=[0, 1000],                pickable=True,                extruded=True,            ),            pdk.Layer(                'ScatterplotLayer',                data=df_airbnb,                get_position=['longitudine', 'latitudine'],                get_color='[200, 30, 0, 160]',                get_radius=200,            ),        ],    )    # Salva la mappa termica come HTML    mappa_prezzi.to_html(get_local_file_path('mappa_termica_airbnb.html', session_id, task_name))    return mappa_prezzi

Quando Claude 2 restituisce una risposta, include anche alcune note utili che spiegano come ogni funzione soddisfi i requisiti forniti. Ad esempio, per la visualizzazione della mappa di calore, Claude 2 ha annotato quanto segue:

"Questa funzione genera una mappa di calore dei prezzi delle case Airbnb utilizzando pydeck e salva l'HTML risultante localmente. Soddisfa i requisiti specificati nel prompt."

Assembla il codice generato

Ora che Claude 2 ha creato i blocchi di costruzione individuali, è il momento di mettere tutto insieme. L’agente assembla automaticamente tutti questi frammenti in un singolo file Python. Questo script chiama ciascuna delle nostre funzioni in sequenza, semplificando l’intero processo.

Il passaggio finale assomiglia al seguente codice:

session_id = "a5b188fe-91f7-4f92-92fe-c4030721a427"task_name = "1694813661_airbnb_listings_price_heatmap"storage_mode = "local"# Richiama in sequenza le funzioniairbnb_df = load_data(airbnb_data_url='agent://airbnb_listings_price.csv')airbnb_gdf = add_geometry(airbnb_df)price_heatmap = plot_heatmap(airbnb_gdf)

Dopo che lo script è completo, possiamo vedere che Claude 2 ha creato un file HTML con il codice per visualizzare la nostra mappa di calore. L’immagine seguente mostra New York su una mappa di base di Amazon Location con una mappa di calore che visualizza i prezzi delle case Airbnb.

Visualizzazione Mappa di Calore

Utilizza Amazon Location con Amazon Bedrock

Anche se il nostro agente Plan-and-Solve può gestire questa attività geospaziale, dobbiamo adottare un approccio leggermente diverso per attività come geocodificare un indirizzo. Per questo, possiamo utilizzare una strategia chiamata ReAct, in cui combiniamo il ragionamento e l’azione con il nostro LLM.

Nel modello ReAct, l’agente ragiona e agisce in base all’input del cliente e agli strumenti a sua disposizione. Per dotare questo agente potenziato da Claude 2 della capacità di geocodificare, abbiamo sviluppato un tool di geocodifica. Questo strumento utilizza l’API dei luoghi di Amazon Location, in particolare il metodo SearchPlaceIndexForText, per convertire un indirizzo nelle sue coordinate geografiche.

Agente: Ciao! Sono l'Agente Smith, il tuo assistente geospaziale conversazionale. Come posso aiutarti oggi?Tu: >? Ciao, puoi darmi le coordinate per 112 E 11th St, Austin, TX 78701?Agente: Le coordinate per 112 E 11th St, Austin, TX 78701 sono longitudine -97.740590981087 e latitudine 30.274118017533.

In questo breve scambio, l’agente decifra la tua intenzione di geocodificare un indirizzo, attiva lo strumento di geocodifica e restituisce la latitudine e la longitudine.

Sia che si tratti di tracciare una mappa di calore o di geocodificare un indirizzo, Claude 2 combinato con agenti come ReAct e Plan and Solve può semplificare i flussi di lavoro geospaziali.

Pubblica la demo

Per iniziare, segui i seguenti passaggi:

  1. Clona il seguente repository sulla tua macchina locale o su un’istanza EC2. Potrebbe essere necessario eseguire aws configure --profile <profilename> e impostare una regione predefinita; questa applicazione è stata testata utilizzando us-east-1.
git clone https://github.com/aws-samples/amazon-location-geospatial-agent/

Ora che abbiamo clonato il repository, configuriamo le nostre variabili d’ambiente.

  1. Sposta nella cartella del progetto clonato:
cd amazon-location-geospatial-agent
  1. Modifica il file .env utilizzando il tuo editor di testo preferito:
vim .env
  1. Aggiungi il nome della tua mappa, il nome dell’indice dei luoghi e la chiave API:
API_KEY_NAME=AgentAPIKeyMAP_NAME=AgentMapPLACE_INDEX_NAME=AgentPlaceIndex
  1. Esegui il seguente comando per creare il tuo contenitore:
docker build -t agent .
  1. Esegui il seguente comando per eseguire e connetterti al tuo contenitore Docker:
docker run --rm -it -v ~/.aws:/root/.aws --entrypoint bash agent
  1. Ottieni il dataset di Airbnb:
apt install -y wgetwget http://data.insideairbnb.com/united-states/ny/new-york-city/2023-10-01/visualisations/listings.csvcp listings.csv data/listings.csv
  1. Esegui il seguente comando per creare una sessione. Utilizziamo le sessioni per isolare gli ambienti di chat unici.
SESSION_ID="3c18d48c-9c9b-488f-8229-e2e8016fa851" FILE_NAME="listings.csv" make create-session

Ora sei pronto per avviare l’applicazione.

  1. Esegui il seguente comando per avviare l’applicazione di chat:
poetry run agent --session-id 3c18d48c-9c9b-488f-8229-e2e8016fa851 --profile <profilename>

Verrai accolto da un prompt di chat.

  1. Puoi iniziare facendo la seguente domanda:
Ho caricato il file listings.csv. Disegna una mappa di calore del prezzo delle offerte di Airbnb.

L’agente acquisisce il file Airbnb_listings_price.csv che abbiamo scaricato nella cartella /data e lo analizza in un DataFrame geospaziale. Quindi genera il codice per trasformare i dati e il codice per la visualizzazione. Infine, crea un file HTML che verrà scritto nella cartella /data e che puoi aprire per visualizzare la mappa di calore tramite un browser.

Un altro esempio utilizza l’API dei luoghi di Amazon Location per geocodificare un indirizzo. Se chiediamo all’agente di geocodificare l’indirizzo 112 E 11th St, Austin, TX 78701, otterremo una risposta come mostrato nell’immagine seguente.

Example Interaction

Conclusioni

In questo articolo, abbiamo fornito una breve panoramica di Amazon Bedrock e Amazon Location e come è possibile utilizzarli insieme per analizzare e visualizzare dati geospaziali. Abbiamo anche illustrato Plan-and-Solve e ReAct e come li abbiamo utilizzati nel nostro agente.

Il nostro esempio rappresenta solo un’introduzione. Prova a scaricare il nostro codice di esempio e aggiungi i tuoi agenti e strumenti per le tue attività geospaziali.