「AIアシスタントと共に気候変動に備える」

「気候変動に対処する際、AIアシスタントと共に進む」

会話を通じて複雑なデータを簡素化する

OpenAIのChatGPTとDall-E-3を使用して生成されたイメージ

TL;DR

この記事では、優れたProbable Futures APIの気候変動データと新しいOpenAI Assistants APIを使用して、会話型AIエージェントを作成する方法を探ります。このAIエージェントは、特定の場所における気候の影響や基本的なデータ分析に関する質問に答えることができます。このようなタスクにはAIアシスタントが適しており、非技術的なユーザーに複雑なデータを提供する有望な手段となります。

最近、隣人と気候変動が私たちにどのように影響するか、そして極端な天候事象に備えて家をどのように準備すればよいかについて話していました。地図形式で関連情報を提供する素晴らしいウェブサイトがありますが、人々は「私の家は気候変動の影響をどのように受けるか?」や「それに対して私は何ができるか?」といった質問を単純に投げかけたい場合もあるのではないかと思いました。そして、短くまとまった要約と共に準備のためのヒントを得たいです。そのため、最近提供されているAIツールのいくつかを探ってみることにしました。

Open AIのAssistant API

大規模な言語モデルであるGPT-4を搭載したAIエージェントは、会話を通じてドキュメントやデータと対話する手段として現れています。これらのエージェントは、ユーザーが何を問い合わせているのかを解釈し、データを取得するためにAPIやデータベースを呼び出し、分析を実行するためのコードを生成して実行し、結果をユーザーに提供します。優れたフレームワークであるlangchainautogenが道を切り開いており、エージェントの簡易な実装パターンを提供しています。その中でOpenAIも最近、GPTsをノーコードでエージェントを作成する手段として導入しました。私はこの記事で探求しています。これらは非常に優れた設計ですし、より広範な利用者を想定していますが、いくつかの制約もあります。現在、オープンapi.jsonの仕様を持つAPIが必要であり、GraphQLなどの標準をサポートしていません。また、関数の登録もサポートしていません。これはノーコードの解決策としては予想されることですが、機能を制限する可能性があります。

そこで登場するのが、OpenAIの最近のリリースであるAssistants APIです。

Assistants API(ベータ版)は、プログラムでOpenAI Assistantsを設定するための方法であり、関数、ウェブブラウジング、アップロードされたドキュメントからの知識検索をサポートしています。関数はGPTsとの大きな違いであり、これにより外部データソースとの複雑なインタラクションが可能となります。関数では、GPT-4などの大規模言語モデル(LLM)は、特定のユーザー入力がコード関数の呼び出しに結びつくべきことを認識します。LLMは、関数を呼び出すために必要な正確なパラメータを持つJSON形式の応答を生成し、それをローカルで実行するために使用できます。詳細はOpenAIの公式サイトをご覧ください。

気候変動の包括的なAPI — Probable Futures

気候変動に備えるためのAIエージェントを作成するためには、良質な気候変動データの情報源と、その情報を抽出するためのAPIが必要です。こうしたリソースは、一貫性のあるアプローチを採用して一般循環モデル(GCM)の予測を組み合わせる必要があります。

幸いなことに、Probable Futuresのチームが素晴らしい仕事をしてくれました!

Probable Futuresは気候変動予測に関連するさまざまな情報を提供しています

Probable Futuresは、「実用的なツール、物語、オンラインでのリソースを、どこにいても誰でも利用できる非営利の気候リテラシーイニシアティブ」です。彼らはCORDEX-COREフレームワークに基づいた一連の地図やデータを提供しています。これは、REMO2015とREGCM4地域気候モデルからの気候モデル出力の標準化です。[ 備考: Probable Futuresと関係はありません ]

重要なことは、このデータへのアクセスにGraphQL APIが提供されており、APIキーのリクエストを行った後に利用できるということです。

ドキュメントに基づいて、次のような関数を作成しました。これらの関数はassistant_tools.pyというファイルに保存しました …

