見出し画像

ChatGPTプロンプトエンジニアリングとUI/UXデザイン

ChatGPTのような大規模言語モデル(LLM)は、今後あらゆる場面で活用されていくことは間違いありません。そして、このパラダイムシフトは、コーディングだけでなくUIやUXのデザインにも大きく影響することになると思います。
今のところ、OpenAIが提供している「素のChatGPT」は、言ってみれば「膨大な量の学習をした人が何もググったり調べたりせずに記憶だけで応えてくれている状態」ですが、Bing AIやChatGPT Pluginのように、必要に応じて検索や外部サービスを使いながら応えてくれるような対話型AIが今後たくさん登場することになるでしょう。

今回は、ChatGPTを既存のサービスと連携させる方法をみていきますが、プロンプトエンジニアリングは、指示文や質問文を工夫することで適切な回答を引き出すだけではなく、既存のプログラミング言語によるコーディングと適材適所で組み合わせることでそのポテンシャルを十分に引き出せるものだと思います。
なお、PythonやJSONなどの基礎的な説明はしてないので、エンジニア向けの内容ではありますが、デザイナーやビジネスパーソンにも、今何が起きているのか、これから何が起きるのか、今後、さまざまなサービスのUI/UXを考える上でも、これまでの常識にとらわれずに頭を切り替える必要があることが少しでも伝わればと思います。

天気予報AIをつくってみる

前述したように、「素のChatGPT」は「膨大な量の学習をした人が何もググったり調べたりせずに記憶だけで応えてくれている状態」なので、「明日の東京の天気は?」といった最新の事実や情報を調べるのには向いていません。そこで、今回は外部の天気予報サービスと連携して、「明日の東京の天気は?」に応えてくれるAIをつくってみます。ちなみに「今日」は2023/4/1です。(この記事の内容はエイプリルフールではありません。念のため。)

ChatGPT APIを利用する

まず、外部サービスと連携するには、OpenAIが提供しているChatGPTのUIではなく、API経由でChatGPTを利用する必要があります。今回はGoogle ColabなどでChatGPT APIを利用することを前提にPythonのコードを紹介します。(Google Colabの使い方やOpenAIのAPIキーの取得方法などは省略します。)
API経由でChatGPTを利用するおおまかなイメージは以下のような流れです。

pip install openai
import openai
openai.api_key = 'your_openai_api_key'

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "Hello!"},
  ]
)

openaiライブラリをインストールし、APIキーを設定して、model(LLMモデルのタイプ)、roll(誰の発話か)、content(発話の内容)などをChatGPTに渡すと、「ユーザー」が「Hello!」と発話したと解釈し、次のようなresponseが返ってきます。

<OpenAIObject chat.completion id=chatcmpl-70JcsXeofVzZUXWvNkTBoQSne5mrm at 0x7f767d572f40> JSON: {
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Hello! How can I assist you today?",
        "role": "assistant"
      }
    }
  ],
  "created": 1680309798,
  "id": "chatcmpl-70JcsXeofVzZUXWvNkTBoQSne5mrm",
  "model": "gpt-3.5-turbo-0301",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 9,
    "prompt_tokens": 9,
    "total_tokens": 18
  }
}

ここから、response.choices[0].message.content で回答「Hello! How can I assist you today?」を取り出すことができますね。(ちなみに実行する度に表現は揺らぎます。)


天気予報の情報を取得して回答する

さて、ここからは具体的なコードもChatGPTと一緒に考えていくことにします。(コードの生成にはChatGPT4を使っています。)

ユーザーから「明日の東京の天気は?」と聞かれて、WeatherAPIからJSONを取得して自然言語で返答するPythonコードは?

以下が生成されたコードです。

import openai
import requests

# WeatherAPIとChatGPTのAPIキーを設定
WEATHER_API_KEY = "your_weather_api_key"
OPENAI_API_KEY = "your_openai_api_key"

# OpenAIライブラリの設定
openai.api_key = OPENAI_API_KEY

