2023年08月25日

ChatGPTで「学習するLINEbot」を作ってみた

じゃお

近頃、ChatGPTの活躍が目覚ましいですね。
ChatGPT活用例の一つとして、自然な会話を可能とするLINEbotが挙げられます。
「ChatGPT LINEbot 作り方」と検索すれば、簡単なレシピ(?)がごまんと出てくるでしょう。
これは実際に作ってみたものです。
LINEbotサンプル
多分、自力でビシソワーズを作るより簡単です

一昔前では、ここまで自然な応対が可能なLINEbotを個人が作り上げるなど、考えられないことでした。

今回は、このLINEbotに一工夫加えて、「学習」という概念を与えてみたいと思います。
非エンジニアでもわかるように解説しておりますので、革新的なこの技術に関してぜひご覧になってください。

目次

  1. 学習するLINEbotとは
  2. 学習するLINEbotの作り方
  3. 最後に

1.学習するLINEbotとは

簡潔に言うと、「覚えるべきことだけを自発的に覚える」という機能を持ったLINEbotのことです。

まず前提として
ChatGTP APIの通信はステートレス(状態を保持しない)であり、前回まで送った内容を記憶してくれません。※ブラウザ版のChatGPTは例外
前回の会話を記憶していないLINEbot
支離滅裂。弁当パックや雑誌のページで隙間を塞ぐって何……?

これでは「自然な会話」というものが随分とハリボテじみたものになってしまいます。

工夫として、会話内容をGoogleスプレッドシートにログとして保存し、ChatGPTへのプロンプト(指示)にそのログを添えることができます。
過去の会話を全く覚えていないChatGPTさんに対して「ほら、あんたとユーザーはこんなやり取りをしてたんですよ」と毎回ログを見せつけてあげるイメージです。
そうすればChatGPTさんは、過去の会話内容を踏まえた受け答えをしてくれるようになります。
しりとり可能なLINEbot
しりとりが成立しています

しかしこれは万能ではありません。
ChatGPTさんへのプロンプトには文字数(トークン)の限界があるため、ログがかさむとエラーになってしまいます。エラーにならずとも、トークンが増えればお金もかかります
さらに工夫を加えて、会話ログの中から最新10件のみプロンプトに添える、といった対策を取ることもできますが……最新10件と指定した場合は、最新10件目より古い内容は綺麗サッパリ忘れ去られます。また、最新10件の中には「おやすみ!」「おやすみ!また明日!」のような、記憶するに値しない情報まで含まれます。

まとめると直近の会話内容しか覚えてくれないということです。
僕も上司から受けた指示は2時間経てば全て忘れているので、気持ちはわかります。

「学習」とは程遠いですね。
よって今回作成するLINEbotは、「覚えるべきことだけを自発的に覚える」という機能を搭載したものにしていきます。

2.学習するLINEbotの作り方

いきなりですがLINEbotそもそもの作り方については、割愛します。一番シンプルな、GoogleAppScriptを使って作る方法を取っています。
完成品のソースコードはこちらのリポジトリにありますので、気になる方は御覧ください。
参考にしたサイトのURLをREADMEに添付しております。

ここでは、LINEbotに「学習」という機能を与える方法と、実際にどのように動くかを記していきます。
やるべきことはたった1つです。
ユーザからメッセージの送信を受けた際、ChatGPTさんに対して、メッセージの受け答えを作成するプロンプトと別に、「ユーザーの発言内容から覚えるべきことを抽出する」プロンプトを追加するだけです。
下記はプロンプトの一部です。
プロンプト
function callingという最近追加された機能を使っています

特筆すべき点は「覚えるべきことをChatGPTが自分で判断すること」と、「抽出したものをJSON形式で返してくれること」です。
JSON形式とは、簡潔に言うとプログラムが処理しやすいデータの形のことです。
実験として、上記のプロンプトに対して、下記の発言をしてみましょう。

俺は高校生探偵、工藤新一。
幼馴染で同級生の毛利蘭と遊園地へ遊びに行って
黒ずくめの男の怪しげな取引現場を目撃した。
取引を見るのに夢中になっていた俺は、
背後から近づいてくるもう一人の仲間に気づかなかった。
俺はその男に毒薬を飲まされ、目が覚めたら……

体が縮んでしまっていた。
工藤新一が生きているとやつらにばれたら
また命を狙われ、周りの人間にも危害が及ぶ。
阿笠博士の助言で正体を隠すことにした俺は、
蘭に名前を聞かれて、とっさに江戸川コナンと名乗り、
やつらの情報をつかむ為に、
父親が探偵をやっている蘭の家に転がり込んだ。

たった一つの真実見抜く見た目は子供、頭脳は大人、
その名は、名探偵コナン!

ChatGPTは下記JSONを返してくれました
GPTさん冷静な分析
JSONで返してくれるところが本当にすごい

名探偵コナンは著名なものであり、ChatGPTが知識として持っているものなので、「ユーザは工藤新一(コナン)の視点で話す可能性がある」と、あくまで会話botの目線から情報を付け加えてくれています。
あとはこのJSONを、Googleスプレッドシートに出力する処理を加えます。
そして、前述の通り、ChatGPTは過去のやりとりを覚えていないため、次回以降の発言の際に、スプレッドシートの内容をChatGPTに対して「ちなみにあんたが覚えておくべきものと判断したものはコレっすよ」のように添付してあげれば、完成です。

実際にLINEbotを動かしてみましょう。
「自己紹介」「botの口調の指示」をしてみたいと思います。
bot会話

図らずも就活面接のようになり、唐突に敬語で話せと命令するヤバイ奴みたいになってしまいましたが、スプレッドシートの方を見てみましょう。
botが記録した内容
ChatGPTさんが「覚えておくべき」と判断した内容です

僕の発言の中から、bot目線で情報を抜き出してくれています。

本当にこの内容を覚えているかどうか、確認しましょう。
bot会話

めんどうくさい恋人のようなことを言っても、的確に返してくれます。律儀にキャラを壊して敬語も貫いてくれています。

以上です。
自分のことを覚えてくれているというのは、誰でも嬉しいものですよね。ミーガン(映画)のように暴走しないことだけは祈りたいです。

3.最後に

以上の実装は全て記事執筆時点(2023年8月27日)のものです。
近い将来、こんな面倒くさいことをしなくても、デフォルトでChatGPTが学習してくれる機能が技術の進歩により搭載されることでしょう。
また、文字数(トークン)の上限も増えていくでしょうし、そうなればChatGPTが保持できる情報量が増えます個人のことを深く記憶してくれているAIが、当たり前である世の中になっていくのです。
目覚ましくAIが発展していく中で、人間らしい価値を生み出せる人間になっていけるかどうかが、今後の社会での生き残りの鍵になっていくと思います。

AIに問うことではない
だそうです