Геопространственный генеративный искусственный интеллект с использованием Amazon Bedrock и Amazon Location Service

Геопространственный генеративный искусственный интеллект с помощью Amazon Bedrock и Amazon Location Service

Сегодня геопространственные рабочие процессы обычно состоят из загрузки данных, их преобразования и получения визуальных исследований, таких как карты, текст или диаграммы. Генеративное искусственное интеллект-агенты могут автоматизировать эти задачи благодаря автономности. В этой статье мы обсудим, как использовать фундаментальные модели из Amazon Bedrock для управления агентами, чтобы выполнять геопространственные задачи. Эти агенты могут выполнять различные задачи и отвечать на вопросы, используя геокодирование, доступное через Amazon Location Service. Мы также предоставим образец кода, который использует агента для объединения возможностей Amazon Bedrock с Amazon Location. Кроме того, мы обсудим особенности проектирования, при планировании его создания.

Amazon Bedrock – это полностью управляемый сервис, предлагающий простой в использовании API для доступа к фундаментальным моделям для текста, изображений и встроенных вычислений. Amazon Location предоставляет API для работы с картами, местами и маршрутизацией с данными, предоставляемыми надежными сторонними поставщиками, такими как Esri, HERE, Grab и OpenStreetMap. Если вам нужно полное управление вашей инфраструктурой, вы можете использовать Amazon SageMaker JumpStart, который дает вам возможность развернуть фундаментальные модели и имеет доступ к сотням моделей.

Обзор решения

В области больших языковых моделей (LLM) агентом является сущность, которая может самостоятельно рассуждать и выполнять задачи с помощью LLM. Это позволяет LLM выходить за рамки генерации текста и проводить диалоги и выполнение задач, специфичных для области. Для направления такого поведения мы используем паттерны рассуждения. Согласно исследовательской статье, большие языковые модели – это <<нулевые разумители>> (Zero-Shot Reasoners), LLM отлично справляются с рассуждениями высокого уровня, несмотря на отсечку знаний.

Мы выбрали Claude 2 в качестве нашей базовой модели из Amazon Bedrock с целью создания геопространственного агента, способного выполнять геопространственные задачи. Базовая концепция была простой: мы думали, как геопространственный специалист по данным. Задача заключалась в написании кода на Python для чтения данных, их преобразования и визуализации на интересной карте. Мы использовали разрабатываемый паттерн, известный как паттерн «План и решение».

Использование стратегии «План и решение» позволяет проводить многошаговые рассуждения и разрабатывать высокоуровневый план в качестве первой задачи. Это хорошо работает для нашего процесса загрузки, преобразования и визуализации данных, и именно этот план наш агент будет использовать. Каждая из этих подзадач отдельно решается с помощью Claude 2.

Мы разработали примерную задачу для создания ценовой тепловой карты с объявлениями от Airbnb в Нью-Йорке. Чтобы спланировать путь для выполнения этой задачи, агенту необходимо понять набор данных. Агенту нужно знать столбцы в наборе данных и тип данных в этих столбцах. Мы создаем сводку данных, чтобы агент мог спланировать задачу, предоставленную пользователем, в данном случае, создание тепловой карты.

Необходимые условия

Есть несколько предпосылок для развертывания демонстрации. Вам понадобится доступ к учетной записи AWS с ключом доступа или IAM-ролью с разрешениями на Amazon Bedrock и Amazon Location. Вам нужно создать карту, индекс места и ключ API Amazon Location с помощью консоли Amazon Location. Вам также понадобится доступ к локальной или виртуальной среде, в которой установлен Docker. В нашей демонстрации мы используем экземпляр Amazon Elastic Compute Cloud (Amazon EC2), работающий на Amazon Linux с установленным Docker.

Чтение и суммирование данных

Чтобы предоставить агенту контекст о наборе данных, мы просим Клода 2 написать код на Python, который читает данные и предоставляет сводку, относящуюся к нашей задаче. Вот несколько из промптов, которые мы включили. Полный список доступен в файле prompts.py в проекте.

Ваша роль: вы - анализатор геопространственных данных, предназначенный для анализа схемы данных из произвольных геопространственных наборов данных.Ваша задача: вам предоставлен набор URL-адресов файлов. Вам необходимо создать функцию на Python, которая выполняет следующее:    Читать каждый файл с использованием библиотеки geopandas. Каждый файл может быть CSV, shape-файлом или GeoJSON-файлом.    Используйте встроенную функцию resolved_file_url = get_data_file_url(file_url, session_id), чтобы получить URL-адреса для скачивания.

Исходя из этих промптов, Клод 2 сгенерировал следующий код на Python:

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

