Amazon Web Services ブログ

Amazon Bedrock と Amazon Location Service による地理空間生成系 AI

この記事は、Geospatial
generative AI with Amazon Bedrock and Amazon Location Service
を翻訳したのものです。

通常、地理空間ワークフローは、データを読み込んで変換し、地図、テキスト、グラフなどに可視化します。生成系 AI、自律型エージェントを利用すると、これらのタスクを自動化できます。このブログでは、Amazon Bedrock の基盤モデルからパワーエージェントまで、地理空間タスクを完了する方法について説明します。
これらのエージェントは、Amazon Location Service
を通じて利用できるジオコーディングなどのロケーションベースのサービスを使用して、さまざまなタスクを実行し、質問に答えることができます。エージェントを使用して Amazon Bedrock と Amazon Location Service
の機能を橋渡しするサンプルコードを示し、構築時の設計における考慮事項について説明します。

Amazon Bedrockは、テキスト、画像、Embedding のための基礎モデルにアクセスするための使いやすい API を提供するフルマネージドサービスです。Amazon
Locationは、Esri、HERE、Grab、OpenStreetMap などの信頼できるサードパーティから提供されたデータを使用して、地図、場所、ルーティング用の API を提供しています。
インフラストラクチャを完全に制御する必要がある場合は、Amazon
SageMaker JumpStart
を使用することで、基盤モデルをデプロイでき、何百ものモデルにアクセスできます。

ソリューション概要

大規模言語モデル (LLM) の領域では、エージェントは LLM の助けを借りて自律的に推論してタスクを完了できるエンティティです。LLM
はテキスト生成だけにとどまらず、会話を行ったり、ドメイン固有のタスクを完了できます。この動作を導くために推論パターンを採用しています。 研究論文「Large Language Models are Zero-Shot Reasoners」によると、LLM
は知識の限界があるにもかかわらず、高レベルの推論に優れていることが分かります。

私たちは地理空間タスクを処理できるエージェントを作成するために、Amazon Bedrock の基盤モデルである Claude
2
を選択しました。全体的なコンセプトは単純明快で「地理空間データサイエンティストのように考えること」です。 このタスクには、データを読み取って変換し、関心を引くマップに視覚化する Python
コードを書く必要があります。そのために Plan-and-Solve Prompting と呼ばれるプロンプトパターンを利用しました。

Plan-and-Solve
戦略を使用すると、最初のタスクとして複数のステップで推論し大まかな計画を立てることができます。これは、エージェントが使用する大まかな計画で、読み込み、変換、視覚化のワークフローに適しています。これらのサブタスクはそれぞれ Claude 2
に送られ、それぞれ解決されます。

ニューヨークにおける Inside Airbnb
のリストプライスヒートマップを作成するサンプルタスクを考えてみます。タスクを完了するためのパスを計画するには、エージェントはデータセットを理解する必要があります。エージェントは、データセットの列とデータ型を知る必要があります。データセットからサマリーを生成して、エージェントがユーザーから指示されたタスク
(ヒートマップの生成) を計画できるようにします。

前提条件

デモをデプロイするには、いくつかの前提条件があります。アクセスキーのある AWS
アカウント、または、Amazon Bedrock と Amazon Location Service へのアクセス権限のある AWS Identity and
Access Management
(IAM) ロール
が必要になります。Amazon Location Service コンソールを使用して、マッププレースインデックス、および、Amazon Location Service
API キー
を作成する必要があります。 また、Docker がインストールされているローカル環境か仮想環境が必要です。今回のデモンストレーションでは、Docker がインストールされた Amazon Linux の Amazon Elastic Compute Cloud(Amazon EC2) インスタンスを使用します。

データを読み込み要約する

データセットに関するコンテキストをエージェントに渡すために、データを読み取り、タスクに関連する要約を提供できる Python コードを Claude 2 に生成させます。以下は、プロンプトの一部です。 全プロンプトはプロジェクトの
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.
Bash

これらのプロンプトから Claude 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)
Python

agent:// プレフィックスは、このファイルがセッションストレージフォルダー内に保存されていることを CLI に指示します。CLI が実行されると、ローカルデータを保存するための
geospatial-agent-session-storage フォルダーが作成されます。エージェントは、アップロードされた Airbnb のデータとその列名を認識します。次に、Claude
へ依頼するため、これらのインプットを使用してヒートマップを生成するためのヒントをプロンプトに渡します。

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.
Bash

Claude 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.
Bash

ソリューションを計画する

Claude 2 に大まかな計画を生成してもらいます。Python の NetworkXというグラフライブラリを使うと、問題解決の手順を計画できます。

前回のプロンプトと同様に、Claude 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.
Bash

これらのプロンプトから Claude 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")
Python

この NetworkX グラフでは、Claude 2 がプロセスを主に 3 つのセグメントに分解します。

  • データの読み込み — Airbnb のリストプライスを特定の URL から Pandas データフレームにインポートする
  • データの変換 — 緯度と経度の座標に基づいたジオメトリ列の作成
  • データの視覚化 — Airbnb のリストプライスを表示するヒートマップの生成

このアプローチにより、地理空間タスクを明確かつ簡単に実装できます。 GraphViz を使用すると、以下のワークフローを視覚化できます。

Graph

計画を実行する

