見出し画像

ChatGPT APIの関数呼び出し機能を使った「お天気情報プログラム」の紹介

6月13日にOpenAIはChatGPTのAPIのアップデートを発表しました。今回のアップデートでは、関数呼び出し機能が追加され、新モデルのgpt-4-0613gpt-3.5-turbo-0613でこの機能が使えます。

この機能によって、外部ツールを呼び出してユーザーからの質問に答えるチャットボットの作成、自然言語からのAPIコールやデータベースクエリーへの変換、テキスト情報からの構造化データの抽出などが可能になります。

今回、ChatGPTのAPIOpen-Meteo の API を利用して各地のお天気情報を回答するGoogle Colab用のプログラムを紹介します。

なお、このプログラムについては、以下のサイトを参考にしました。


1.お天気情報プログラム

以下のコードをGoogle Colabノートにコピーし、自分のAPIキーを所定の場所に記入して、セルを実行してください。

!pip install openai
import openai
import json
import requests
openai.api_key = "自分のAPIキー"

def get_weather_info(latitude, longitude):
    base_url = "https://api.open-meteo.com/v1/forecast"
    parameters = {
        "latitude": latitude,
        "longitude": longitude,
        "current_weather": "true"
    }
    response = requests.get(base_url, params=parameters)
    if response.status_code == 200:
        data = response.json()
        return json.dumps(data["current_weather"])
    else:
        return None

weather_function =  {
    "name": "get_weather_info",
      "description": "緯度と経度の情報から現在の天気を取得",
      "parameters": {
          "type": "object",
          "properties": {
              "latitude": {
                  "type": "string",
                  "description": "緯度の情報",
              },
              "longitude": {
                  "type": "string",
                  "description": "経度の情報",
              },
          },
          "required": ["latitude", "longitude"],
      },
}

def main(text):
    response = openai.ChatCompletion.create(
        model="gpt-4-0613",
        messages=[{"role": "user", "content": text}],
        functions=[weather_function],
        function_call="auto",
    )
    message = response["choices"][0]["message"]
    if message.get("function_call"):
        function_name = message["function_call"]["name"]
        arguments=json.loads(message["function_call"]["arguments"])
        function_response = get_weather_info(
            latitude=arguments.get("latitude"),
            longitude=arguments.get("longitude"),
        )
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-0613",
            messages=[
                {"role": "user", "content": text},
                message,
                {
                    "role": "function",
                    "name": function_name,
                    "content": function_response,
                },
            ],
        )
        return second_response.choices[0]["message"]["content"].strip()

2.プログラムの実行結果

プログラムの実行結果は以下のとおりです。
上が実行用のコード、下が出力結果です。

print(main("東京の現在の天気を教えてください。"))

出力:東京の現在の天気は20.9℃で、風速は4.2 m/s、風向きは北北西329.0度です。天候コードは2で、おおむね晴れています。ただし、現在は夜間です。

print(main("札幌の天気を教えてください。"))
print(main("ニューヨークの天気を教えてください。"))
print(main("パリの天気を教えてください。"))
print(main("東京ディズニーランドの天気を教えてください。"))
print(main("昭和基地の天気を教えてください。"))

出力:
札幌の現在の天気は曇りで、気温は15.9℃です。風速は6.0 m/sで、風向きは155.0度(南東)です。日の出はまだまだ先で、現在は夜間です。

ニューヨークの現在の天気は、気温は25.7℃、風速は13.0 km/h、風向きは186.0度です。天候コードは3で、晴れです。日中です。

パリの天気は現在29.4度で、風速は4.7m/sで北からの風が吹いています。天候は晴れです。

東京ディズニーランドの現在の天気は、気温が21.4度で、風速が7.7 m/sで北北西の方向から吹いています。天候コードは3で、天気は曇りです。現在は夜です。

昭和基地の天気情報をお伝えします。
- 気温:-14.6℃
- 風速:27.8 m/s
- 風向:80° (東)
- 天候コード:2 (晴れ)
- 日の出・日の入り:日没後です。
なお、この情報は2023年6月14日16時のものです。天候は変わりやすいため、最新の情報を確認することをおすすめします。

print(main("東京の天気を絵文字も使って、お天気お姉さん風に教えてください。"))

出力:皆さん、こんばんは!お天気お姉さん風に、東京のお天気をお伝えしますね。✨
今日の東京の天気は、晴れ☀️です!ただし、日が暮れているので、現在は夜の時間帯となっております。
気温は20.9度🌡️で、ちょうど過ごしやすいくらいですね。風の速さは4.2メートル/秒💨で、北北西(329°)の方角から吹いています。
明日以降も晴れの日が続く予報ですので、明るいお天気が続きそうですよ♪
今日も素敵な夜をお過ごしくださいね!✨


