Inteligencia Artificial generativa geoespacial con Amazon Bedrock y Amazon Location Service

Inteligencia Artificial generativa geoespacial con Amazon Bedrock y Amazon Location Service Explorando las posibilidades

Hoy en día, los flujos de trabajo geoespaciales típicamente consisten en cargar datos, transformarlos y luego producir información visual como mapas, texto o gráficos. La AI generativa puede automatizar estas tareas a través de agentes autónomos . En esta publicación, discutiremos cómo utilizar los modelos base de Amazon Bedrock para impulsar a los agentes a completar tareas geoespaciales. Estos agentes pueden realizar diversas tareas y responder preguntas utilizando servicios basados en la ubicación como geocodificación disponibles a través de Amazon Location Service. También compartimos código de muestra que utiliza un agente para combinar las capacidades de Amazon Bedrock con Amazon Location. Además, discutimos las consideraciones de diseño que se tuvieron en cuenta al construirlo.

Amazon Bedrock es un servicio completamente administrado que ofrece una API fácil de usar para acceder a modelos base para texto, imagen y embedding. Amazon Location ofrece una API para mapas, lugares y rutas con datos proporcionados por terceros confiables como Esri, HERE, Grab y OpenStreetMap. Si necesita tener control total de su infraestructura, puede utilizar Amazon SageMaker JumpStart, que le brinda la capacidad de implementar modelos base y acceder a cientos de modelos.

Visión general de la solución

En el ámbito de los grandes modelos de lenguaje (LLMs), un agente es una entidad que puede razonar y completar tareas de manera autónoma con la ayuda de un LLM. Esto permite que los LLM vayan más allá de la generación de texto para realizar conversaciones y completar tareas específicas de dominio. Para guiar este comportamiento, utilizamos patrones de razonamiento. Según el artículo de investigación Large Language Models are Zero-Shot Reasoners, los LLM se destacan en el razonamiento de alto nivel, a pesar de tener un límite de conocimiento.

Seleccionamos Claude 2 como nuestro modelo base de Amazon Bedrock con el objetivo de crear un agente geoespacial capaz de manejar tareas geoespaciales. El concepto principal era simple: pensar como un científico de datos geoespaciales. La tarea consistía en escribir código Python para leer datos, transformarlos y luego visualizarlos en un mapa interesante. Utilizamos un patrón de estímulo conocido como Plan-and-Solve Prompting con este propósito.

Utilizando una estrategia de Plan-and-Solve, es posible realizar un razonamiento de varios pasos y desarrollar un plan de alto nivel como primera tarea. Esto funciona bien para nuestro flujo de carga, transformación y visualización, y es el plan de alto nivel que nuestro agente utilizará. Cada una de estas sub tareas se envían a Claude 2 para que se resuelvan por separado.

Hemos establecido una tarea de ejemplo para crear un mapa de calor de precios de listados de Airbnb en Nueva York. Para planificar un camino para completar la tarea, el agente necesita comprender el conjunto de datos. El agente necesita conocer las columnas en el conjunto de datos y el tipo de datos en esas columnas. Generamos un resumen del conjunto de datos para que el agente pueda planificar la tarea proporcionada por el usuario, en este caso, generar un mapa de calor.

Prerrequisitos

Hay algunos requisitos previos para implementar la demostración. Necesitará acceso a una cuenta de AWS con una clave de acceso o un rol de AWS Identity and Access Management (IAM) con permisos para Amazon Bedrock y Amazon Location. Deberá crear un mapa, un índice de lugares y una clave de API de Amazon Location utilizando la consola de Amazon Location. También necesitará acceso a un entorno local o virtual donde esté instalado Docker. En nuestra demostración, utilizamos una instancia de Amazon Elastic Compute Cloud (Amazon EC2) que ejecuta Amazon Linux con Docker instalado.

Leer y resumir los datos

Para darle contexto al agente sobre el conjunto de datos, le pedimos a Claude 2 que escriba código Python que lea los datos y proporcione un resumen relevante para nuestra tarea. A continuación, se muestran algunas de las indicaciones que incluimos. La lista completa está disponible en el archivo prompts.py del proyecto.

Tu papel: Eres un analista de datos geoespaciales diseñado para analizar el esquema de datos de conjuntos de datos geoespaciales arbitrarios.Tu tarea: Se te proporciona un conjunto de URL de archivos. Debes generar una función en Python que cumpla con lo siguiente: Leer cada archivo usando geopandas. Cada archivo puede ser CSV, shapefile o GeoJSON. Usar la función integrada resolved_file_url= get_data_file_url(file_url, session_id) para obtener las URL descargables.