Claude 2 から生成された計画を実行します。各ステップで Claude 2 に対応するコードを記述します。Claude 2 に焦点を絞るために、各タスクに大まかな条件を設けています。Claude 2
がそれぞれのフェーズで生成したコードについて詳細を説明します。

データの読み込む

Airbnb のリストプライスのデータを Pandas DataFrame にロードするには、プロンプトを作成しいくつかのパラメーターを渡します。 Operation_task の「Load Airbnb data」は、上のグラフの
load_data ノードを指しています。

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.
Bash

これらのプロンプトから Claude 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
Python

データの変換

次に、Claude 2 は、latitudelongitude を使用して DataFrame に geometry
列を追加するコードを生成します。このプロンプトでは、以下の条件を設けています。

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.
Bash

これらのプロンプトから Claude 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
Python

データの視覚化

最後に、Claude 2 は空間レンダリング用の Python ライブラリである pydeckを使用してヒートマップを生成します。このプロンプトでは、以下の条件を設けています。

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.
Bash

これらのプロンプトから Claude 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
Python

Claude 2 の応答には、各関数が指定された条件をどのように満たすかを説明する役立つメモも含まれています。たとえば、ヒートマップの視覚化では Claude 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."

生成されたコードを組み立てる

Claude 2 がそれぞれの構成要素を生成したのでまとめます。エージェントは、これらすべてのスニペットを自動的に 1 つの 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)
Python

スクリプトが実行されると、Claude 2 がヒートマップを生成するコードを含む HTML ファイルを作成します。以下の画像は、Amazon Location Service ベースマップのニューヨークに Airbnb
のリストプライスヒートマップを表示しています。

Heat Map Visualization

Amazon Bedrock で Amazon Location Service を使う

Plan-and-Solve エージェントは地理空間タスクを処理できますが、住所のジオコーディングなどのタスクには少し異なるアプローチをとる必要があります。そのためには、LLM を使って推論と実行を組み合わせる ReACT 戦略が使えます。

ReACT パターンでは、エージェントが顧客のインプットと自由に利用できるツールに基づいて推論し実行します。Claude 2
搭載エージェントにジオコーディング機能を持たせるためのツールを開発しました。このツールは、Amazon Location Service の Places API で 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.
Bash

この短いやり取りで、エージェントは住所のジオコーディングを解読し、ジオコーディングツールを起動して、緯度と経度を返します。

ヒートマップのプロット、住所のジオコーディングを行う場合でも、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/
Bash

リポジトリのクローンを作成されたら環境変数を設定します。

  1. ディレクトリを複製されたプロジェクトフォルダーに変更します。
cd amazon-location-geospatial-agent
Bash
  1. お好みのテキストエディタを使って .env ファイルを編集します。
vim .env
Bash
  1. API キー、マップ名、プレースインデックス名を追加します。
API_KEY_NAME=AgentAPIKey
MAP_NAME=AgentMap
PLACE_INDEX_NAME=AgentPlaceIndex
Bash
  1. 以下のコマンドを実行してコンテナを構築します。
docker build -t agent .
Bash
  1. 以下のコマンドを実行して Docker コンテナを実行し接続します。
docker run --rm -it -v ~/.aws:/root/.aws --entrypoint bash agent
Bash
  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
Bash
  1. 以下のコマンドを実行してセッションを作成します。 セッションを使用して独自のチャット環境を分離します。
SESSION_ID="3c18d48c-9c9b-488f-8229-e2e8016fa851" FILE_NAME="listings.csv" make create-session
Bash

これで、アプリケーションを起動する準備ができます。

  1. 以下のコマンドを実行してチャットアプリケーションを起動します。
poetry run agent --session-id 3c18d48c-9c9b-488f-8229-e2e8016fa851 --profile <profilename>
Bash

チャットプロンプトが表示されます。

  1. 以下の質問をしてみてください。
I've uploaded the file listings.csv. Draw a heatmap of Airbnb listing price.
Bash

エージェントは Airbnb_listings_price.csv を取得、CSV ファイルを /data
フォルダーにダウンロード、解析して地理空間データフレームに変換します。次に、データを変換するコードと視覚化用のコードを生成します。 最後に、/data フォルダーに書き込まれる HTML
ファイルを作成します。HTML ファイルをブラウザーで開くとヒートマップを確認できます。

別の例では、Amazon Location Service の Places API を使用して住所をジオコーディングしています。エージェントに 112 E 11th St, Austin, TX 78701
の住所をジオコーディングするように依頼すると、以下のような回答が得られます。

Example Interaction

まとめ

この記事では、Amazon Bedrock と Amazon Location Service の概要と、これらを組み合わせて地理空間データを分析および視覚化する方法について説明しました。 また、Plan-and-Solve と
ReACT、エージェントによる使用方法についても説明しました。

私たちのサンプルは入門に過ぎません。サンプルコードをダウンロードして、地理空間タスク用の独自のエージェントとツールを追加してみてください。

著者

Jeff Demuth は 2016 年に Amazon Web Services (AWS) に入社したソリューションアーキテクトです。 彼は地理空間コミュニティに焦点を当てており、地理情報システム(GIS)とテクノロジーに情熱を注いでいます。 仕事以外では、旅行、 Internet of Things (IoT)
アプリケーションの構築、最新のガジェットに触れ楽しんでいます。

Swagata Prateek は、Amazon Web Services (AWS) の Amazon Location Service で働いているシニアソフトウェアエンジニアで生成系 AI と地理空間について重点的に取り組んでいます。