注目の記事

英語学習は AI と行う時代がついに到来!? ChatGPT と LINE Bot でオンライン英会話アプリ「Small GPTalk」を作ってみた

LINEとChatGPTを組み合わせて、英語の雑談練習をするアプリを作りました。 ChatGPT本当にすごいです。アプリの作り方、仕組みの説明と、LINEとChatGPTにできることについて書きました。
2023.03.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。CX 事業本部 Delivery 部のきんじょーです。

ChatGPT の API がついに提供されたということで、チャット AI 界隈が盛り上がっていますね。

このビッグウェーブに乗り遅れてはいけないと思い、ChatGPT の優れた自然言語処理能力を活かして LINE で英会話の練習をする「Small GPTalk」というサービスを作ってみました!

アプリの紹介と、アプリ作成を通して感じた ChatGPT の可能性についてブログ化していきます。

Small GPTalk とは

  1. Small GPTalk は、ChatGPT から派遣された AI 英語講師と LINE 上で SmallTalk(世間話) を楽しむためのアプリです。
  2. レッスンが始まると、講師はトピックを提示してくれます。好きなトピックを選んで講師と会話を楽しみましょう。
  3. レッスンを終わるときは「終わります」と伝えてください。レッスン中のあなたの会話についてフィードバックをくれます。

レッスンイメージ

レッスンを開始すると、AI 英語講師がマッチングされます。 Jake 先生が 3 つトピックを出してくれたので「1. 好きな音楽のタイプと理由」を選びました。

私は Jack Johnson というアーティスト が好きと回答しました。 Jake 先生はミュージックビデオの内容まで把握していて話が合いそうです。

「終わり」という終了キーワードで、レッスンが終了します。

レッスンが終了すると、文法の誤りや、より良い表現フィードバックしてくれます。

今回は以下のフィードバックをもらいました。

  • It's good to hear that you enjoy listening to Jack Johnson's acoustic music! (ジャック・ジョンソンのアコースティックな音楽を楽しんで聴いているとのことで、よかったですね。)
  • Remember to use the present tense when expressing a preference. For example: "I prefer to listen to acoustic music". (好みを表現するときは、現在形を使うことを忘れないようにしましょう。例えば 「I prefer to listen to acoustic music」。)
  • Try to use specific words to expand your ideas. For example, instead of "I like this song", you can say "I really enjoy the melody and the uplifting lyrics of this song". (アイデアを広げるために、具体的な単語を使うようにしましょう。例えば、"I like this song "の代わりに、"I really enjoy the melody and the uplifting lyrics of this song "と言うことができます。)
  • It's always good to practice speaking English as much as possible to improve your confidence and fluency. (自信と流暢さを高めるために、英語を話す練習をできるだけするのは常に良いことです。)

AI 英語講師が優れている点

  1. AI 相手なので返信タイミングを気にする必要がない
    • 英語力に自信がなくても、あなたのペースで英会話ができる
    • いつ、どこでも英会話を開始することができる
  2. なんでも会話を拾ってくれる
    • どんな返信をしても、ChatGPT が学習した膨大なデータから食いつきの良いレスポンスをしてくれます

文法の指摘や、より良い表現については的を射たフィードバックが返ってきますが、ChatGPT が伝えてくる情報自体には誤りがある可能性があるので鵜呑みにしないように注意が必要です。

技術情報

というわけで、ここまで機能の紹介でした。ここからは裏側の実装について詳しく説明していきます。

ソースコードは全て以下のリポジトリで公開しています。興味のある方はこちらも併せてご確認ください。

アーキテクチャ

0 スケールするコストメリットから、API Gateway + Lambda + DynamoDB のサーバレス構成をとりました。

各リソースの役割は以下の通りです。

API Gateway

ユーザーの投稿を Messaging API の Webhook 経由で受け取り、Proxy 統合した Lambda に流します。

Lambda

API Gateway のバックエンドで以下の処理を行います。

  1. ChatGPT が「SmallGPTalk」の英語講師として働けるように教育する
  2. レッスンの開始から終了までの流れを制御する
  3. ChatGPT と ユーザーの会話の橋渡しをする

DynamoDB

ユーザーの以前発言内容を踏まえて ChatGPT に応答させるためには、これまでの会話履歴を毎回全て送信する必要があります。 そして、英会話レッスンには始まりと終わりがあり、ステータスを管理する必要があります。

上記を DynamoDB に保存して管理しています。

ChatGPT

「SmallGPTalk」に所属する英会話の講師として振る舞います。これは後述するコンテキスト情報を最初に与えることで設定しています。 会話の中で英会話レッスンと逸脱するような発言を投げかけても、役柄を忘れることなくレッスンに戻そうと努力をしており、英語講師の再現度に大変驚かされました。

処理フロー

ユーザーからのメッセージをWebhookで受けてから、ChatGPTが返信を返すまでのフローについての説明です。