pf_api_url = "https://graphql.probablefutures.org"pf_token_audience = "https://graphql.probablefutures.com"pf_token_url = "https://probablefutures.us.auth0.com/oauth/token"def get_pf_token():    client_id = os.getenv("CLIENT_ID")    client_secret = os.getenv("CLIENT_SECRET")    response = requests.post(        pf_token_url,        json={            "client_id": client_id,            "client_secret": client_secret,            "audience": pf_token_audience,            "grant_type": "client_credentials",        },    )    access_token = response.json()["access_token"]    return access_tokendef get_pf_data(address, country, warming_scenario="1.5"):    variables = {}    location = f"""        country: "{country}"        address: "{address}"    """    query = (        """        mutation {            getDatasetStatistics(input: { """        + location        + """ \                    warmingScenario: \"""" + warming_scenario + """\"                 }) {                datasetStatisticsResponses{                    datasetId                    midValue                    name                    unit                    warmingScenario                    latitude                    longitude                    info                }            }        }    """    )    print(query)    access_token = get_pf_token()    url = pf_api_url + "/graphql"    headers = {"Authorization": "Bearer " + access_token}    response = requests.post(        url, json={"query": query, "variables": variables}, headers=headers    )    return str(response.json())

意図的にdatasetIdを除外しています。これにより、AIエージェントが幅広い情報を利用できるようにしています。

APIは、都市名や住所だけでなく、具体的な住所を受け付ける堅牢なものです。たとえば …

get_pf_data(address="ニューデリー", country="インド", warming_scenario="1.5")

この場所の気候変動情報を含むJSONレコードを返します …

