「Amazon Bedrock と Amazon Location Service を使用したジオスペーシャル生成AI」

「Amazon BedrockとAmazon Location Serviceを活用したジオスペーシャル生成AI」

今日、ジオスペーシャルワークフローは通常、データの読み込み、変換、および地図、テキスト、またはチャートのような視覚的な洞察を生成するという手順で構成されています。ジェネレーティブAIは、これらのタスクを自律的なエージェントを介して自動化することができます。この記事では、エージェントを活用してジオスペーシャルタスクを完了させるために、Amazon Bedrockからのファンデーションモデルの使用方法について説明します。これらのエージェントは、Amazon Location Serviceを介したジオコーディングなどの位置情報サービスを使用して、さまざまなタスクを実行し、質問に答えることができます。また、Amazon Bedrockの機能とAmazon Locationの機能を結びつけるために、エージェントを使用するサンプルコードも共有します。さらに、それを構築する際に考慮された設計についても説明します。

Amazon Bedrockは、テキスト、画像、埋め込み用のファンデーションモデルに簡単にアクセスできる使いやすい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に送信されます。

私たちは、ニューヨークのAirbnbリスティングの価格ヒートマップを作成する例のタスクを考案しました。タスクを完了するためのパスを計画するために、エージェントはデータセットを理解する必要があります。エージェントはデータセット内の列とそれらの列に含まれるデータのタイプを知る必要があります。私たちはデータセットからサマリーを生成し、エージェントがユーザーからのタスク(この場合はヒートマップの生成)に対応できるようにしました。

前提条件

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

データの読み取りと要約

データセットに関するエージェントの文脈を提供するために、私たちはClaude 2にPythonコードを書かせてデータを読み取り、タスクに関連する要約を提供するように求めました。以下はその一部のプロンプトです。フルリストはプロジェクトのprompts.pyファイルで利用できます。

あなたの役割:任意のジオスペーシャルデータセットのデータスキーマを分析するジオスペーシャルデータアナライザーです。あなたのタスク:ファイルURLのセットが提供されます。以下の要件を満たすPython関数を生成する必要があります。    geopandasを使用して各ファイルを読み取ります。各ファイルはCSV、シェイプファイル、またはGeoJSONである可能性があります。    ダウンロード可能なURLを取得するために、組み込み関数resolved_file_url= get_data_file_url(file_url, session_id)を使用します。

これらのプロンプトから、Claude 2は以下のPythonコードを生成しました:

import geopandas as gpdimport pandas as pdimport 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('サポートされていないファイル形式です')         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データとその列名を認識します。次に、これらの列を使用してヒートマップを生成するためのヒントをClaudeに尋ねてみましょう。以下のプロンプトを渡します。

あなたの役割:任意のジオスペーシャルデータセットのデータスキーマを分析するジオスペーシャルデータアナライザーです。あなたのタスク:いくつかの行データが含まれたテーブルが提供されます。テーブル内のデータを以下の要件に従って記述する要約を生成する必要があります。    最初の文は、ユーザーアクションの観点からテーブル内のデータを要約します。    テーブルにジオメトリカラムが存在しない場合は、ジオパンダスでジオメトリカラムを生成するために使用できる列名をノートしてください。

Claude 2はヒントを返します

要約:テーブルには、リスティングID、名前、ホストID、ホスト名、地域の詳細(近所、緯度、経度)など、プロットのためのジオメトリカラムが生成できる列名が含まれています。価格列には、リスティング価格が含まれており、リスティング価格のヒートマップを生成するために使用できます。

解決策の計画

今度は、Claude 2にハイレベルな計画を作成するように指示できます。私たちは、Python用のグラフライブラリであるNetworkXを使用して、問題を解決するための手順をマップアウトすることができます。

前回のプロンプトと同様に、Claude 2にガイドするためにいくつかの要件を渡します:

あなたの役割:ジオスペーシャルデータサイエンティストおよびエキスパートPython開発者です。あなたのタスク:一連の連続するステップ、次の要件を満たす返信を行う必要があります。    単一のNetworkXグラフを作成します。    切断されたコンポーネントは許可されません。    最初の操作はデータのロードです。    空間データにはgeopandasを使用します。

これらのプロンプトから、Claude 2は以下のPythonコードを生成しました:

import networkx as nxG = nx.DiGraph()# Load the dataG.add_node("airbnb_data_url", node_type="data", data_path="agent://airbnb_listings_price.csv",            description="Airbnbのリスト価格データのURL")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="Airbnbのリスト価格を含むPandas DataFrame")G.add_edge("load_data", "airbnb_df")# Transform the dataG.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")# Visualize the dataG.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グラフでは、Claude 2はプロセスを3つのメインセグメントに分解しています:

  • データの読み込み – 指定されたURLからAirbnbのリスティング価格をPandas DataFrameにインポートする
  • データの変換 – 緯度と経度の座標に基づいたジオメトリカラムの作成
  • データの視覚化 – Airbnbリスティングの価格を表示するヒートマップの生成

このアプローチにより、ジオスペーシャルタスクの実装が明確かつ簡単になります。次のワークフローを可視化するためにGraphVizを使用できます。

グラフ

計画の実施

Claude 2が計画を提供したので、それを実現する時が来ました。各ステップでは、Claude 2に対応するコードを書くように促します。Claude 2の焦点を絞るために、各タスクの高レベルの要件を提供します。各個別フェーズごとにClaude 2が生成したコードについて見てみましょう。

データの読み込み

Airbnbのリスティング価格データをPandas DataFrameに読み込むために、プロンプトを作成し、いくつかのパラメータを渡します。Operation_taskの「Airbnbデータの読み込み」は、以前に作成したグラフの「データの読み込み」ノードを参照しています。