# WeatherAPIから天気情報を取得
def get_weather(city):
    url = f"<http://api.weatherapi.com/v1/forecast.json?key={WEATHER_API_KEY}&q={city}&days=1>"
    response = requests.get(url)
    data = response.json()
    return data

# 天気情報をChatGPTに渡して自然言語での説明を取得
def get_weather_description(weather_data):
    city = weather_data["location"]["name"]
    date = weather_data["forecast"]["forecastday"][0]["date"]
    condition = weather_data["forecast"]["forecastday"][0]["day"]["condition"]["text"]
    max_temp = weather_data["forecast"]["forecastday"][0]["day"]["maxtemp_c"]
    min_temp = weather_data["forecast"]["forecastday"][0]["day"]["mintemp_c"]
    chance_of_rain = weather_data["forecast"]["forecastday"][0]["day"]["daily_chance_of_rain"]

    prompt = f"明日の{city}の天気は{condition}です。最高気温は{max_temp}度で、最低気温は{min_temp}度です。降水確率は{chance_of_rain}%です。この天気に適したアクティビティは何でしょうか?"

    response = openai.Completion.create(engine="text-davinci-002", prompt=prompt, max_tokens=50, n=1, stop=None, temperature=0.5)

    return response.choices[0].text.strip()

# ユーザーからの質問に基づいて天気情報を取得し、自然言語で返答
def main():
    city = "東京"
    weather_data = get_weather(city)
    description = get_weather_description(weather_data)
    print(description)

if __name__ == "__main__":
    main()

よく見ると「明日の東京の天気は?」という、文章を解析するところはすっ飛ばされていて、日付は「明日」(days=1)に固定され、cityという変数に都市名を入力するようになっています。
また、なぜかプロンプトの内容も、取得した天気に適したアクティビティを尋ねる内容になっています。そんなことはお願いした覚えがないのですが(苦笑)とりあえず実行してみます。

KeyError: 'location'

エラーが表示されました。locationが取得できていないようです。WeatherAPIは海外のサービスなので英語にしか対応していないのかもしれません。

city = "tokyo"

としてみます。すると今度はエラーがなくなり、

I would recommend doing an indoor activity like going to a museum or visiting a temple or shrine.

と出力されます。おそらくですが雨という予報を取得して、インドアアクティビティを薦めてくれているようです。これはこれで面白いですが、知りたいのはシンプルに天気です。
しかも、日本語で聞いたのに英語で答えてしまっています。言語モデルが”text-davinci-002”になっているので、より新しい”text-davinci-003”にしてみます。

明日のTokyoの天気はPatchy rain possibleです。最高気温は22.6度で、最低気温は13.

今度は日本語になりました!でもTokyoとPatchy rain possibleは訳してくれていません。それから、文章が途中で切れています。
トークン(LLMが内部処理のために入力データを分割する単位)の上限が50と少ないのでmax_tokensを500に増やしてみます。

明日のTokyoの天気に適したアクティビティとしては、室内での遊びがおすすめです。室内でのボードゲームや映画鑑賞、書籍や写真の鑑賞など、室内で気持ちよく楽しめるアクティビティがいくつかあります。また、雨が降っていない時間帯には、近くの公園や庭園などで散歩を楽しむこともおすすめです。

途切れなくなりました。今度はなぜか天気や気温などを言ってくれなくなりましたが、Patchy rain possibleなので、雨が降っていなければ散歩もいいよと薦めてくれているようです。

天気予報のような外部サービスの情報をもとに自然言語を生成して回答するイメージはある程度掴めたでしょうか。

自然言語から必要な情報を取り出す

しかし、これでは本来やりたかったこととはちょっと違います。「明日の東京の天気は?」といった自然言語の質問に答えて欲しいのです。
再びChatGPTに聞いてみます。

ChatGPT APIでユーザーの入力を解析して都市名や日付を取得するpythonコードは?

import openai
import requests
from datetime import datetime, timedelta

# OpenAIのAPIキーを設定
OPENAI_API_KEY = "your_openai_api_key"

