「場所の言語:生成AIのジオコーディング能力の評価」
Evaluation of AI's geocoding capability Language of location
LLMによるジオコーディングのパフォーマンスを、現代のジオコーディングAPIと比較して詳細に説明する応用プロジェクト
携帯電話の検索バーに場所を入力し、それが自動的に地図上に表示されるという現代の便利さは、しばしば当たり前と考えられています。しかし、このテキストと地図の間のシームレスな相互作用と変換が実際にどのように機能するのか、一度考えたことはありますか?この質問の答えは、ジオコーディングです。
ジオスペーシャルソフトウェアの世界的リーダーであるEsriは、ジオコーディングを「座標のペア、住所、または場所の名前など、場所の説明を地球の表面上の場所に変換するプロセス」と定義しています。ジオコーディングは、ナビゲーションアプリ、マッピングサービス、地理情報科学(GIScience)プラットフォームなどに見られる高度な機能を実現しています。Esri、Google、Mapboxなどのさまざまなプロバイダは、場所の説明を受け取り、それに対して緯度と経度の値、または座標を返すジオコーディングAPIを提供しており、データに関して空間的な考え方を提供しています。
生成AIと大規模言語モデル(LLM)(例:OpenAIのGPT、GoogleのBard、MetaのLLaMA)の台頭に伴い、ジオ空間アプリケーションでこれらの技術を活用する絶好の機会が生まれています。使用方法はさまざまで、GitHubのCopilotによるコード生成からMetaのSegment Anything Model(SAM)による画像セグメンテーション、さらにはジオコーディングにも可能性があります。
本記事では、非構造化の場所の説明をジオコーディングに利用する「そのまま使える」生成AIの適用性について検証します。この評価は、ミネソタ州の自動車事故データの小規模なデータセットを用いて行われます。この分析を通じて、標準的なLLMのジオコーディングタスクでの効果と、現行の従来的なアプローチとの比較において、生成AIの潜在的なジオ空間利用例の探求が行われます。
- ベイズ最適化とハイパーバンド(BOHB)によるハイパーパラメータ調整の例
- クローズドソース対オープンソース画像注釈
- 「ゲノムと気候の言語の解読:アニマ・アナンドクマールによるジェネレーティブAIの活用によるグローバルな課題への取り組み」
ジオコーディングとAIとの統合の理解モダンなジオコーダは、参照データセットとジオコーディングアルゴリズムの2つの基本的なコンポーネントで構成されています。参照データには、明示的な場所の説明だけでなく、より非構造化の場所の説明も地理的な位置に関連付けられていることがよくあります。マッチングアルゴリズムは、入力された説明と参照データセット内に含まれる説明との適切な一致を見つけるために使用されます。1つの簡単なマッチングアルゴリズムの例は、既知の2つの住所の間の位置を推定するために補間アルゴリズムを使用することです。
予測型ジオコーディングは、AIと機械学習を使用してジオコーディングプロセスを向上させるというアイデアは昔からあります。自然言語処理(NLP)やディープラーニングなどの手法が提案され、利用されており、さまざまなレベルの成功を収めています。AIとMLをジオコーディングに使用することは最近の開発ではありませんが、生成AIの登場は、数多くの他の領域においてと同様に、ジオコーディングにとって新たなフロンティアとなっています。
課題の克服と将来の機会の探求ご存知のように、LLMはインターネット、書籍、ジャーナル記事、さまざまな他の情報源から引かれた膨大なテキストデータを使用してトレーニングされます。これには、しばしば包括的なジオ空間情報が欠けています。LLM内のジオ空間トレーニングデータの欠如は、ジオ空間の課題の理解と解決における潜在能力と適用性に影響を与えます。基礎となるドメイン固有の知識がない場合、モデルが複雑な問題にうまく対応することは期待できません。
答えは、単にできないということです。
この分析では、LLMを単独のベンチマークとして評価し、従来のGIScienceの手法を使用したワークフローのコンテキスト内で評価します。その結果から、新しい技術が印象的であっても、複雑な課題に取り組む際には常に性能が向上するわけではないということが明らかになります。
事例研究:自動車事故の非構造化場所の説明
データの収集と準備LLMのジオコーディング能力をテストし、数量化するために、ウェブからスクレイピングされたデータセットからミネソタ州の自動車事故の100件の非構造化場所の説明がランダムに選択されました。100件の事故の正確な座標は、Google Mapsやミネソタ交通省のトラフィックマッピングアプリケーション(TMA)などのさまざまなマッピングアプリケーションを使用して手動で作成されました。
以下にいくつかのサンプルの場所の説明が示されています。
US Hwy 71 at MN Hwy 60, WINDOM, Cottonwood County
EB Highway 10 near Joplin St NW, ELK RIVER, Sherburne County
EB I 90 / HWY 22, FOSTER TWP, Faribault County
Highway 75 milepost 403, SAINT VINCENT TWP, Kittson County
65 Highway / King Road, BRUNSWICK TWP, Kanabec County
上記の例に示されているように、説明の構造や場所の定義にはさまざまな可能性があります。例えば、4番目の説明ではマイルマーカーの番号が含まれていますが、一般的なジオコーディングプロセスではマッチングされる可能性が非常に低いです。なぜなら、その情報は通常の参照データに含まれていないからです。このような説明の正確な座標を見つけるためには、ミネソタ州交通省の線形参照システム(LRS)を活用しました。これは、州内の道路がどのように測定されるかを標準化したもので、マイルマーカーが重要な役割を果たしています。このデータは、前述のTMAアプリケーションを介してアクセスできます。
方法論とジオコーディング戦略データの準備が完了した後、異なるジオコーディングプロセスをテストするために5つの別々のノートブックが設定されました。その設定は以下の通りです。
1. GoogleジオコーディングAPI:生の場所の説明に使用2. EsriジオコーディングAPI:生の場所の説明に使用3. GoogleジオコーディングAPI:OpenAI GPT 3.5で標準化された場所の説明に使用4. EsriジオコーディングAPI:OpenAI GPT 3.5で標準化された場所の説明に使用5. OpenAI GPT 3.5:ジオコーダーとして使用
要約すると、GoogleとEsriのジオコーディングAPIは、生の説明だけでなく、OpenAI GPT 3.5モデルに渡された短いプロンプトを使用して標準化された説明にも使用されました。この標準化プロセスのPythonコードは以下の通りです。
def standardize_location(df, description_series): df["ai_location_description"] = df[description_series].apply(_gpt_chat) return df def _gpt_chat(input_text): prompt = """次の場所の説明をジオコーディングAPIに入力できるテキストに標準化してください。返答する際には、出力テキストのみを返してください。""" response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": input_text}, ], temperature=0.7, n=1, max_tokens=150, stop=None, ) return response.choices[0].message.content.strip().split("\n")[-1]
ジオコーディングAPIを使用した4つのテストケースでは、APIリクエストを各ジオコーダーに送信し、100の説明の結果の座標を返すために以下のコードが使用されました。
# Esriジオコーダdef geocode_esri(df, description_series): df["xy"] = df[description_series].apply( _single_esri_geocode ) df["x"] = df["xy"].apply( lambda row: row.split(",")[0].strip() ) df["y"] = df["xy"].apply( lambda row: row.split(",")[1].strip() ) df["x"] = pd.to_numeric(df["x"], errors="coerce") df["y"] = pd.to_numeric(df["y"], errors="coerce") df = df[df["x"].notna()] df = df[df["y"].notna()] return df def _single_esri_geocode(input_text): base_url = "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates" params = { "f": "json", "singleLine": input_text, "maxLocations": "1", "token": os.environ["GEOCODE_TOKEN"], } response = requests.get(base_url, params=params) data = response.json() try: x = data["candidates"][0]["location"]["x"] y = data["candidates"][0]["location"]["y"] except: x = None y = None return f"{x}, {y}"
# Googleジオコーダdef geocode_google(df, description_series): df["xy"] = df[description_series].apply( _single_google_geocode ) df["x"] = df["xy"].apply( lambda row: row.split(",")[0].strip() ) df["y"] = df["xy"].apply( lambda row: row.split(",")[1].strip() ) df["x"] = pd.to_numeric(df["x"], errors="coerce") df["y"] = pd.to_numeric(df["y"], errors="coerce") df = df[df["x"].notna()] df = df[df["y"].notna()] return df def _single_google_geocode(input_text): base_url = "https://maps.googleapis.com/maps/api/geocode/json" params = { "address": input_text, "key": os.environ["GOOGLE_MAPS_KEY"], "bounds": "43.00,-97.50 49.5,-89.00", } response = requests.get(base_url, params=params) data = response.json() try: x = data["results"][0]["geometry"]["location"]["lng"] y = data["results"][0]["geometry"]["location"]["lat"] except: x = None y = None return f"{x}, {y}"
さらに、テストされた最後のプロセスは、ジオコーディングAPIのヘルプなしでGPT 3.5をジオコーダーとして使用することでした。このプロセスのコードは、上記で使用された標準化コードとほぼ同じでしたが、以下に示す異なるプロンプトが使用されました。
次の住所をジオコーディングしてください。できるだけ正確に緯度(Y)と経度(X)を返してください。応答する際は、出力テキストを次の形式で返すだけです:X、Y
パフォーマンスメトリクスと洞察各プロセスが開発された後、各プロセスが実行され、実行時間とジオコーディングの精度の両方についていくつかのパフォーマンスメトリクスが計算されました。これらのメトリクスは以下にリストされています。
| ジオコーディングプロセス | 平均 | 標準偏差 | MAE | RMSE | | ------------------- | ------ | ------ | ------ | ------ | | Google with GPT 3.5 | 0.1012 | 1.8537 | 0.3698 | 1.8565 | | Google with Raw | 0.1047 | 1.1383 | 0.2643 | 1.1431 | | Esri with GPT 3.5 | 0.0116 | 0.5748 | 0.0736 | 0.5749 | | Esri with Raw | 0.0001 | 0.0396 | 0.0174 | 0.0396 | | GPT 3.5 ジオコーディング | 2.1261 | 80.022 | 45.416 | 80.050 |
| ジオコーディングプロセス | 75% ET | 90% ET | 95% ET | 実行時間 | | ------------------- | ------ | ------ | ------ | -------- | | Google with GPT 3.5 | 0.0683 | 0.3593 | 3.3496 | 1分59.9秒 | | Google with Raw | 0.0849 | 0.4171 | 3.3496 | 0分23.2秒 | | Esri with GPT 3.5 | 0.0364 | 0.0641 | 0.1171 | 2分22.7秒 | | Esri with Raw | 0.0362 | 0.0586 | 0.1171 | 0分51.0秒 | | GPT 3.5 ジオコーディング | 195.54 | 197.86 | 199.13 | 1分11.9秒 |
これらのメトリクスは、以下で詳細に説明されています。平均は平均誤差を表し(マンハッタン距離、つまりXとYの差の合計を10進度で表す)、標準偏差は誤差の標準偏差を表します(マンハッタン距離、10進度で表す)。MAEは平均絶対誤差を表し(マンハッタン距離、10進度で表す)。RMSEは平方根平均二乗誤差を表し(マンハッタン距離、10進度で表す)。75%、90%、95%ETは、そのパーセントに対するエラー閾値を表します(ユークリッド距離、10進度で表す)、つまり、そのパーセントのレコードが結果の値からの距離内にあることを意味します。最後に、実行時間は、100のレコードでジオコーディングプロセスを実行するためにかかる合計時間を表します。
明らかに、GPT 3.5単体では性能がはるかに悪いです。ただし、いくつかの外れ値(モデルによって他の大陸にあるとラベル付けされたもの)を除外すれば、そのプロセスの結果は、視覚的にはあまり場違いには見えません。
また、LLM標準化プロセスが実際に精度を低下させたことも興味深いです。私はこのコンポーネントを導入することで、ジオコーディングプロセス全体の精度をわずかに向上させることを期待していたので、少し驚きました。ここで、プロンプト自体が問題の一部である可能性もあり、ジオスペーシャルコンテキストでの「プロンプトエンジニアリング」の役割をさらに探求する価値があります。
この分析から得られる最後の主なポイントは、GPT 3.5を使用するプロセスが実行時間が大幅に遅いことです。EsriのジオコーディングAPIも、この設定ではGoogleのAPIよりも遅いです。ただし、厳密なテストは行われていないため、これらの結果は考慮に入れる必要があります。
結論と考察OpenAIのGPT 3.5モデルの「そのままの」ジオコーディング能力は現代のジオコーダーの洗練さには及ばないかもしれませんが、テストは将来の展望を強調しています。結果は改善の余地が大きいことを示しており、大規模言語モデル(LLM)のジオスペーシャル能力が改善し、私たちが知っているジオコーディングに影響を与える可能性があることを示唆しています。
LLMは、既存のままでジオコーディングに十分な場合がある特定のユースケースがたくさんあります。しかし、この例が示すように、LLMの能力と、高い精度と細かい空間分解能を必要とするジオコーディングの要求との間には相違があります。したがって、LLMには潜在能力がありますが、この例は特定のアプリケーションにおける精度と正確性の重要性を示しています。
全体的に、生成型AIは、地理学とGISの領域全体において、ジオコーディングを含む幅広い影響と機会を持つ、刺激的なイノベーションとして現れています。驚異的なペースで進化が続いており、生成型AIと地理空間の統合の開発が日々進展しています。
参考文献:[1] Wikipediaの投稿者、住所のジオコーディング(2023年)、Wikipedia[2] A. Hassan、ジオスパシャルAIの未来(2023年)、スペーシャルデータサイエンス[3] L. Mearian、LLMとは何か、そしてそれらは生成型AIでどのように使用されるのか(2023年)、ComputerWorld
謝辞:この記事の編集とレビューにおいて、Dr. Bryan Runck氏の貴重なサポート、ガイダンス、専門知識に対して感謝の意を表します。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- TensorRT-LLMとは、NVIDIA Tensor Core GPU上の最新のLLMにおいて推論パフォーマンスを高速化し最適化するためのオープンソースライブラリです
- Stability AIが初の日本語ビジョン言語モデルをリリース
- 「低コスト四足ロボットはパルクールをマスターできるのか? アジャイルなロボット運動のための革命的な学習システムを公開する」
- 「ジュラシックパークへの待ち時間は終わりましたか?このAIモデルは、イメージからイメージへの変換を使用して、古代の化石を生き返らせます」
- 「密度プロンプトのチェーンを通じたGPT-4要約の強化」
- 言語の壁を乗り越える シームレスなサポートのためにAmazon Translateでアプリケーションログを翻訳する
- 「NVIDIA、ワシントンのAIの安全性確保の取り組みを支援」