A partir de estas indicaciones, Claude 2 generó el siguiente código Python:

import geopandas as gpd
import pandas as pd
import numpy as np

def analizar_datos_geoespaciales(urls_archivos):
    dataframes = []
    for url_archivo in urls_archivos:
        resolved_file_url = get_data_file_url(url_archivo, 'a5b188fe-91f7-4f92-92fe-c4030721a427', 'local')
        if url_archivo.endswith('.csv'):
            df = pd.read_csv(resolved_file_url)
        elif url_archivo.endswith('.shp'):
            df = gpd.read_file(resolved_file_url)
        elif url_archivo.endswith('.parquet'):
            df = pd.read_parquet(resolved_file_url)
        elif url_archivo.endswith('.geojson'):
            df = gpd.read_file(resolved_file_url)
        else:
            raise ValueError('Formato de archivo no soportado')
        
        df = df.sample(n=3, random_state=42)
        dataframes.append({
            'url_archivo': url_archivo,
            'resolved_file_url': resolved_file_url,
            'data_frame': df,
            'nombres_columnas': list(df.columns)
        })
    
    return dataframes

urls_archivos = ['agent://airbnb_listings_price.csv']
dataframes = analizar_datos_geoespaciales(urls_archivos)

El prefijo agent:// indica a nuestra interfaz de línea de comandos (CLI) que este archivo está almacenado dentro de la carpeta de almacenamiento de sesión. Al ejecutar la CLI, creará una carpeta llamada geospatial-agent-session-storage para almacenar los datos locales. El agente ahora reconoce los datos de Airbnb cargados y sus nombres de columnas. A continuación, pidamos a Claude algunas pistas para generar un mapa de calor utilizando estas columnas. Pasaremos las siguientes indicaciones.

Tu papel: Eres un analista de datos geoespaciales diseñado para analizar el esquema de datos de conjuntos de datos geoespaciales arbitrarios.Tu tarea: Se te proporciona una tabla con algunos datos de filas. Tu tarea es generar un resumen que describa los datos en la tabla siguiendo los requisitos siguientes. La primera oración debe ser un resumen de los datos en la tabla desde el punto de vista de la acción del usuario. Si no hay una columna de geometría en la tabla, la segunda oración debe indicar los nombres de columna que se pueden usar para generar una columna de geometría en geopandas.

Claude 2 responde con una pista

Resumen: La tabla contiene columnas para el id del listado, nombre, id del anfitrión, nombre del anfitrión, detalles de la ubicación como el vecindario, latitud y longitud que se pueden usar para generar una columna de geometría para trazar. La columna de precio contiene el precio del listado que se puede usar para generar un mapa de calor de los precios de los listados.

Planear una solución

Ahora podemos pedirle a Claude 2 que elabore un plan de alto nivel. Podemos usar una biblioteca de gráficos para Python llamada NetworkX para trazar los pasos para resolver nuestro problema.

Al igual que en nuestra última indicación, proporcionamos algunos requisitos para guiar a Claude 2:

Tu papel: Eres un científico de datos geoespaciales y un experto desarrollador en Python.Tu tarea: Una serie de pasos consecutivos.Tu respuesta debe cumplir con los siguientes requisitos: Crear un solo grafo de NetworkX. No se permiten componentes desconectados. Las primeras operaciones son de carga de datos. Usar geopandas para datos espaciales.

A partir de estas indicaciones, Claude 2 generó el siguiente código Python:

import networkx as nx

G = nx.DiGraph()

# Cargar los datos
G.add_node("url_datos_airbnb", node_type="datos", ruta_datos="agent://airbnb_listings_price.csv",
           descripcion="URL para los datos de precios de listados de Airbnb")
G.add_node("cargar_datos", node_type="operación", tipo_operacion="cargar",
           descripcion="Cargar los datos de precios de listados de Airbnb")
G.add_edge("url_datos_airbnb", "cargar_datos")

G.add_node("df_airbnb", node_type="datos",
           descripcion="Pandas DataFrame que contiene los precios de listados de Airbnb")
G.add_edge("cargar_datos", "df_airbnb")