def analyze_geospatial_data(file_urls):
    dataframes = []
    for file_url in file_urls:
        resolved_file_url = get_data_file_url(file_url, 'a5b188fe-91f7-4f92-92fe-c4030721a427', 'local')
        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('Unsupported file format')

        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 = analyze_geospatial_data(file_urls)

Префикс agent:// сообщает нашей CLI, что этот файл хранится внутри папки хранилища сессии. При запуске CLI он создаст папку geospatial-agent-session-storage для хранения локальных данных. Теперь агент распознает загруженные данные Airbnb и их названия столбцов. Далее давайте попросим Клода дать нам некоторые подсказки для создания тепловой карты с использованием этих столбцов. Мы передадим следующие промпты.

Ваша роль: вы - анализатор геопространственных данных, предназначенный для анализа схемы данных из произвольных геопространственных наборов данных.Ваша задача: вам предоставляется таблица с некоторыми данными строк. Ваша задача - сгенерировать сводку, описывающую данные в таблице в соответствии с нижеприведенными требованиями.    Первое предложение должно содержать сводку данных в таблице с точки зрения действий пользователя.    Если в таблице нет геометрического столбца, второе предложение должно указать названия столбцов, которые можно использовать для создания геометрического столбца в geopandas.

Клод 2 отвечает подсказкой

Summary: Таблица содержит столбцы для идентификатора объявления, названия, идентификатора хоста, имени хоста, дополнительной информации о местоположении, такой как район, широта и долгота, которые можно использовать для создания геометрического столбца для построения графика. Столбец цены содержит цены на объявления, которые можно использовать для создания тепловой карты цен на объявления.

Планирование решения

Теперь мы можем попросить Клода 2 составить высокоуровневый план. Мы можем использовать библиотеку графов для Python с названием NetworkX, чтобы представить шаги для решения нашей проблемы.

Аналогично нашему последнему промпту, мы передаем несколько требований для направления Клода 2:

Ваша роль: вы - геопространственный аналитик данных и опытный разработчик на Python.Ваша задача: серия последовательных шагов.Ваше ответ должно соответствовать следующим требованиям:    Создайте единственный граф NetworkX.    Не допускаются отдельные компоненты.    Первые операции - загрузка данных.    Используйте geopandas для пространственных данных.

Исходя из этих промптов, Клод 2 сгенерировал следующий код на Python:

import networkx as nx

G = nx.DiGraph()

# Загрузка данных
G.add_node("airbnb_data_url", node_type="data", data_path="agent://airbnb_listings_price.csv",
            description="URL для данных о ценах на Airbnb объявления")
G.add_node("load_data", node_type="operation", operation_type="load",
           description="Загрузка данных о ценах на Airbnb объявления")
G.add_edge("airbnb_data_url", "load_data")

G.add_node("airbnb_df", node_type="data",
            description="Pandas DataFrame, содержащий цены на Airbnb объявления")
G.add_edge("load_data", "airbnb_df")

# Трансформация данных
G.add_node("add_geometry", node_type="operation", operation_type="transform",
           description="Создание геометрического столбца с использованием широты и долготы")
G.add_edge("airbnb_df", "add_geometry")

G.add_node("airbnb_gdf", node_type="data",
           description="GeoDataFrame с добавленным геометрическим столбцом")
G.add_edge("add_geometry", "airbnb_gdf")

# Визуализация данных
G.add_node("plot_heatmap", node_type="operation", operation_type="visualization",
           description="Генерация тепловой карты цен на объявления")
G.add_edge("airbnb_gdf", "plot_heatmap")

G.add_node("price_heatmap", node_type="data",
            description="График тепловой карты с отображением цен на Airbnb объявления")
G.add_edge("plot_heatmap", "price_heatmap")

В этом графе NetworkX Клод 2 разбивает процесс на три основных сегмента:

  • Загрузка данных – Импорт цен на жилье Airbnb с заданного URL-адреса в Pandas DataFrame
  • Преобразование данных – Создание столбца геометрии на основе координат широты и долготы
  • Визуализация данных – Генерация тепловой карты для отображения цен на жилье Airbnb

Такой подход позволяет ясно и просто реализовать геопространственную задачу, которая перед нами стоит. Мы можем использовать GraphViz для визуализации следующего рабочего процесса.

Graph

Реализация плана

Теперь, когда Клод 2 предоставил нам план, пришло время воплотить его в жизнь. Для каждого шага мы просим Клод 2 написать соответствующий код. Чтобы Клод 2 оставался сосредоточенным, мы предоставляем высокоуровневые требования для каждой задачи. Давайте рассмотрим сгенерированный Клод 2 код для каждой отдельной фазы.

Загрузка данных

Для загрузки данных о ценах на жилье Airbnb в Pandas DataFrame мы создаем запрос и передаем некоторые параметры. “Загрузить данные Airbnb” в операционной задаче ссылается на узел “Загрузить данные” в нашем ранее созданном графе.