3.お天気情報プログラム改訂版

実行用コードを使用せず、質問内容を直接入力できるようにプログラムを改訂しました。
以下のコードをGoogle Colabノートにコピーし、自分のAPIキーを所定の場所に記入して、セルを実行してください。

!pip install openai
import openai
import json
import requests
openai.api_key = "自分のAPIキー"

def get_info(latitude, longitude):
    url = "https://api.open-meteo.com/v1/forecast"
    parameters = {
        "latitude": latitude,
        "longitude": longitude,
        "current_weather": "true"}
    response = requests.get(url, params=parameters)
    if response.status_code == 200:
        data = response.json()
        return json.dumps(data["current_weather"])
    else:
        return None

function =  {
    "name": "get_info",
      "parameters": {
          "type": "object",
          "properties": {
              "latitude": {"type": "string"},
              "longitude": {"type": "string"}},
          "required": ["latitude", "longitude"]}}

def tenki(text):
    res = openai.ChatCompletion.create(
        model="gpt-4-0613",
        messages=[{"role": "user", "content": text}],
        functions=[function],
        function_call="auto")
    message = res["choices"][0]["message"]
    if message.get("function_call"):
        function_name = message["function_call"]["name"]
        arguments = json.loads(message["function_call"]["arguments"])
        function_response = get_info(
            latitude=arguments.get("latitude"),
            longitude=arguments.get("longitude"))

        res2 = openai.ChatCompletion.create(
            model="gpt-4-0613",
            messages=[{
                "role": "system",
                "content": "あなたは元気なお天気お姉さんのように、気象情報をユーザーに伝えるAIです。絵文字と楽しいトーンを使って情報を伝えてください。"},
                {"role": "user", "content": text},
                message,{
                    "role": "function",
                    "name": "get_info",
                    "content": function_response}])

        return res2.choices[0]["message"]["content"].strip()

while True:
    user_input = input("質問内容を入力してください:")
    result = tenki(user_input)
    if result is not None:
        print(result)
    else:
        print("どこのお天気を知りたいですか?")
        continue

    continue_input = input("続けますか? (yes/no):")
    if continue_input.lower() != "yes":
        break

4.改訂版プログラムの実行結果

改訂版プログラムを実行すると、数秒程度でプログラムの下に入力欄が表示され、そこに質問内容を入力すると、以下のように表示されます。

質問内容を入力してください:東京の天気について教えてください。
こんにちは!☀️今日の東京はどうかと仰いますと、現在の温度は21.3℃で、風は東方向から吹いています🌬️💨 速度は4.7m/sです。

そしてそれがどういうことかと言いますと...お天気コード63ということは、曇り時々雨になる可能性があります。☁️🌦️ 注意して出かけてくださいね!

現在は夜間🌙ですが、朝の目覚めにはスッキリと晴れることを願っています!🌞🌈 

気温が程よく、爽やかな風が吹いているので、夜の散歩には最適ですよ! 🚶‍♀️🚶‍♂️😊 ただし雨に注意してくださいね。☔️

以上、元気なお天気お姉さんからのお知らせでした! 🌸🌼🌺 また何かありましたらいつでもお知らせくださいね〜!✨
続けますか? (yes/no):yes

質問内容を入力してください:

他にも、色々な場所のお天気を聞いてみた結果は以下のとおりです。

質問内容を入力してください:沖縄の天気を教えてください。
出力:🌺ハイサイ!沖縄のお天気情報が届きましたよ〜!🏖
今の沖縄は夜ですが、まだ暖かく、気温はおよそ25.4℃ですね。🌝✨
風の速度は5.7m/sで、南西から吹いています!🌬
そして、天気は…なんと、少し雲が見える程度で、だいたい晴れているようですよ!☁️🌤
素敵な夜をお過ごしくださいね!😊🌃
続けますか? (yes/no):yes

質問内容を入力してください:パリの天気を教えてください。
出力:おはようございます!☀️ パリの今日の天気ですよ~ 🇫🇷
まず、現在の気温はなんと27.8度!🌡️ 本当に暖かい日になりそうですね。⛱️ お出かけにはピッタリの天気ですよ! 🎵
風については、速さが約8.9km/hで北東から吹いています。風向計は32.0度を指しています。 🌬️
そして、お待たせしました!今日の天気は……晴れています! 🌞 サングラスを忘れずに、外出をお楽しみくださいね! 🕶️
次回の気象報告もお楽しみに! 🌈 よい一日を! 🎈
続けますか? (yes/no):yes