あなたの役割: ジオスペーシャルデータサイエンティストおよびPython開発の専門家。Operation_task: Load Airbnb data を行うPythonの関数を生成する必要があります。あなたの返信は以下の要件を満たしている必要があります:    関数の定義は次のとおりです:     load_data(airbnb_data_url='agent://airbnb_listings_price.csv').    空間結合を行う場合には、少なくとも1つのジオメトリカラムを保持してください。    ポイント機能にはshapelyライブラリをインポートする必要があります。

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

データの変換

Claude 2は次に、latitudelongitudeを使用してDataFrameにgeometry列を追加するコードを生成します。このプロンプトでは、次の要件を渡します:

あなたの役割: ジオスペーシャルデータサイエンティストおよびPython開発の専門家。Operation_task: Add geometry column from latitude/longitude を行うPythonの関数を生成する必要があります。あなたの返信は以下の要件を満たしている必要があります:    関数の定義は次のとおりです: add_geometry(filtered_df).    関数の最後の行は次のとおりです: return airbnb_gdf。

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

データの視覚化

Claude 2は最後に、スペースレンダリングのためのPythonライブラリであるpydeckを使用してヒートマップの可視化を作成します。このプロンプトでは、次の要件を渡します:

あなたの役割: ジオスペーシャルデータサイエンティストおよびPython開発の専門家。Operation_task: Generate heatmap from price を行うPythonの関数を生成する必要があります。あなたの返信は以下の要件を満たしている必要があります:    関数の定義は次のとおりです: generate_heatmap(airbnb_gdf).    関数の最後の行は次のとおりです: return airbnb_heatmap。

これらのプロンプトから、Claude 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は以下のように述べています:

"この関数は、pydeckを使用してAirbnbのリスティング価格のヒートマップを作成し、生成されたHTMLをローカルに保存します。プロンプトで指定された要件を満たしています。"

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

クロード2が個々のビルディングブロックを作成したので、それらをまとめる時がきました。エージェントはこれらのスニペットを自動的に1つの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 Locationのベースマップ上にニューヨークを表示しています。

ヒートマップの可視化

Amazon LocationとAmazon Bedrockを使用する

Plan-and-Solveエージェントでもこのジオスペーシャルタスクを処理することができますが、住所のジオコーディングなどのタスクではやや異なるアプローチが必要です。それには、ReActと呼ばれる戦略を使用できます。ここでは、LLMとの組み合わせにより、推論と行動を組み合わせて処理を行う方法を使用します。

ReActパターンでは、エージェントは顧客の入力と手元のツールに基づいて推論と行動を行います。このClaude 2パワードエージェントにジオコーディングの機能を追加するために、ジオコーディングツールを開発しました。このツールはAmazon Location Places API、具体的にはSearchPlaceIndexForTextメソッドを使用してアドレスを地理座標に変換します。

エージェント: こんにちは!私はエージェントスミスです、会話型のジオスペーシャルアシスタントです。今日はどのようにお手伝いできますか?あなた: >? エージェント、112 E 11th St、オースティン、TX 78701の座標を教えてくれますか?エージェント: 112 E 11th St、オースティン、TX 78701の座標は経度-97.740590981087、緯度30.274118017533です。

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

ヒートマップのプロットや住所のジオコーディングなど、Claude 2とReActやPlan and Solveなどのエージェントは、ジオスペーシャルワークフローを簡素化することができます。

デモを展開する

開始するには、以下の手順を完了してください:

  1. 以下のリポジトリをローカルマシンまたはEC2インスタンスにクローンします。必要に応じてaws configure --profile <プロファイル名>を実行し、デフォルトのリージョンを設定する必要があります。このアプリケーションは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 <プロファイル名>

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

  1. 次の質問をすることで始めることができます:
ファイルlistings.csvをアップロードしました。Airbnbのリスティング価格のヒートマップを描画してください。

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

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

Example Interaction

まとめ

この記事では、Amazon BedrockとAmazon Locationの概要と、それらを組み合わせてジオスペーシャルデータを分析・可視化する方法について説明しました。また、Plan-and-SolveとReActについても取り上げ、エージェントでどのように使用したかを説明しました。

この例はあくまで一部です。サンプルコードをダウンロードして独自のエージェントやツールを追加して、ジオスペーシャルタスクを実行してみてください。

</

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

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

「生成AIをめぐる旅」

私の豊富な経験に深く踏み込んで、全力でGenerative AIを受け入れ、あなたが利益を得るために活用できる貴重な洞察と知識を得...

AI研究

「医療分野における生成型AI」

はじめに 生成型人工知能は、ここ数年で急速に注目を集めています。医療と生成型人工知能の間に強い関係性が生まれていること...

機械学習

OpenAIがBaby Llamaを発表 - 低電力デバイス向けのLLM!

人工知能の世界からの最新ニュース! OpenAIの有名な深層学習の専門家、Andrej Karpathy氏が、リソース制約のあるデバイス上...

データサイエンス

ファインチューニングLLM パラメータ効率の改善 (PEFT) — LoRA および QLoRA — パート1

このブログでは、パラメータ効率的微調整(PEFT)のアイデアを理解し、PEFTの2つの最も重要な手法であるLoRAとQLoRAを探求します

機械学習

このAI論文では、「PolyID:高性能バイオベースポリマーの発見における機械学習の先駆者」として、ポリ-ンにおける機械学習を紹介しています

人工知能は生活のあらゆる側面で使用されています。AIは生活のあらゆる方面で使用され、化学やポリマーなどさまざまな分野で...