{'data': {'getDatasetStatistics': {'datasetStatisticsResponses': [{'datasetId': 40601, 'midValue': '17.0', 'name': 'Change in total annual precipitation', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40616, 'midValue': '14.0', 'name': 'Change in wettest 90 days', 'unit': 'mm', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40607, 'midValue': '19.0', 'name': 'Change in dry hot days', 'unit': 'days', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40614, 'midValue': '0.0', 'name': 'Change in snowy days', 'unit': 'days', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40612, 'midValue': '2.0', 'name': 'Change in frequency of “1-in-100-year” storm', 'unit': 'x as frequent', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40101, 'midValue': '28.0', 'name': 'Average temperature', 'unit': '°C', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {}}, {'datasetId': 40901, 'midValue': '4.0', 'name': 'Climate zones', 'unit': 'class', 'warmingScenario': '1.5', 'latitude': 28.6, 'longitude': 77.2, 'info': {'climateZoneName': '乾燥な半砂漠(またはステップ)地帯'}}, {'datasetId':

OpenAIアシスタントの作成

次に、ベータAPIを使用してAIアシスタントを構築する必要があります。 ドキュメントには便利な情報がいくつかあります、また、非常に便利なOpenAI Cookbookも利用できます。ただし、新しくベータ版であるため、まだあまり情報は多くないため、試行錯誤することもあります。

まず、気候変動データを取得するためにアシスタントが使用できるツールを設定する必要があります。 ドキュメントに従って...

    get_pf_data_schema = {        "name": "get_pf_data",        "parameters": {            "type": "object",            "properties": {                "address": {                    "type": "string",                    "description": ("データを取得する場所の住所"),                },                "country": {                    "type": "string",                    "description": ("データを取得する場所の国"),                },                "warming_scenario": {                    "type": "string",                    "enum": ["1.0", "1.5", "2.0", "2.5", "3.0"],                    "description": ("データを取得するための温暖化シナリオ。デフォルトは1.5です"),                }            },            "required": ["address", "country"],        },        "description": """            これは、場所に対して予測された気候変動指標を取得するためのProbable Futures APIへのAPIコールです        """,    }

関数内の各パラメータにテキストの説明を提供していることに気づくでしょう。実験によると、エージェントがパラメータを作成する際に使用されるようですので、できるだけ明確にし、特異性を注意しておく必要があります。これに基づいて、ツールを定義します...

tools = [    {        "type": "function",        "function": get_pf_data_schema,    }    {"type": "code_interpreter"},]

コード解析ツールを残したことに注意してください。これにより、アシスタントはデータ分析に必要なコードを実行することができます。

次に、一連のユーザーインストラクション(システムプロンプト)を指定する必要があります。これらは、アシスタントのパフォーマンスをタスクに合わせて調整する上で非常に重要です。短期的な実験に基づいて、次のようなセットにたどり着きました...

instructions = """     "こんにちは、気候変動アシスタントです。あなたは人々が自宅にどのように気候変動が影響するかを理解するのを助けます"    "Probable Futures Dataを使用して場所の気候変動指標を予測します"    "返されたデータを完璧に要約します"    "ユーザーが予測された気候変動に備えるための地元のリソースやウェブサイトへのリンクも提供します"    "住所情報が不足している場合はリクエストしてください"    "指定されていない場合はデフォルトで1.5の温暖化シナリオを使用しますが、結果を表示した後ユーザーに他のシナリオを試してみるかどうか尋ねます"    "結果をカテゴリごとにグループ化します"    "場所のProbable FuturesウェブサイトへのURLを使用して常にリンクします。場所の値をLATITUDEとLONGITUDEで置き換えてください:https://probablefutures.org/maps/?selected_map=days_above_32c&map_version=latest&volume=heat&warming_scenario=1.5&map_projection=mercator#9.2/LATITUDE/LONGITUDE"    "非技術的なユーザーにとって明確で理解しやすい出力を生成します""""

気候変動に備えるためのウェブサイトなどのリソースを提供するようにアシスタントに指示するための手順を追加しました。これは「オープン」すぎるかもしれませんが、本番アシスタントではこれをより綿密にカリキュレーションしたいと思うでしょう。

注目すべき素晴らしいことの1つは、一般的なトーンについても指示することができるようになったことです。上記の場合、出力が非技術的なユーザーに明確であるように要求しています。もちろん、これにはいくつかのシステマチックなプロンプトエンジニアリングが必要ですが、今では部分的に説得力を持って「プログラム」することができる点について興味深いことです。 😊

さて、ツールと手順が揃ったので、アシスタントを作成しましょう...

import osfrom openai import AsyncOpenAIimport asynciofrom dotenv import load_dotenvimport sysload_dotenv()api_key = os.environ.get("OPENAI_API_KEY")assistant_id = os.environ.get("ASSISTANT_ID")model = os.environ.get("MODEL")client = AsyncOpenAI(api_key=api_key)name = "Climate Change Assistant"try:    my_assistant = await client.beta.assistants.retrieve(assistant_id)    print("既存のアシスタントを更新しています...")    assistant = await client.beta.assistants.update(        assistant_id,        name=name,        instructions=instructions,        tools=tools,        model=model,    )except:    print("アシスタントを作成しています...")    assistant = await client.beta.assistants.create(        name=name,        instructions=instructions,        tools=tools,        model=model,    )    print(assistant)    print("次に、DIを.envファイルに保存してください")

上記は、.envファイル内にキーとエージェントIDが定義されていることを前提としています。コードを見ると、まず.envファイル内のASSISTANT_IDを使用してエージェントが存在するかどうかをチェックし、存在する場合は更新します。存在しない場合は新しいエージェントを作成し、生成されたIDを.envファイルにコピーする必要があります。これを行わないと、私は多くのアシスタントを作成してしまいます!

エージェントが作成されると、OpenAIユーザーインターフェースで表示されるようになり、Playgroundでテストすることができます。ほとんどの開発とデバッグは、実際にコードを呼び出すための関数呼び出しに関連しているため、この分析ではプレイグラウンドはあまり役に立たないと感じましたが、デザインは素敵で他の作業にも役立つかもしれません。

この分析では、新しいGPT-4-Turboモデルを使用するために、modelを"gpt-4-1106-preview"に設定することにしました。

ユーザーインターフェースの作成

フルチャットボットを作成できるようにするために、まずこのchainlit cookbookの例から始めました。エージェントコードを専用のファイルに分離し、…を介してアクセスするように微調整しました。

import assistant_tools as at

Chainlitは非常に簡潔で、ユーザーインターフェースのセットアップも簡単です。アプリのコードはこちらで見つけることができます。

気候変動アシスタントAIエージェントの試用

すべてを組み合わせると、chainlit run app.pyでエージェントを起動します。

場所について質問してみましょう...

上で意図的にモンバサのスペルを間違えたことに注意してください。

エージェントはその後、APIを呼び出してJSONレスポンスを処理します(約20秒かかりました)。

私たちの指示に基づいて、次のように仕上げます...

しかし、正しいですか?

APIを呼び出して出力を確認しましょう...

get_pf_data(address="Mombassa", country="Kenya", warming_scenario="1.5")

これは以下をクエリします...

mutation {    getDatasetStatistics(input: {             country: "Kenya"            address: "Mombassa"            warmingScenario: "1.5"         }) {        datasetStatisticsResponses{            datasetId            midValue            name            unit            warmingScenario            latitude            longitude            info        }    }}

これにより以下が表示されます(いくつかの部分だけを表示)...

{  "data": {    "getDatasetStatistics": {      "datasetStatisticsResponses": [        {          "datasetId": 40601,          "midValue": "30.0",          "name": "Change in total annual precipitation",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40616,          "midValue": "70.0",          "name": "Change in wettest 90 days",          "unit": "mm",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40607,          "midValue": "21.0",          "name": "Change in dry hot days",          "unit": "days",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40614,          "midValue": "0.0",          "name": "Change in snowy days",          "unit": "days",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        {          "datasetId": 40612,          "midValue": "1.0",          "name": "Change in frequency of \u201c1-in-100-year\u201d storm",          "unit": "x as frequent",          "warmingScenario": "1.5",          "latitude": -4,          "longitude": 39.6,          "info": {}        },        .... など        }      ]    }  }}

スポットチェックした結果、エージェントは完璧にキャプチャし、ユーザーに正確な要約を提示しました。

指示による使いやすさの向上

AIエージェントは、情報の提示方法に関するいくつかの指示により改善できます。

そのうちの1つの指示は、常にProbable Futuresウェブサイトのマップ可視化へのリンクを生成することでした。クリックすると正しい場所に移動します...

エージェントは、クエリに基づいてProbable Futuresウェブサイト上で正しいマップ可視化にユーザーを導くためのURLを常に生成します

別の指示では、エージェントが常にユーザーに他の温暖化シナリオを試すよう促すことが求められました。デフォルトでは、エージェントは予測された1.5℃の世界的な気温上昇に対する結果を生成しますが、ユーザーは他の、いくぶん鬱陶しいシナリオを探索することができます。

解析タスク

AIエージェントにコードインタプリタースキルを与えたため、基本的なデータ解析のためにPythonコードを実行できるはずです。試してみましょう。

まず、ロンドンとニューヨークに対して気候変動がどのように影響するか尋ねました。エージェントは要約を提供しました。その後、私は尋ねました...

これにより、エージェントはコードインタプリターを使用してプロットを作成するためにPythonコードを生成して実行しました...

AIエージェントは、APIから抽出した気候変動データを使用して基本的なデータ解析タスクを実行することができます

なかなかいい結果ですね!

結論と将来の展望

Probable Futures APIとOpenAIアシスタントを使用して、気候変動に関する質問をする方法や準備の方法についてのアドバイスを受けることができる会話インターフェースを作成しました。エージェントはAPIを呼び出すだけでなく、基本的なデータ解析も行うことができました。これは、一部の非技術的なユーザーにとって魅力的な気候の認識の別の手段を提供します。

もちろん、意図/エンティティを判断し、APIを処理するためのコードを開発することもできましたが、それにはより多くの作業が必要であり、APIの変更や新しいAPIが追加される場合に再考する必要があります。また、大規模な言語モデルエージェントは、ユーザー入力の解釈や要約を非常に限定的な開発でうまく行い、コードを実行し、基本的なデータ解析を行うことができる点で別のレベルにいくものです。私たちの特定のユースケースは、範囲が限定されているため、AIエージェントに特に適しているように思われます。

ただし、いくつかの課題もあります。テクニックはやや遅いです(クエリの完了には約20-30秒かかりました)。また、この記事ではLLMトークンのコストは分析されておらず、制約があるかもしれません。

しかしそれはOpenAI Assistants APIのベータ版です。また、エージェントは何の調整も行われていないため、さらなる作業を行い、一般的なタスクの追加機能、パフォーマンス、およびコストを最適化することができるでしょう。このエキサイティングな新しいテクニックに対して。

参考文献

この記事はProbable Futures、SouthCoast Community Foundationのプロジェクト、およびWoodwell Climate Research Center, Inc.またはCoordinated Regional climate Downscaling Experiment (CORDEX)からProbable Futuresに提供されたデータや他の内容に基づいています。

この分析のコードはこちらで見つけることができます。

こちらで私の他の記事を読むことができます。

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