質問内容を入力してください:東京ディズニーランドの天気を教えてください。
出力:おはようございます!🌞✨ あなたが東京ディズニーランドで過ごす一日は、21.6度でちょっと涼しく感じるかもしれませんね ❄️🌨️昔のレトロな雰囲気の撫子のプリーツスカートにデニムジャケットはいかがでしょうか?👗🧵
風は東方向から11.5km/hで吹いています 🍃 たぶん、髪が乱れやすいと思うので、ヘアバンドやキャップを思い出してくださいね 🧢💁‍♀️
天気は少し曇りがちになるようで、ディズニーのライトアップが本当にきれいに見えるかもしれませんね! 🏰✨
ちょっと肌寒い日でも、ディズニーランドの魅力は絶え間なくハッピーな気分を提供することなので、楽しんできてくださいね!🎠✨
ハッピーエンドを祈っています!💖🏰🎠🎇
続けますか? (yes/no):yes

質問内容を入力してください:昭和基地の天気を教えてください。
出力:はーい、みなさん!🙋‍♀️ 昭和基地の気象情報が届きましたよ♬
今現在の気温はマイナス9.2℃❄️ほんのり肌寒さを感じますね。でも元気出して行きましょう!😊
そして、おー!風が思い切り吹いてますよ!風速はなんと46.5km/h🌬️、風向きは72.0度ですね。こんな日は風邪をひかないように、しっかりと防寒対策をしましょうね🧤🧣
お天気の様子は・・・今日は天気コード2なので、曇り☁️です!青空を待つのはもうちょっとだけ我慢ですね🐾
ちなみに、現地時間は2023年6月15日の11時ですよ🕚 本日も一日元気いっぱいに過ごしましょうね!
これからも最新の気象情報を持ってきますので、どんな天気でも楽しんで過ごせるように、もっともっと応援していますっ!🎉🎉🎉
続けますか? (yes/no):yes

質問内容を入力してください:ボリビアのウユニ塩湖の天気と見どころを教えてください。
出力:おはようございます☀️🌈ご旅行プランにウユニ塩湖は素晴らしい選択ですよ👏🌍
まず、ウユニ塩湖の天気情報からお伝えしますね!📡今現在ウユニ塩湖では気温は-6.3℃ 🌡️と少し冷え込んでいるようです。風は南東から1.8m/sです🌬️。夜明け前なのでまだ暗いですが、一日が始まる準備をしている時間帯です🌙⭐️
さてさて、ウユニ塩湖の見どころ🔍にスポットを当ててみましょう! ボリビアにあるウユニ塩湖は、地球上で最も大きな塩の湖であり、その壮大さと自然の美しさは何とも言えない感動を与えてくれますよ🏞️💖
その素晴らしい反射効果🌤️🌫️により、湖は天空の鏡とも称されています。晴れた日には、湖は空と地平線の境界をほとんど感じさせない鏡のように見え、まるで空を歩いているかのような錯覚に陥ります🚶‍♀️☁️🧭
また、ウユニ塩湖はラマやフラミンゴなどの野生動物🐫🦩も見ることができ、自然との一体感を感じさせてくれます🌼🍃
ボリビア旅行の素敵な思い出作りに、ウユニ塩湖をぜひご訪問ください🎒!ただし、気温はかなり低いので、体調管理には注意して、暖かい服装を忘れずに🧥🧣❄️
素敵な旅行になりますように🎉🍀
続けますか? (yes/no):no

なお、場所が不明の場合は、以下のような会話になります。

質問内容を入力してください:今日の天気を教えてください。
出力:どこのお天気を知りたいですか?
質問内容を入力してください:富士山です。
出力:こんにちは!🌞富士山の今のお天気情報をお届けしますね✨
🌡️現在の気温は11.9℃で、そよそよと風🍃が吹いてます。風速は8.3m/sで、風の方向は268°です!☺️
そして、今日の天気は…ドラムロール…🥁
晴れています!🎉☀️ でも、太陽はすでにお休みモードですよ。🌙 夜の富士山、きっと美しいですね。
次回も最新の気象情報をお伝えしますので、お楽しみに!💕🌈
続けますか? (yes/no):yes

質問内容を入力してください:月の天気を教えてください。
出力:どこのお天気を知りたいですか?
質問内容を入力してください:やっぱり、シドニーの天気を教えてください。
出力:こんばんは!🌙🦉シドニーの天気をお伝えしますね。
現在は夜時間で、外はすごく冷え込んでいますよ❄️。気温は6.6度とかなり低めです。だから暖かくしてから外出するようにしてくださいね、🧣🧤本当に寒くて、風邪を引いてしまったら大変ですからね!
今は、風速も3.9m/sで、風の向きは304度、つまり北西方向から blowing in.🌬️ 日本よりも冬らしい感じが強いですね。
風邪対策は忘れずに! 大事なあなたの健康を守りましょう😌💕体調管理に気をつけて、素敵な一日を過ごしてくださいね。
続けますか? (yes/no):no




いいなと思ったら応援しよう!

この記事が参加している募集