# OpenAIライブラリの設定
openai.api_key = OPENAI_API_KEY

def extract_city_and_date(user_input):
    prompt = f"ユーザーが以下のように尋ねました: '{user_input}'。この質問から都市名と日付を抽出してください。都市: {{都市名}}, 日付: {{日付}}"

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=50,
        n=1,
        stop=None,
        temperature=0.5,
    )

    result = response.choices[0].text.strip()
    city, date_str = result.split(", ")
    city = city.split(": ")[1]
    date_str = date_str.split(": ")[1]

    # "明日"という単語が含まれている場合、明日の日付を計算します
    if "明日" in date_str:
        date = datetime.now() + timedelta(days=1)
        date_str = date.strftime("%Y-%m-%d")

    return city, date_str

user_input = "明日の東京の天気は?"
city, date = extract_city_and_date(user_input)
print(f"都市: {city}, 日付: {date}")

こんなコードが生成されました。実行してみます。

都市: 東京, 日付: 2023-04-02

「明日の東京の天気は?」という文章から、都市と日付が指定した形式で出力されました!
これで、質問文を変えても対応することができます。ここが画期的なところですね。

user_input = "東京の明日の天気は?"

と順番を入れ替えても大丈夫ですし、例えば

user_input = "日本の首都の明日の天気は?"

なんて聞いても、ちゃんと

都市: 東京, 日付: 2023-04-02

と都市と日付を抽出してくれます。
自然言語解析の精度は今後どんどんよくなる一方でしょうから、そちらはLLMの進化に任せて、より本質的なサービスそのもの中身やUI/UXに集中できるようになるというわけです。

自然言語から日付を取り出す

改めてよく見ると、先ほどの例では「明日」という言葉は単なるif文による条件マッチで書かれています。これでは「明日」という言葉以外を認識することができません。「明日」を具体的な日付に変換するのは難しいのでしょうか?ChatGPTに聞いてみましょう。

「明日」を自動的に日付に変換するのは難しいですか?

すると、

いいえ、難しくありません。「明日」といった相対的な日付表現を自動的に絶対的な日付に変換するには、Pythonの標準ライブラリやサードパーティライブラリを利用できます。

と回答してきて、Pythonの日付変換ライブラリを教えてくれました。

pip install python-dateutil
from datetime import datetime
from dateutil import parser

def convert_relative_to_absolute_date(date_str):
    # 現在の日時を基準にして相対的な日付を解析する
    date = parser.parse(date_str, default=datetime.now(), fuzzy=True)
    return date.strftime("%Y-%m-%d")

date_str = "明日"
absolute_date = convert_relative_to_absolute_date(date_str)
print(absolute_date)

なるほどなるほど。しかし、これを実行してみると、

ParserError: String does not contain a date: 明日

というエラーになります。英語の"tomorrow"でもダメです。
ただ、”4/2”という文字列を与えると、

2023-04-02

という期待した答えが得られます。このライブラリはあくまで”4/2”のような日付らしい表記を解析するだけで、相対的な日付を表す自然言語までは解析はしてくれないようです。

ChatGPTは、このような「うまくいきそうなコード」を出力しますが、実際に実行して確かめているわけではないので、こうした「やってみたらうまくいかない」ことはよく起こります。「エラーの内容をコピペして再びChatGPTに聞く」「さらにそれを自動化する」、、、などやろうと思えばいろいろできますが、やりすぎるとどんどんブラックボックス化していくので、対話をしながらのほどよい共同作業をしていくのが個人的には学びもあり楽しいのでおすすめです。

さて、いずれにしてもこのPythonライブラリではやりたいことができないので、ここもプロンプトで解決できないかを再びChatGPTに聞いてみましょう。

promptを使って変換することはできますか?

ChatGPTのすごいところは、こう言う時にちゃんと前の文脈を理解してくれるところですね。(「明日の東京の天気は?」の「明日」を日付に変換したいんだけど、教えてくれたPythonライブラリではうまくいかなかったから、、)ということを改めて説明しなくてもいいわけです。
回答は以下でした。

