Home Машинное обучение Геопространственный генеративный искусственный интеллект с Amazon Bedrock и Amazon Location Service | DeepTech

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

0
Геопространственный генеративный искусственный интеллект с Amazon Bedrock и Amazon Location Service
 | DeepTech

Сегодня геопространственные рабочие процессы обычно состоят из загрузки данных, их преобразования и последующего создания визуальной информации, такой как карты, текст или диаграммы. Генеративный ИИ может автоматизировать эти задачи посредством автономного управления. агенты. В этом посте мы обсудим, как использовать модели фундамента из 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 выходить за рамки генерации текста, вести беседы и выполнять задачи, специфичные для предметной области. Чтобы управлять этим поведением, мы используем модели рассуждения. Согласно исследовательской работе Большие языковые модели — это бесполезные рассужденияLLM преуспевают в рассуждениях высокого уровня, несмотря на нехватку знаний.

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

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

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

Предварительные условия

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

Прочтите и обобщите данные.

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

Your Role: You are a geospatial data analyzer designed to analyze data schema from arbitrary geospatial datasets.
Your Task: You are provided a set of file URLs. You need to generate a Python function that meets the following:
    Read each file using geopandas. Each file could be CSV, shape file, or GeoJSON.
    Use built-in function resolved_file_url= get_data_file_url(file_url, session_id) to get downloadable URLs.

Из этих подсказок Клод 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 он создаст папку геопространственного агента-сессии-хранилища для хранения локальных данных. Теперь агент распознает загруженные данные Airbnb и имена их столбцов. Далее, давайте попросим Клода дать несколько советов по созданию тепловой карты с использованием этих столбцов. Мы передадим следующие подсказки.

Your Role: You are a geospatial data analyzer designed to analyze data schema from arbitrary geospatial data sets.
Your Task: You are provided with a table with some rows data. Your task is to generate a summary that describes the data in the table following the requirements below.
    The first sentence should be summary of the data in the table from the aspect of the user action.
    If there is no geometry column in the table, the second sentence should note column names that can be used to generate a geometry column in geopandas.

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

Summary: The table contains columns for listing id, name, host id, host name, location details like neighborhood, latitude, and longitude that can be used to generate a geometry column for plotting. Price column contains listing price that can be used to generate a heatmap of listing prices.

Спланируйте решение

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

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

Your Role: You are a geospatial data scientist and an expert Python developer.
Your Task: A series of consecutive steps.
Your Reply needs to meet these requirements:
    Create a single NetworkX graph.
    No disconnected components allowed.
    First operations are data loading.
    Use geopandas for spatial data.

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

import networkx as nx
G = nx.DiGraph()
# Load the data
G.add_node("airbnb_data_url", node_type="data", data_path="agent://airbnb_listings_price.csv", 
           description="URL for Airbnb listing price data")
G.add_node("load_data", node_type="operation", operation_type="load",
           description="Load the Airbnb listing price data")
G.add_edge("airbnb_data_url", "load_data")
G.add_node("airbnb_df", node_type="data", 
           description="Pandas DataFrame containing Airbnb listing prices")
G.add_edge("load_data", "airbnb_df")
# Transform the data
G.add_node("add_geometry", node_type="operation", operation_type="transform",
           description="Create a geometry column using latitude and longitude")
G.add_edge("airbnb_df", "add_geometry")
G.add_node("airbnb_gdf", node_type="data",
           description="GeoDataFrame with geometry column added")
G.add_edge("add_geometry", "airbnb_gdf")
# Visualize the data
G.add_node("plot_heatmap", node_type="operation", operation_type="visualization",
           description="Generate a heatmap of listing prices")
G.add_edge("airbnb_gdf", "plot_heatmap")
G.add_node("price_heatmap", node_type="data", 
           description="The heatmap plot showing Airbnb listing prices")
G.add_edge("plot_heatmap", "price_heatmap")

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

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

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

График

Выполнить план

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

Загрузите данные

Чтобы загрузить данные о ценах Airbnb в DataFrame Pandas, мы создаем запрос и передаем некоторые параметры. «Загрузить данные Airbnb» в Operation_task ссылается на узел «Загрузить данные» на нашем графике, который мы создали ранее.

Your Role: You are a geospatial data scientist and an expert Python developer.
Operation_task: You need to generate a Python function to do: Load Airbnb data.
Your Reply needs to meet these requirements:
    The function definition is: 
    load_data(airbnb_data_url="agent://airbnb_listings_price.csv").
    When doing spatial joins, retain at least 1 geometry column.
    Point function requires importing shapely library.

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