# Transformar los datos
G.add_node("agregar_geometria", node_type="operación", tipo_operacion="transformar",
           descripcion="Crear una columna de geometría usando latitud y longitud")
G.add_edge("df_airbnb", "agregar_geometria")

G.add_node("gdf_airbnb", node_type="datos",
           descripcion="GeoDataFrame con la columna de geometría agregada")
G.add_edge("agregar_geometria", "gdf_airbnb")

# Visualizar los datos
G.add_node("generar_mapa_calor", node_type="operación", tipo_operacion="visualización",
           descripcion="Generar un mapa de calor de los precios de listados")
G.add_edge("gdf_airbnb", "generar_mapa_calor")

G.add_node("mapa_calor_precios", node_type="datos",
           descripcion="El mapa de calor que muestra los precios de listados de Airbnb")
G.add_edge("generar_mapa_calor", "mapa_calor_precios")

En este gráfico de NetworkX, Claude 2 desglosa el proceso en tres segmentos principales:

  • Carga de datos – Importar los precios de listados de Airbnb desde una URL dada en un DataFrame de Pandas
  • Transformación de datos – Crear una columna de geometría basada en las coordenadas de latitud y longitud
  • Visualización de datos – Generar un mapa de calor para mostrar los precios de los listados de Airbnb

Este enfoque permite una implementación clara y directa de la tarea geoespacial en cuestión. Podemos usar GraphViz para visualizar el flujo de trabajo siguiente.

Gráfico

Implementar el plan

Ahora que Claude 2 nos ha proporcionado un plan, es hora de darle vida. Para cada paso, le pedimos a Claude 2 que escriba el código correspondiente. Para mantener a Claude 2 enfocado, proporcionamos requisitos de alto nivel para cada tarea. Sumergámonos en el código que Claude 2 generó para cada fase individual.

Cargar los datos

Para cargar los datos de precios de listados de Airbnb en un DataFrame de Pandas, creamos una indicación y pasamos algunos parámetros. La “Carga de datos de Airbnb” en la tarea de Operación hace referencia al nodo Cargar datos en nuestro gráfico que creamos anteriormente.

Tu rol: Eres un científico de datos geoespaciales y un experto desarrollador de Python. Tarea de Operación: Necesitas generar una función en Python para hacer: Cargar datos de Airbnb. Tu respuesta debe cumplir los siguientes requisitos:    La definición de la función es:     cargar_datos(url_datos_airbnb='agente://precios_listados_airbnb.csv').    Al realizar uniones espaciales, conservar al menos una columna de geometría.    La función Point requiere importar la biblioteca shapely.

A partir de estas indicaciones, Claude 2 generó el siguiente código en Python:

import pandas as pddef cargar_datos(url_datos_airbnb='agente://precios_listados_airbnb.csv'):    """    Cargar datos de precios de listados de Airbnb    """    url_archivo = obtener_url_archivo_datos(url_datos_airbnb, id_sesión, modo_almacenamiento)     datos_airbnb_df = pd.read_csv(url_archivo)    return datos_airbnb_df

Transformar los datos

A continuación, Claude 2 genera el código para agregar una columna geometría a nuestro DataFrame utilizando las columnas latitud y longitud. Para esta indicación, pasamos los siguientes requisitos:

Tu rol: Eres un científico de datos geoespaciales y un experto desarrollador de Python. Tarea de Operación: Necesitas generar una función en Python para hacer:     Agregar columna de geometría a partir de la latitud/longitud.    Tu respuesta debe cumplir los siguientes requisitos:    La definición de la función es: agregar_geometría(df_filtrado).    La línea de retorno de la función es: return airbnb_gdf.

A partir de estas indicaciones, Claude 2 generó el siguiente código en Python:

import geopandas as gpdfrom shapely.geometry import Pointdef agregar_geometría(datos_airbnb_df):    """    Agregar columna de geometría a partir de la latitud y longitud.    """    datos_airbnb_df['geometría'] = datos_airbnb_df.apply(lambda row: Point(row['longitud'], row['latitud']), axis=1)    airbnb_gdf = gpd.GeoDataFrame(datos_airbnb_df, geometry='geometría')     return airbnb_gdf

Visualizar los datos

Finalmente, Claude 2 crea una visualización de mapa de calor utilizando pydeck, que es una biblioteca de Python para representación espacial. Para esta indicación, pasamos los siguientes requisitos:

Tu rol: Eres un científico de datos geoespaciales y un experto desarrollador de Python. Tarea de Operación: Necesitas generar una función en Python para hacer: Generar mapa de calor a partir del precio. Tu respuesta debe cumplir los siguientes requisitos:    La definición de la función es: generar_mapa_calor(datos_airbnb_gdf).    La línea de retorno de la función es: return airbnb_mapa_calor.

A partir de estas indicaciones, Claude 2 generó el siguiente código en Python:

import pandas as pdimport geopandas as gpdimport pydeck as pdk def trazar_mapa_calor(datos_airbnb_gdf):    """    Trazar mapa de calor de precios de listados    """    mapa_calor_precio = pdk.Deck(        map_style=estilo_mapa_localización(),        initial_view_state=pdk.ViewState(            latitude=datos_airbnb_gdf['latitud'].mean(),            longitude=datos_airbnb_gdf['longitud'].mean(),            zoom=11,            pitch=50,        ),        layers=[            pdk.Layer(                'HexagonLayer',                data=datos_airbnb_gdf,                get_position=['longitud', 'latitud'],                radio=100,                escala_elevación=4,                rango_elevación=[0, 1000],                seleccionable=True,                extruido=True,            ),            pdk.Layer(                'ScatterplotLayer',                data=datos_airbnb_gdf,                get_position=['longitud', 'latitud'],                get_color='[200, 30, 0, 160]',                get_radius=200,            ),        ],    )     # Guardar mapa de calor HTML    mapa_calor_precio.to_html(obtener_ruta_archivo_local('mapa_calor_airbnb.html', id_sesión, nombre_tarea))     return mapa_calor_precio

Cuando Claude 2 devuelve una respuesta, también incluye algunas notas útiles que explican cómo cada función cumple con los requisitos proporcionados. Por ejemplo, para la visualización de mapa de calor, Claude 2 señaló lo siguiente:

"Esta función genera un mapa de calor de los precios de las listas de Airbnb utilizando pydeck y guarda el HTML resultante localmente. Cumple con los requisitos especificados en el enunciado."

Ensamble el código generado

Ahora que Claude 2 ha creado los bloques de construcción individuales, es hora de juntarlo todo. El agente automáticamente ensambla todas estas piezas en un único archivo de Python. Este script llama a cada una de nuestras funciones en secuencia, agilizando todo el proceso.

El paso final se ve como el siguiente código:

session_id = "a5b188fe-91f7-4f92-92fe-c4030721a427"task_name = "1694813661_airbnb_listings_price_heatmap"storage_mode = "local"# Invoca secuencialmente las funcionesairbnb_df = load_data(airbnb_data_url='agent://airbnb_listings_price.csv')airbnb_gdf = add_geometry(airbnb_df)price_heatmap = plot_heatmap(airbnb_gdf)

Después de que el script esté completo, podemos ver que Claude 2 ha creado un archivo HTML con el código para visualizar nuestro mapa de calor. La siguiente imagen muestra Nueva York en un mapa base de Amazon Location con un mapa de calor que visualiza los precios de las listas de Airbnb.

Visualización de mapa de calor

Utilice Amazon Location con Amazon Bedrock

Aunque nuestro agente Plan-and-Solve puede manejar esta tarea geoespacial, necesitamos adoptar un enfoque ligeramente diferente para tareas como geocodificar una dirección. Para esto, podemos utilizar una estrategia llamada ReAct, donde combinamos el razonamiento y la ejecución con nuestro LLM.

En el patrón ReAct, el agente razona y actúa en función de la entrada del cliente y las herramientas a su disposición. Para dotar a este agente impulsado por Claude 2 con la capacidad de geocodificar, desarrollamos una herramienta de geocodificación. Esta herramienta utiliza la API de Amazon Location Places, específicamente el método SearchPlaceIndexForText, para convertir una dirección en sus coordenadas geográficas.

Agente: ¡Hola! Soy el agente Smith, tu asistente conversacional geoespacial. ¿Cómo puedo ayudarte hoy?Tú: >? Hola, ¿puedes darme las coordenadas de 112 E 11th St, Austin, TX 78701?Agente: Las coordenadas de 112 E 11th St, Austin, TX 78701 son longitud -97.740590981087 y latitud 30.274118017533.

En este breve intercambio, el agente decifra tu intención de geocodificar una dirección, activa la herramienta de geocodificación y devuelve la latitud y longitud.