ChatGPTを使って、相対的な日付表現を絶対的な日付に変換することもできます。以下に、ChatGPT APIを使用して相対的な日付表現(例えば、「明日」)を絶対的な日付に変換するPythonコードの例を示します。

import openai

# OpenAIのAPIキーを設定
OPENAI_API_KEY = "your_openai_api_key"

# OpenAIライブラリの設定
openai.api_key = OPENAI_API_KEY

def convert_relative_to_absolute_date(prompt_date_str):
    prompt = f"今日の日付は{datetime.now().strftime('%Y-%m-%d')}です。「{prompt_date_str}」という相対的な日付表現を絶対的な日付(YYYY-MM-DD形式)に変換してください。"

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=15,
        n=1,
        stop=None,
        temperature=0.5,
    )

    result = response.choices[0].text.strip()
    return result

date_str = "明日"
absolute_date = convert_relative_to_absolute_date(date_str)
print(absolute_date)

このコードは、ChatGPTに相対的な日付表現を絶対的な日付に変換するように指示するプロンプトを送信し、その結果を受け取ります。ただし、この方法は必ずしも最も正確で効率的な方法ではありません。組み込みの日付関数やdateutil ライブラリのような専用の日付変換ツールを使用することをお勧めします。これらのツールは、一般的に高速で正確な結果を提供し、APIコールのオーバーヘッドやコストを抑えられます。

あんまりオススメはしていないようなのが気になりますが、実行してみましょう。

2023-04-02

バッチリです!「明日」という言い方以外にも、「あした」「tomorrow」「1日後」などを入れても正しく返してくれます。なんと「一夜明けたら」と聞いてもちゃんと「2023-04-02」と返してくれました。すごいですね。ただ一方で、ちょっと意地悪に「明後日の1日前」と聞くと「明後日」が抜け落ちて「2023-03-30」と返ってきてしまいました。ChatGPTが少し自信がなかったのもわかりますが、まあ、人間でもちょっと混乱するような言い方はAI相手にもあまりしない方がいいでしょう。

さて、ChatGPTが考えてくれたこのコードには興味深い点がいくつもあります。

今日の日付を知る
プロンプトで「明日」を日付に変換するためには、まず基準として「今日」の日付を取得する必要があることを理解しています。今日が何日かわからなければ明日の日付もわかりませんからね。

必要なプロンプトをつくる
「明日」を決まったフォーマットの日付データに変換するために必要なプロンプトを生成しています。具体的なプロンプトは以下の通りです。

今日の日付は{datetime.now().strftime('%Y-%m-%d')}です。「{prompt_date_str}」という相対的な日付表現を絶対的な日付(YYYY-MM-DD形式)に変換してください。

AIの気持ちはAIが一番わかるんですよと言わんばかりに「ChatGPTにはこう言えば伝わる」というプロンプトをChatGPTが生成してくれます。

パワフルなのは、プログラムの中でプロンプトを生成できるので、「今日の日付」の部分のように、プログラムの実行結果を埋め込んだり、「明日」の部分のようにユーザーからの入力を埋め込んだりすることができ、さらにそれらを使って自然言語でプログラミングできるところです。

このような、これまでのプログラミング言語の得意なところと自然言語が得意なところを組み合わせられるのが、「プロンプトエンジニアリング」がこれまでのコーディングの常識を覆すようなインパクトをもっているところだと思います。

「東京の明日の天気は?」に答える

さて、必要な材料がだいぶ揃ってきました。ここまでの知見を踏まえて、改めてChatGPTにコードを生成してもらいましょう。

「東京の明日の天気は?」という質問から、「明日」をプロンプトを使って日付に変換して、「東京」をプロンプトを使って英語の都市名に変換して、それらを使ってweatherAPIからjsonを取得し、その内容を自然言語で返答するpythonコードを書いてください。

生成されたコードが以下です。

