みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

Kingyo AI NaviでChatGPTを試す(1)

数年前に, 金魚の種類を判別したり, 大和郡山市や金魚に関する情報を提供する「Kingyo AI Navi」っていうプロトタイプ[1]を作成した.

mirai-tec.hatenablog.com

「Kingyo AI Navi」のシステム構成は以下のようになっており, テキストによる金魚や大和郡山市に関する質問は, Google CloudのDialogFlowを使って質問文のタイプを判断し, 予め準備した回答のリンク先を表示するようにしている.

しかし, 当然の事ながら, 質問文のタイプに当てはまらない場合には回答することができない.
そこで, 最近流行りのChatGPTをみて, 「Kingyo AI Navi」の情報提供に利用できないか検討してみることにした.


関連記事:


まずは, ChatGPTに金魚や大和郡山市に関する質問をしたら, どのような回答を返してくるのか, また, 応答時間などについて調べてみた.


1. 評価ツール
ChatGPTはブラウザで試すのが容易だが, レスポンス時間等も測定したかったので, ChatGPTのAPI[2]を使って, 評価ツールを作成した.

[コード]

import os
import argparse
import pandas as pd
import time

import openai

openai.api_key = os.getenv('OPENAI_API_KEY')

def ask_chatgpt(input_text):
    response = openai.ChatCompletion.create(
        model = "gpt-3.5-turbo",  # 利用モデルのID
        messages = [{
            "role" : "user",
            "content" : input_text,
        }],
        max_tokens = 1024,  # 入力トークンと生成トークンの合計の最大数
        n = 1,  # 入力メッセージに対するチャット選択肢の数
        temperature = 0.3,  # 出力内容のランダム性(0-2)
        )

    return response.choices[0].message.content

def main(args):
    # 質問文の読み込み
    ds_inp = pd.read_csv(args.input, header=None)
    # 出力用DataFrame準備
    cols = ['question', 'response', 'length', 'time']
    ds_outp = pd.DataFrame([], index=range(len(ds_inp.index)), columns=cols)
    for i in range(len(ds_inp)):
        input_text = ds_inp[0].iloc[i]
        input_text += f' {args.limit}文字以内にまとめて'
        st = time.time()
        # ChatGPTに問い合わせ
        res = ask_chatgpt(input_text)
        et = time.time()
        data = [input_text, res, len(res), float(et-st)]
        print(data)
        ds_outp.iloc[i, :] = data
        # 制限(3/min)対応のため20秒待ち
        time.sleep(20)

    # 結果をファイルに
    ds_outp.to_csv(args.output, index=None)
        
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--input', required=True, help='Input file')
    parser.add_argument('-o', '--output', help='Output file', default='output.csv')
    parser.add_argument('-l', '--limit', help='Character limit', default=512)
    args = parser.parse_args()
    main(args)

注) APIアクセスについては, 1分あたりの要求数の制限(3/min)があるようなので, 問い合わせ毎に20秒のSleepを入れている.


2. 評価
金魚と大和郡山市に関して, 各10問の質問文を準備し, 回答内容だけでなく, 回答内容の文字数や応答時間などについて簡単に評価してみた.

[評価条件]
モデル:gpt-3.5-turbo
文字数制限 : 512 / 100 (質問文で, 文字数指定)
出力のランダム性 : あり (temperature=0.3)

2.1 質問文

質問番号 質問内容
1 金魚の種類はどのくらいあるの
2 金魚の病気はどんなのがあるの
3 金魚に白い点々が出てきた
4 金魚の水槽の水はどのくらいで換えたらいいの
5 金魚の水槽の温度はどの程度がいいの
6 金魚はどのくらい生きるの
7 金魚の産地はどこ
8 金魚には一日何回餌をあげればよいの
9 琉金と和金を一緒に水槽に入れても大丈夫
10 琉金の飼い方を教えて
11 大和郡山の観光名所を教えて
12 大和郡山城について教えて
13 大和郡山のイベント情報を教えて
14 金魚すくい選手権はいつ頃からやってるの
15 大和郡山のランチの美味しいお店は
16 近鉄郡山駅の近くのラーメン屋を教えて
17 大和郡山の金魚の出荷量は
18 大和郡山の有名なお寺を教えて
19 大和郡山で花見ができるところ教えて
20 大和郡山で紫陽花がきれいなところは