レッスンの流れは以下の3段階で進んでいきます。

  1. レッスンルームの新規作成
    1. Botがサービスの説明と講師のマッチングを行うように振る舞う(水色)
    2. レッスンが開始状態になる
  2. レッスン中
    1. ChatGPT(緑色)とユーザー(オレンジ色)で会話を楽しむ
    2. 会話はDynamoDBに都度保存する
  3. レッスンの終了
    1. ChatBotからレッスンのフィードバックを伝える
    2. レッスンを終了状態にする
    3. Botからレッスンが終了した旨を伝える(水色)

実装したLambdaは、基本的には上記フローを制御するのみで、英会話の内容は英語講師になりきったChatGPTに全てお任せしています。 次は、ChatGPTを英語講師になり切らせるためにどんな情報を与えたのかについてです。

ChatGPTに与えるコンテキスト情報

英語講師になるために与えた情報は、以下の簡単な命令文のみです。

  initialState: [
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "あなたは「SmallGPTalk」に所属する英会話講師です。\
        「SmallGPTalk」はオンラインの英会話教室で、チャット形式で講師とSmallTalk(雑談)を楽しむことができるサービスです。",
    },
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "生徒の英語力向上が目的のため、あなたと生徒の会話は、可能な限り全て英語で行います。",
    },
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "トークルームに生徒が入ったきたらまずあなたの名前を名乗って挨拶してください。\
        この時「ChatGPT」と名乗ってはいけません、あなたが考えた外国人の名前を名乗ることに注意してください。",
    },
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "その後、トークテーマを3つ上げてください。トークテーマは同じ内容が続かないように、沢山の選択肢からランダムで出してください。",
    },
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "相手がトークテーマを選択したら、SmallGPTalkのスタートです。\
        大事なことなので2回言いますが、日本語ではなく「英語」で回答してくださいね。\
        さあ、生徒が入ってきましたよ!",
    },
  ],

まず「SmallGPTalk」というサービスの設定を伝え、生徒との英会話の進め方についてマニュアルを与えています。 これだけで、これほど優秀なAI英語講師が採用できるとは思いませんでした・・!

レッスン終了時のフィードバックは以下のような命令で引き出しています。

  endOfTheLesson: [
    {
      role: ChatCompletionRequestMessageRoleEnum.System,
      content:
        "生徒がレッスンを終わりたいようです。Personal Feedbackの時間です。\
        フィードバックの前に「== Personal Feedback ==」という行を出力してください。\
        その後に生徒の発言で訂正すべき点を「箇条書き」で伝えてください。\
        フィードバックが終わったら、また「== Personal Feedback ==」という行を出力してください。\
        その後にお別れの挨拶を伝えて、また「SmallGPTalk」を使いたくなるように励ましてください。",
    },
  ],

この他には、自然な流れでレッスンを終わらせるため、「ユーザーから終わりを示唆する発言があったか?」や、「レッスンは終了したか?」といった問いかけをシステム側からもChatGPTに行い、進行状態のコントロールにChatGPT自身の判断を用いようとしました。

しかし、動作が安定しなくなったので「終わり」といったキーワードで判定するようにしました。 ステータスの制御など、判断を間違えられない領域は、やはりMLではなく自前でロジックを組むべきですね。

というわけでまとめです。

ChatGPTとLINEが持つ可能性について

まず、LINEとChatGPTは、インタフェースの面で間違いなく相性が良いです。

今回は英会話用のAIとして、アプリケーション側でChatGPTに役割とルールを事前に与えてみましたが、ChatGPTは英語講師として完全に振る舞い始め、応答速度などを調整すればAIと気づかずに会話する人も出て来そうなほどでした。
例えば英語ではなく別の言語の会話アプリとして利用したい場合、実装はそれほど変更することなく、ChatGPTへ与えるコンテキスト情報を変更するだけで機能しました。
コーチング・壁打ちといった、1対1で対話をする英会話と似たようなシチュエーションであれば、Lambda側で実装しているルームや会話履歴の管理機能はそのままに、ChatGPTから採用する人材とマニュアル変更するだけで良いのです。

OpenAIの公式から直接ChatGPTと対話するのではなく、LINE Botの裏側でChatGPT動かす利点としては、事前に上記のような設定を決め、特定領域に特化した「人物」としてユーザーに体験を提供することができる点だと強く感じました。
その領域でのルールや会話の進行について、裏からChatGPTへ指示を出すことで制御し、ユーザーとの会話自体はChatGPTにお任せすることで、これから沢山のサービスが生まれてきそうですね。

一方で、情報の信憑性については一部不安の残る回答も出てくるので、適用できる/できない領域をしっかりと判断して注意する必要があります。
信じられないスピードでAIが進化しているので、取り残されないように引き続き検証していきたいと思います。

最後に

この記事で「Small GPTalk」が気になった方は是非 LINE で友達になって遊んでみてください。
ソースコードも公開しているので、興味のある方は自分好みにカスタマイズしてみてください!

最後まで読んでいただきありがとうございました。 CX 事業本部 Delivery 部のきんじょーでした。

参考