import openai
import requests
from datetime import datetime

# OpenAIのAPIキーを設定
OPENAI_API_KEY = "your_openai_api_key"

# WeatherAPIのAPIキーを設定
WEATHER_API_KEY = "your_weather_api_key"

# OpenAIライブラリの設定
openai.api_key = OPENAI_API_KEY

def convert_relative_to_absolute_date(prompt_date_str):
    prompt = f"今日の日付は{datetime.now().strftime('%Y-%m-%d')}です。「{prompt_date_str}」という相対的な日付表現を絶対的な日付(YYYY-MM-DD形式)に変換してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=15,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

def convert_city_to_english(city):
    prompt = f"次の都市名を英語に変換してください: {city}"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=15,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

def get_weather(city, date):
    url = f"<http://api.weatherapi.com/v1/forecast.json?key={WEATHER_API_KEY}&q={city}&dt={date}>"
    response = requests.get(url)
    data = response.json()
    return data

def get_weather_description(weather_data):
    prompt = f"次の天気情報があります: {weather_data}. この情報を自然言語で説明してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=100,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

user_input = "東京の明日の天気は?"

# 相対的な日付表現を絶対的な日付に変換
date_str = "明日"
date = convert_relative_to_absolute_date(date_str)

# 都市名を英語に変換
city = "東京"
english_city = convert_city_to_english(city)

# 天気情報を取得
weather_data = get_weather(english_city, date)

# 天気情報を自然言語で説明
weather_description = get_weather_description(weather_data)
print(weather_description)

このコードの例では、ユーザーからの質問「東京の明日の天気は?」に対して、以下の手順で答えを生成します。
1. 「明日」をプロンプトを使って日付に変換します。
2. 「東京」をプロンプトを使って英語の都市名に変換します。
3.  変換された日付と都市名を使ってWeatherAPIから天気情報を取得します。
4.  取得した天気情報をプロンプトを使って自然言語で説明します。


コードの説明付きです。ざっと見たところうまくいきそうに見えますが、ひとまず実行してみましょう。

InvalidRequestError: This model's maximum context length is 4097 tokens, however you requested 9258 tokens (9158 in your prompt; 100 for the completion). Please reduce your prompt; or completion length.

残念ながらエラーになってしまいました。エラーを読んでみると、現状ではChatGPTには扱えるトークン数に上限があり、それを超えてしまったようです。

コードを見てみると、WeatherAPIから取得したJSONの中身を丸ごとプロンプトに突っ込もうとしています。豪快なことをしますね。
この記事の最初に生成してくれたコードはもう少し丁寧だったので、それを参考に、JSONファイルから「都市名」「日付」「天気」を取り出してプロンプトをつくるように修正してみます。

def get_weather_description(city, date, condition):
    prompt = f"{city}{date}の天気は{condition}です. この情報を自然言語で説明してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=1000,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result
# 天気情報を取得
weather_data = get_weather(english_city, date)
city = weather_data["location"]["name"]
date = weather_data["forecast"]["forecastday"][0]["date"]
condition = weather_data["forecast"]["forecastday"][0]["day"]["condition"]["text"]

# 天気情報を自然言語で説明
weather_description = get_weather_description(city, date, condition)
print(weather_description)

実行してみます。

東京の2023年4月2日は、時折雨が降る可能性がある天気です。

ようやく期待した回答が返ってきました!素晴らしい!(実行する度に表現は揺らぐのでたまに不自然な時もあります。)
cityには”tokyo”、dateには"2023-04-02”、conditionには"Patchy rain possible”という文字列が入っているので、プロンプトは、

tokyoの2023-04-02の天気はPatchy rain possibleです. この情報を自然言語で説明してください。

となっているわけです。”tokyo”は都市名だとか、”2023-04-02”は日付だとは明示していないのですが、通じているのも改めてすごいですね。

そして、実はさらにすごいのは、ChatGPTが解析できるのは自然言語だけではないことです。つまり、ChatGPTがやろうとしたように、ある程度のかたまりのJSONファイルを豪快にそのまま渡してしまってもちゃんと内容を理解してしまうのです。試しに該当部分を次のようにコードを修正してみます。