2.2 回答内容
金魚に関する質問に対しては, かなりいい感じで返してくるが, 大和郡山市に関する質問に対しては, 奈良県内や福島県郡山市の情報があったり, はたまた大和郡山市内には存在しない(私が知らないだけかも...)お店の名前などが出てきたりと, かなりダメダメな感じがする.
まともそうな回答、微妙な回答, おかしな回答をいくつか紹介する.

まともそうな回答例:

質問番号 回答
2 金魚の病気には、白点病、黒点病、水カビ病、鰓腫瘍、鰓膜炎、尾びれ腐れ病、腹水病、浮き袋病などがあります。これらの病気は、水質や餌の与え方、ストレスなどが原因となって発生することが多いため、適切なケアが必要です。定期的な水換えや、適切な餌の与え方、ストレスを与えない環境づくりなどが大切です。また、病気が発生した場合は、早めの対処が必要です。
5 金魚の水槽の温度は、18℃~25℃が適切です。水温が低すぎると金魚の免疫力が低下し、病気にかかりやすくなります。一方、高すぎると酸素不足になり、金魚が窒息してしまうことがあります。また、急激な温度変化も避けるようにしましょう。水温を安定させるためには、水槽の場所や季節に合わせた温度調整が必要です。
8 金魚には一日2回、1回の餌の量は金魚の目玉程度が適量です。ただし、与えすぎには注意し、余った餌は取り除くようにしましょう。また、金魚には栄養バランスの良い餌を与え、過剰な蛋白質や脂肪分を含む餌は避けるようにしましょう。定期的に水を交換し、水質管理にも注意して、健康な金魚を育てましょう。

微妙な回答例:

質問番号 回答
12 大和郡山城は、奈良県大和郡山市にある城跡である。天正年間に豊臣秀吉によって築城され、関ヶ原の戦い後に徳川家康に与えられた。城内には、本丸、二の丸、三の丸、南の丸、北の丸、大手門、二の門、三の門、櫓台、堀、石垣などが残っており、国の史跡に指定されている。城跡は、桜の名所としても知られ、春には多くの観光客が訪れる。また、毎年10月には「大和郡山城まつり」が開催され、武者行列や花火大会などが行われる。
14 金魚すくい選手権は、日本の夏祭りでよく見られるイベントの一つで、子どもから大人まで楽しめる人気のあるゲームです。正確な始まりは不明ですが、江戸時代から存在していたとされ、現在では全国各地で開催されています。競技方法は、水槽に入った金魚を網ですくい、時間内に多くの金魚を捕まえることが目的です。競技者は熟練の技術を持ち、狙いを定めて瞬時に網を入れることが必要です。金魚すくい選手権は、日本の文化の一つとして、今後も多くの人々に愛され続けることでしょう。
18 大和郡山には多くの有名なお寺がありますが、その中でも代表的なものをいくつか紹介します。まずは、法隆寺が挙げられます。法隆寺は、奈良県にある古代日本最大の寺院であり、世界遺産にも登録されています。その歴史は古く、聖徳太子が建立したとされています。次に、興福寺があります。興福寺は、奈良県にある仏教寺院で、奈良時代に創建されたとされています。国宝や重要文化財が多数所蔵されており、特に五重塔は有名です。また、東大寺も有名なお寺の一つです。東大寺は、奈良県にある仏教寺院で、世界最大級の木造建築物である大仏殿があります。また、毎年2月には「お水取り」が行われ、多くの人々が訪れます。以上、大和郡山にある有名なお寺を紹介しました。それぞれに歴史や文化があり、多くの人々に愛されています。