Ya sea trazando un mapa de calor o geocodificando una dirección, Claude 2 combinado con agentes como ReAct y Plan and Solve puede simplificar los flujos de trabajo geoespaciales.

Implementar la demostración

Para empezar, completa los siguientes pasos:

  1. Clona el siguiente repositorio en tu máquina local o en una instancia de EC2. Es posible que necesites ejecutar aws configure --profile <nombreperfil> y establecer una Región predeterminada; esta aplicación se probó usando us-east-1.
git clone https://github.com/aws-samples/amazon-location-geospatial-agent/

Ahora que tenemos el repositorio clonado, configuramos nuestras variables de entorno.

  1. Cambia al directorio de la carpeta del proyecto clonado:
cd amazon-location-geospatial-agent
  1. Edita el archivo .env usando tu editor de texto preferido:
vim .env
  1. Añade el nombre de tu mapa, el nombre del índice de lugares y la clave de API:
API_KEY_NAME=AgentAPIKeyMAP_NAME=AgentMapPLACE_INDEX_NAME=AgentPlaceIndex
  1. Ejecuta el siguiente comando para construir tu contenedor:
docker build -t agent .
  1. Ejecuta el siguiente comando para ejecutar y conectarte a tu contenedor de Docker:
docker run --rm -it -v ~/.aws:/root/.aws --entrypoint bash agent
  1. Obtén el conjunto de datos de 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. Ejecuta el siguiente comando para crear una sesión. Utilizamos sesiones para aislar entornos de chat únicos.
SESSION_ID="3c18d48c-9c9b-488f-8229-e2e8016fa851" FILE_NAME="listings.csv" make create-session

Ahora estás listo para iniciar la aplicación.

  1. Ejecuta el siguiente comando para iniciar la aplicación de chat:
poetry run agent --session-id 3c18d48c-9c9b-488f-8229-e2e8016fa851 --profile <profilename>

Se mostrará un mensaje de bienvenida en el chat.

  1. Puedes empezar por hacer la siguiente pregunta:
He subido el archivo listings.csv. Dibuja un mapa de calor del precio de los anuncios de Airbnb.

El agente toma el archivo Airbnb_listings_price.csv que hemos descargado en la carpeta /data y lo analiza en un DataFrame geoespacial. Luego genera el código para transformar los datos y el código para la visualización. Finalmente, crea un archivo HTML que se escribirá en la carpeta /data, el cual puedes abrir en un navegador para visualizar el mapa de calor.

Otro ejemplo utiliza la API de Amazon Location Places para geocodificar una dirección. Si le pedimos al agente que geocodifique la dirección 112 E 11th St, Austin, TX 78701, obtendremos una respuesta como se muestra en la siguiente imagen.

Interacción de ejemplo

Conclusión

En este artículo, proporcionamos una breve descripción general de Amazon Bedrock y Amazon Location, y cómo puedes utilizarlos juntos para analizar y visualizar datos geoespaciales. También recorrimos Plan-and-Solve y ReAct y cómo los utilizamos en nuestro agente.

Nuestro ejemplo sólo raspa la superficie. Prueba descargar nuestro código de muestra y agregar tus propios agentes y herramientas para tus tareas geoespaciales.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Investigación

El Avance Computacional Ayudará a los Investigadores a Modelar el Clima con Mayor Fidelidad.

Los investigadores han propuesto una mejora algorítmica que podría mejorar la modelización del clima al equilibrar lo...

Inteligencia Artificial

Conoce a Gemini el innovador modelo multimodal de IA de Google que redefine el futuro de la inteligencia artificial

La última incursión de Google en la inteligencia artificial, Gemini, representa un salto significativo en la tecnolog...

Inteligencia Artificial

ChatGPT tiende hacia el liberalismo

Investigaciones realizadas por científicos de la Universidad de East Anglia en el Reino Unido sugieren que el ChatGPT...

Inteligencia Artificial

¿Cómo supera Bing Chat a ChatGPT en proporcionar conocimiento en tiempo real actualizado? Conoce la Generación con Recuperación Mejorada (RAG)

Con el desarrollo de los Modelos de Lenguaje Grande (LLMs) en los últimos tiempos, estos modelos han provocado un cam...

Inteligencia Artificial

Gigantesco Telescopio Adopta Robots de Mantenimiento Inteligentes

Cinco sistemas y plataformas de robots inteligentes han sido autorizados por las autoridades para mantener el Telesco...