def get_weather_description(city, date, forecast_json):
    prompt = f"{city}{date}の天気は{forecast_json}です. この情報を自然言語で説明してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=1000,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result
# 天気情報を取得
weather_data = get_weather(english_city, date)
forecast_json = weather_data["forecast"]["forecastday"][0]["day"]

# 天気情報を自然言語で説明
weather_description = get_weather_description(city, date, forecast_json)
print(weather_description)

"Patchy rain possible”という文字列を渡していたところを、WeatherAPIが返す元のJSONファイルの天気情報のかたまりの一部をそのまま渡しています。つまり、プロンプトは以下のようになっています。

tokyoの2023-04-02の天気は{
  "maxtemp_c": 14.3,
  "maxtemp_f": 57.7,
  "mintemp_c": 11.1,
  "mintemp_f": 52.0,
  "avgtemp_c": 13.2,
  "avgtemp_f": 55.8,
  "maxwind_mph": 17.7,
  "maxwind_kph": 28.4,
  "totalprecip_mm": 2.9,
  "totalprecip_in": 0.11,
  "totalsnow_cm": 0.0,
  "avgvis_km": 9.3,
  "avgvis_miles": 5.0,
  "avghumidity": 59.0,
  "daily_will_it_rain": 1,
  "daily_chance_of_rain": 89,
  "daily_will_it_snow": 0,
  "daily_chance_of_snow": 0,
  "condition": {
    "text": "Patchy rain possible",
    "icon": "//cdn.weatherapi.com/weather/64x64/day/176.png",
    "code": 1063
  },
  "uv": 3.0
}です. この情報を自然言語で説明してください。

結果は次のようになりました。

東京の2023年4月2日の天気は、最高気温は14.3度、最低気温は11.1度、平均気温は13.2度で、最大風速は17.7マイル/時、降水量は2.9ミリメートル、降雪量は0センチメートル、平均視界距離は9.3キロメートル、平均湿度は59%で、1日中に雨が降る可能性が89%あり、雪が降る可能性はゼロで、状態は「パッチの雨が降る可能性あり」、紫外線インデックスは3.0です。

いやあ、すごいですね。。これをコードで書こうとしたらかなり面倒ですし、JSONの仕様が変わる度に対応しなければなりません。
さっきは「”Patchy rain possible”(局地的な雨の可能性)」を自然に訳せていましたが、今回は「パッチの雨が降る可能性あり」と、ちょっと不自然になってしまったのはご愛嬌という感じですが、この辺りはどんどん改善されてしまうでしょう。

おまけで、文の冒頭に天気の絵文字を表示してもらうことにしましょう。
プロンプトは次のようにしました。

{city}の{date}の天気は{forecast_json}です. この情報を自然言語で説明してください。また、冒頭には天気に応じた適切な絵文字を表示してください。

結果は次のようになりました。

🌧️東京の2023年4月2日の天気は、最高気温が14.3度、最低気温が11.1度で、降水量は2.9ミリメートルで、風速は17.7マイルで、露出時間の最大紫外線指数は3.0で、曇り時々雨の天気となっています。

絵文字が付きました!これも天気のテキスト表現と絵文字の対応づけをコードで書こうと思ったら結構大変です。
ただ今度は”Patchy rain possible”を「曇り時々雨」と訳していたり、いくつかの項目が先ほどの回答より省略されています。このように、ざっくり任せるほど、回答も気まぐれになる点には注意が必要で、任せる部分と明示的に指示する部分のバランスが重要になりそうです。

AIとコンヴィヴィアルな関係を築く

改めて、ChatGPTをはじめとする大規模言語モデル(LLM)が、今後のソフトウェアエンジニアリングやUI/UXデザインにどれだけ大きなインパクトをもたらすか、少しは伝わったでしょうか?