おかしな回答例:

質問番号 回答
15 大和郡山には美味しいランチが楽しめるお店がたくさんあります。その中でもおすすめのお店をご紹介します。まずは「麺屋 一燈」。こちらはラーメンが人気で、特に「一燈ラーメン」は絶品です。スープは豚骨と鶏ガラのダブルスープで、麺は自家製の中太麺が使用されています。また、野菜たっぷりの「一燈ラーメン 野菜たっぷり」もおすすめです。次に「cafe&dining ひだまり」。こちらはランチにピッタリのカフェレストランです。季節の野菜を使ったサラダや、手作りのパスタ、ハンバーグなどが人気メニューです。店内は明るく、落ち着いた雰囲気で、女性にも人気があります。最後に「鳥貴族 大和郡山店」。こちらは居酒屋ですが、ランチタイムにも利用できます。特におすすめなのは「鶏の唐揚げ定食」。鶏肉はとてもジューシーで、揚げたてのサクサク感がたまりません。また、サラダやスープ、ご飯、漬物がセットになっているので、ボリュームも満点です。
20 大和郡山市には、紫陽花が美しく咲く場所がいくつかあります。まずは、大和郡山市立橘高等学校の校内にある「橘公園」がおすすめです。ここでは、紫陽花が約1,000株も植えられており、様々な種類の花が見られます。また、公園内には小川や池もあり、水面に映る紫陽花も美しいです。次に、大和郡山市立図書館の前にある「紫陽花の丘」もおすすめです。ここでは、約200株の紫陽花が植えられており、6月中旬から下旬にかけて見頃を迎えます。また、夜にはライトアップもされ、幻想的な雰囲気を楽しめます。最後に、大和郡山市内にある「薬師寺」も紫陽花が美しく咲く場所の一つです。ここでは、薬師寺の境内にある「紫陽花の庭」で、約200株の紫陽花が見られます。また、薬師寺周辺には紫陽花が咲く公園もあり、散策しながら楽しめます。以上、大和郡山市で紫陽花が美しく咲く場所を紹介しました。ぜひ、訪れてみてください。以上、大和郡山で美味しいランチが楽しめるお店をご紹介しました。ぜひ足を運んでみてください。

2.3 応答時間
文字数制限を512とした場合の応答文字数と応答時間をグラフ化すると以下のようになった.

応答文字数と応答時間はほぼ比例関係にあるようなので, 応答時間を10秒程度に抑えようとすると, 文字数制限を100にする必要がある.
そこで, 文字数制限100でも試してみた.

文字数制限 最小文字数 平均文字数 最大文字数
512 129 233.8 458
100 32 116.7 172

文字数制限 最小時間(s) 平均時間(s) 最大時間(s)
512 11.37 18.57 33.19
100 3.00 9.44 14.84


今回は, ChatGPTをAPIから使用して, 金魚や大和郡山市に関して質問し, どのような回答を返してくるか確認するとともに, 応答時間等についても少し調べてみた.
回答内容については, 金魚に関する質問に関してはそこそこ妥当な感じの回答を返してくるが, 大和郡山市に関してはまだまだの感じがした.
地域情報やイベント情報などについては現時点では期待したほどの回答は返してこないが, 最新のGPT-4ではさらに性能が向上しているとのことなので, まだまだ回答内容はよくなっていくと思われる.
またOpenAIはGPT-3.5を始めとした言語モデルをファインチューニングする機能も提供しているようなので, 各地域の情報でファインチューニングすることでかなり解決できるとも思われる.

次回では, 「Kingyo AI Navi」にChatGPTによる回答機能を組み込んでみようと思う.

----
参照URL:
[1] 「Kingyo AI Navi」のアプリ化を考える(1)~(6) - みらいテックラボ
[2] API Reference - OpenAI API