Ваша роль: вы являетесь геопространственным ученым-исследователем данных и экспертом по разработке на Python.Операционная задача: Вам нужно сгенерировать функцию на Python для выполнения следующего действия: Загрузить данные Airbnb.Ваш ответ должен соответствовать следующим требованиям:    Определение функции:     load_data(airbnb_data_url='agent://airbnb_listings_price.csv').    При выполнении пространственных соединений сохраните как минимум 1 геометрический столбец.    Для использования функции Point требуется импорт библиотеки shapely.

Исходя из этих запросов, Клод 2 сгенерировал следующий код на Python:

import pandas as pddef load_data(airbnb_data_url='agent://airbnb_listings_price.csv'):    """    Загрузить данные о ценах на жилье Airbnb    """    file_url = get_data_file_url(airbnb_data_url, session_id, storage_mode)     airbnb_df = pd.read_csv(file_url)    return airbnb_df

Преобразование данных

Затем Клод 2 генерирует код для добавления столбца геометрии в наш DataFrame, используя широту и долготу. Для этого запроса мы используем следующие требования:

Ваша роль: вы являетесь геопространственным ученым-исследователем данных и экспертом по разработке на Python.Операционная задача: Вам нужно сгенерировать функцию на Python для выполнения следующего действия:     Добавить столбец геометрии на основе широты/долготы.    Ваш ответ должен соответствовать следующим требованиям:    Определение функции: add_geometry(filtered_df).    Возврат из функции: return airbnb_gdf.

Исходя из этих запросов, Клод 2 сгенерировал следующий код на Python:

import geopandas as gpdfrom shapely.geometry import Pointdef add_geometry(airbnb_df):    """    Добавить столбец геометрии на основе широты и долготы    """    airbnb_df['geometry'] = airbnb_df.apply(lambda row: Point(row['longitude'], row['latitude']), axis=1)    airbnb_gdf = gpd.GeoDataFrame(airbnb_df, geometry='geometry')     return airbnb_gdf

Визуализация данных

Наконец, Клод 2 создает тепловую карту с использованием pydeck, которая является библиотекой Python для пространственного визуализации. Для этого запроса мы передаем следующие требования:

Ваша роль: вы являетесь геопространственным ученым-исследователем данных и экспертом по разработке на Python.Операционная задача: Вам нужно сгенерировать функцию на Python для выполнения следующего действия: Создать тепловую карту на основе цены.Ваш ответ должен соответствовать следующим требованиям:    Определение функции: generate_heatmap(airbnb_gdf).    Возврат из функции: return airbnb_heatmap.

Исходя из этих запросов, Клод 2 сгенерировал следующий код на Python:

import pandas as pdimport geopandas as gpdimport pydeck as pdk def plot_heatmap(airbnb_gdf):    """    Построить тепловую карту цен на объявления о жилье    """    price_heatmap = pdk.Deck(        map_style=location_map_style(),        initial_view_state=pdk.ViewState(            latitude=airbnb_gdf['latitude'].mean(),            longitude=airbnb_gdf['longitude'].mean(),            zoom=11,            pitch=50,        ),        layers=[            pdk.Layer(                'HexagonLayer',                data=airbnb_gdf,                get_position=['longitude', 'latitude'],                radius=100,                elevation_scale=4,                elevation_range=[0, 1000],                pickable=True,                extruded=True,            ),            pdk.Layer(                'ScatterplotLayer',                data=airbnb_gdf,                get_position=['longitude', 'latitude'],                get_color='[200, 30, 0, 160]',                get_radius=200,            ),        ],    )     # Сохранение HTML-файла тепловой карты    price_heatmap.to_html(get_local_file_path('airbnb_heatmap.html', session_id, task_name))     return price_heatmap

Когда Клод 2 возвращает ответ, он также включает полезные заметки, объясняющие, как каждая функция соответствует предоставленным требованиям. Например, для визуализации тепловой карты, Клод 2 отметил следующее:

"Эта функция создает тепловую карту цен на жилье Airbnb с использованием pydeck и сохраняет полученный HTML локально. Она выполняет требования, указанные в задании."

Соберите сгенерированный код

Теперь, когда Клод 2 создал отдельные строительные блоки, пришло время объединить их все вместе. Агент автоматически собирает все эти фрагменты в один файл Python. Этот скрипт последовательно вызывает каждую из наших функций, упрощая весь процесс.

Конечный шаг выглядит следующим образом:

session_id = "a5b188fe-91f7-4f92-92fe-c4030721a427"task_name = "1694813661_airbnb_listings_price_heatmap"storage_mode = "local"# Последовательно вызываем функцииairbnb_df = load_data(airbnb_data_url='agent://airbnb_listings_price.csv')airbnb_gdf = add_geometry(airbnb_df)price_heatmap = plot_heatmap(airbnb_gdf)

После завершения скрипта мы видим, что Клод 2 создал HTML-файл с кодом для визуализации нашей тепловой карты. На следующем изображении показан Нью-Йорк на базовой карте местоположений Amazon с визуализацией тепловой карты цен на жилье Airbnb.

Визуализация тепловой карты

Использование Amazon Location с Amazon Bedrock

Хотя наш агент “Планируй и решай” может справиться с этой геопространственной задачей, для задач, таких как геокодирование адреса, нам нужно использовать немного другой подход. Для этого мы можем использовать стратегию под названием “ReAct”, в которой мы сочетаем рассуждение и действие с нашим LLM.

В шаблоне “ReAct” агент рассуждает и действует на основе ввода клиента и инструментов, которыми он располагает. Чтобы оснастить агента, работающего на базе Клод 2, возможностью геокодирования, мы разработали инструмент геокодирования. Этот инструмент использует API местоположений Amazon, конкретно метод SearchPlaceIndexForText, чтобы преобразовать адрес в его географические координаты.

Agent: Привет! Я Агент Смит, ваш разговорный геопространственный ассистент. Чем я могу помочь вам сегодня?Вы: >? Привет, можешь ли ты дать мне координаты для 112 E 11th St, Austin, TX 78701?Агент: Координаты для 112 E 11th St, Austin, TX 78701 - это долгота -97.740590981087 и широта 30.274118017533.

В этом кратком обмене агент расшифровывает ваше намерение выполнить геокодирование адреса, активирует инструмент геокодирования и возвращает широту и долготу.

Будь то построение тепловой карты или геокодирование адреса, Клод 2, в сочетании с агентами типа ReAct и “Планируй и решай”, может упростить геопространственные рабочие процессы.

Развертывание демо-версии

Чтобы начать, выполните следующие шаги:

  1. Клонируйте следующий репозиторий на свою локальную машину или на экземпляр EC2. Вам может потребоваться выполнить команду aws configure --profile <profilename> и установить регион по умолчанию; это приложение было протестировано с использованием us-east-1.
git clone https://github.com/aws-samples/amazon-location-geospatial-agent/

Теперь, когда мы клонировали репозиторий, настроим наши переменные среды.

  1. Перейдите в каталог проекта, который был склонирован:
cd amazon-location-geospatial-agent
  1. Отредактируйте файл .env с помощью выбранного вами текстового редактора:
vim .env
  1. Добавьте название вашей карты, название индекса места и ключ API:
API_KEY_NAME=AgentAPIKeyMAP_NAME=AgentMapPLACE_INDEX_NAME=AgentPlaceIndex
  1. Запустите следующую команду, чтобы создать свой контейнер:
docker build -t agent .
  1. Запустите следующую команду, чтобы запустить и подключиться к контейнеру Docker:
docker run --rm -it -v ~/.aws:/root/.aws --entrypoint bash agent
  1. Загрузите набор данных 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. Запустите следующую команду, чтобы создать сессию. Мы используем сеансы для изоляции уникальных чат-сред.
SESSION_ID="3c18d48c-9c9b-488f-8229-e2e8016fa851" FILE_NAME="listings.csv" make create-session

Теперь вы готовы запустить приложение.

  1. Запустите следующую команду, чтобы запустить приложение чата:
poetry run agent --session-id 3c18d48c-9c9b-488f-8229-e2e8016fa851 --profile <profilename>

Вы увидите окно чата.

  1. Вы можете начать, задав следующий вопрос:
Я загрузил файл listings.csv. Постройте тепловую карту цен на жилье Airbnb.

Агент получает файл Airbnb_listings_price.csv, который мы загрузили в папку /data, и преобразует его в геопространственный DataFrame. Затем он создает код для преобразования данных, а также код для визуализации. Наконец, он создает HTML-файл, который будет записан в папку /data, и вы можете открыть его в браузере, чтобы увидеть тепловую карту.

Еще один пример использует API мест Amazon Location для геокодирования адреса. Если мы попросим агента преобразовать адрес 112 E 11th St, Austin, TX 78701, мы получим ответ, показанный на следующем изображении.

Пример взаимодействия

Заключение

В этом посте мы предоставили краткий обзор Amazon Bedrock и Amazon Location и как их можно использовать вместе для анализа и визуализации геопространственных данных. Мы также рассмотрели Plan-and-Solve и ReAct и как мы использовали их в нашем агенте.

Наш пример только касается поверхности. Попробуйте скачать наш образец кода и добавить своих собственных агентов и инструменты для ваших геопространственных задач.