ただ、すべてを自動化してAIにまかせてしまおうとすると、どんどんAIが何をやっているのかが人間にはわからなくなりブラックボックスになっていきます。そうではなく、AIと対話しながら、AIの言うことも鵜呑みにせず、人間も手を動かしながら何をやっているかを理解し、人間の側からもアイデアを出しながら、人間とAIがコンヴィヴィアルに何かを作り上げていくのがとても面白いし、つくる喜びにもなると思います。工夫次第で今回紹介したものよりもっと効率的な方法もあると思いますし、GPT-4のような最新の言語モデルでは、より複雑な内容を自然言語だけで処理できるようにもなっています。ぜひ皆さんもコードを実際に走らせながらいろいろ試してみましょう。

また、今回つくったのは対話完結型のインターフェイスですが、Figmaでデザインモックアップを作ってくれたり、Unityで3Dオブジェクトを生成したりといったように、必ずしもアウトプットもChatGPTのような対話型UIで完結させることだけが正解とは限りません。次は、自然言語ではないアウトプットをプロンプトを使ってどう実現するかも考えてみたいと思います。


※「コンヴィヴィアル」って何?と思った方は、よかったら拙著『コンヴィヴィアル・テクノロジー』を読んでみてください。2年前に書いた本ですが、AI時代を生きていくヒントがあるかもしれません。




【追記】よくよく見ると最後のChatGPTの生成したコードはuser_inputを使っていませんね(苦笑)。ただ、その前のコードを組み合わせるときちんと「東京の明日の天気は?」に答えることができました。最終的なコードは以下の通りです。

import openai
import requests
from datetime import datetime, timedelta

# OpenAIのAPIキーを設定
OPENAI_API_KEY = "your_openai_api_key"

# WeatherAPIのAPIキーを設定
WEATHER_API_KEY = "your_weather_api_key"

# OpenAIライブラリの設定
openai.api_key = OPENAI_API_KEY

def extract_city_and_date(user_input):
    prompt = f"ユーザーが以下のように尋ねました: '{user_input}'。この質問から都市名と日付を抽出してください。都市: {{都市名}}, 日付: {{日付}}"

    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=50,
        n=1,
        stop=None,
        temperature=0.5,
    )

    result = response.choices[0].text.strip()

    city, date_str = result.split(", ")
    city = city.split(": ")[1]
    date_str = date_str.split(": ")[1]

    return city, date_str

def convert_relative_to_absolute_date(prompt_date_str):
    prompt = f"今日の日付は{datetime.now().strftime('%Y-%m-%d')}です。「{prompt_date_str}」という相対的な日付表現を絶対的な日付(YYYY-MM-DD形式)に変換してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=15,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

def convert_city_to_english(city):
    prompt = f"次の都市名を英語に変換してください: {city}"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=15,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

def get_weather(city, date):
    url = f"http://api.weatherapi.com/v1/forecast.json?key={WEATHER_API_KEY}&q={city}&dt={date}"
    response = requests.get(url)
    data = response.json()
    return data

def get_weather_description(city, date, forecast_json):
    prompt = f"{city}{date}の天気は{forecast_json}です. この情報を自然言語で説明してください。また、冒頭には天気に応じた適切な絵文字を表示してください。"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=1000,
        n=1,
        stop=None,
        temperature=0.5,
    )
    result = response.choices[0].text.strip()
    return result

user_input = "東京の明日の天気は?"
city, date_str = extract_city_and_date(user_input)

# 相対的な日付表現を絶対的な日付に変換
date = convert_relative_to_absolute_date(date_str)

# 都市名を英語に変換
english_city = convert_city_to_english(city)

# 天気情報を取得
weather_data = get_weather(english_city, date)
city = weather_data["location"]["name"]
date = weather_data["forecast"]["forecastday"][0]["date"]
forecast_json = weather_data["forecast"]["forecastday"][0]["day"]
print(forecast_json)

# 天気情報を自然言語で説明
weather_description = get_weather_description(city, date, forecast_json)
print(weather_description)


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

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