import pandas as pd
def load_data(airbnb_data_url="agent://airbnb_listings_price.csv"):
    """
    Load Airbnb listing price data
    """
    file_url = get_data_file_url(airbnb_data_url, session_id, storage_mode) 
    airbnb_df = pd.read_csv(file_url)
    return airbnb_df

Преобразуйте данные

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

Your Role: You are a geospatial data scientist and an expert Python developer.
Operation_task: You need to generate a Python function to do: 
    Add geometry column from latitude/longitude.
    Your Reply needs to meet these requirements:
    The function definition is: add_geometry(filtered_df).
    The function return line is: return airbnb_gdf.

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

import geopandas as gpd
from shapely.geometry import Point
def add_geometry(airbnb_df):
    """
    Add geometry column from latitude and longitude
    """
    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 строит визуализацию тепловой карты, используя Пайдек, представляющая собой библиотеку Python для пространственной визуализации. Для этого приглашения мы передаем следующие требования:

Your Role: You are a geospatial data scientist and an expert Python developer.
Operation_task: You need to generate a Python function to do: Generate heatmap from price.
Your Reply needs to meet these requirements:
    The function definition is: generate_heatmap(airbnb_gdf).
    The function return line is: return airbnb_heatmap.

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

import pandas as pd
import geopandas as gpd
import pydeck as pdk
 
def plot_heatmap(airbnb_gdf):
    """
    Plot heatmap of listing prices
    """
    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,
            ),
        ),
    )
 
    # Save heatmap HTML
    price_heatmap.to_html(get_local_file_path('airbnb_heatmap.html', session_id, task_name))
 
    return price_heatmap

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

"This function generates a heatmap of Airbnb listing prices using pydeck and saves the resulting HTML locally. It fulfills the requirements specified in the prompt."

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

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

Последний шаг выглядит как следующий код:

session_id = "a5b188fe-91f7-4f92-92fe-c4030721a427"
task_name = "1694813661_airbnb_listings_price_heatmap"
storage_mode = "local"
# Sequentially invoke the functions
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 Location с тепловой картой, отображающей цены объявлений Airbnb.

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

Используйте местоположение Amazon с Amazon Bedrock

Хотя наш агент Plan-and-Solve может справиться с этой геопространственной задачей, нам нужно использовать немного другой подход для таких задач, как геокодирование адреса. Для этого мы можем использовать стратегию под названием Реактгде мы совмещаем рассуждения и действия с нашим LLM.

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

Agent: Hi! I'm Agent Smith, your conversational geospatial assistant. How can I assist you today?
You: >? Hello, can you give me the coordinates for 112 E 11th St, Austin, TX 78701?
Agent: The coordinates for 112 E 11th St, Austin, TX 78701 are longitude -97.740590981087 and latitude 30.274118017533.

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

Будь то построение тепловой карты или геокодирование адреса, Claude 2 в сочетании с такими агентами, как ReAct и Plan and Solve, может упростить геопространственные рабочие процессы.

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

Для начала выполните следующие шаги:

  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 файл с помощью предпочитаемого вами текстового редактора:
  1. Добавьте название карты, имя индекса места и ключ API:
API_KEY_NAME=AgentAPIKey
MAP_NAME=AgentMap
PLACE_INDEX_NAME=AgentPlaceIndex

  1. Запустите следующую команду, чтобы создать контейнер:
  1. Выполните следующую команду, чтобы запустить и подключиться к вашему контейнеру Docker:
docker run --rm -it -v ~/.aws:/root/.aws --entrypoint bash agent

  1. Возьмите набор данных Airbnb:
apt install -y wget
wget http://data.insideairbnb.com/united-states/ny/new-york-city/2023-10-01/visualisations/listings.csv
cp 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. Вы можете начать, задав следующий вопрос:
I've uploaded the file listings.csv. Draw a heatmap of Airbnb listing price.

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

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

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

Заключение

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

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


Об авторах

Джефф Демут — архитектор решений, который присоединился к Amazon Web Services (AWS) в 2016 году. Он специализируется на геопространственном сообществе и увлечен географическими информационными системами (ГИС) и технологиями. Помимо работы Джефф любит путешествовать, создавать приложения Интернета вещей (IoT) и возиться с новейшими гаджетами.

Свагата Пратик — старший инженер-программист, работающий в службе местоположения Amazon в Amazon Web Services (AWS), где он специализируется на генеративном искусственном интеллекте и геопространственных данных.

LEAVE A REPLY

Please enter your comment!
Please enter your name here