🧑‍🏫

ChatGPTが得意なシナリオでアプリを作ってみる

2024/05/02に公開

普段、業務でAzure OpenAI Serviceについてのワークショップやディスカッションを行っている中で、ChatGPTの特性を意識せずに「とりあえずChatGPTにやらせよう」という場面を何度か見かけます。

ChatGPTは確率的な生成を行うため、特定のシナリオにおいては非常に高い精度を持つ一方で、特定のシナリオにおいては非常に低い精度を持つことがあります。
(文中の「精度」は「人間が期待した通りの出力が得られる」という抽象的な定義・意味合いで記載しています)

通常、アプリケーション開発は「つくりたいもの」に対して「それができる技術」を選定する順番ですが、今回は逆に「特定の技術=ChatGPT」から「その技術が得意なシナリオ」を考えて実装してみました。

ChatGPTが得意なシナリオとは

英語

ChatGPTは英語の生成タスクにおいて非常に高い精度を持っています。
GPT(Generative Pre-trained Transformer)はその名前の通り、インターネット上の情報をデータとして事前学習されています。つまり世界の話者人口に左右された結果、英語の学習データが最も多くなるというわけです。
具体的にはGPT-4のページにも記載されていますが、「MMLU(Massive Multi-task Language Understanding)」と呼ばれる57科目の組み合わせで知識や問題解決能力を測るテストで、GPT-4は各言語別で次のようなスコアになっています。

  • 日本語:79.9%
  • 英語:85.5%
    (数字が高いほど正しい答え(指示理解)ができていることをしめす)

ちなみにGPT-3.5は英語でも70.1%なのでGPT-4の日本語はGPT-3.5の英語よりも高い精度を持っていることがわかります。

確率生成が許される

GPTモデルの文章生成手法を一言で表現すると「前の文章に続く可能性が高いワードを生成する」という挙動です。つまりそれらの文章の内容の正確性はわかりません。単純に多くの学習データがそういう文章になっている、というだけです。
そのため計算や論理的な思考は得意ではない傾向があります。一方で昔話や物語の生成など、確率生成が許されるシナリオでは非常に有用です。

モデル単体で生成できる

世間ではRAG(Retrieval Augmented Generation)という外部から独自のデータを検索してきてそれをプロンプトとしてGPT入力して回答させる手法が流行っています。
もちろんビジネス的な価値やニーズは理解しますが、RAGはGPTモデルが最も得意とするシナリオかというと、答えはNoです。

そもそもGPT単体では回答ができない苦手なタスクであるために外部から情報を取得する必要があるわけですし、GPTモデルは入力する文量が多ければ多いほど生成の速度が遅くなります。加えて文量に反比例して精度が下がる傾向が経験的に知られています。
つまりGPT単体で生成できるようなタスクが本来はGPTの得意とするシナリオということになります。

そこから導き出されるアプリケーションは・・・

英語学習アプリだ!

と思いつきました。
日本の学校では誰しも参考書などを使って英語を学習すると思いますが、本は買った時点でコンテンツが固定されていますし、リアクティブなQAなどの学習ができません。
その点ChatGPTを使えば、ユーザーが入力した内容に対してリアクティブに返答を返すことができます。
そして何よりChatGPTが得意とする確率生成で、さまざまなバリエーションの出力が得られる英語の生成タスクです。

作ってみたもの

まずはこんなのがあったらいいなと思う2つのモードを実装してみました。サンプルコードは記事の最後に掲載しています。

FreeChatモード

AIやChatGPTと自由に会話をできるサービスやアプリはこれまでいくつかリリースされていますが、英語学習者にとっては「会話の流れを遮らずに」フィードバックがほしいと感じています。
今回はチャットウインドウとフィードバックエリアを分けて、会話の流れを遮らずにフィードバックを受け取れるようにしました。
学習者が本当に初心者の場合、完全なフリーチャットだと「Hi」「Hello」だけで終わってしまう可能性があるため、いくつかのシチュエーションテンプレートからドロップダウンで選択できるようにしています。

字が小さい場合は全画面表示にするかYoutubeの画面に飛んでご覧ください。

https://www.youtube.com/watch?v=8pnAzcNUvz8

※フィードバックが発生するようにあえて間違えています。あえて間違えています。(大事なことなので2回(ry)

ポイント

具体的にどう実装しているのかと言うと、ユーザーからの入力は通常のテキストですが、ChatGPTではチャットの返答とフィードバックを含んだJSONで出力させています。
このような実装をすることで、チャットの返答とフィードバックを分離することができます。

また、フィードバックには文法や語彙など、フィードバックの分野も答えさせることで学習者がどの用な分野に弱点があるかを把握しやすくしています。このような分類タスクもChatGPTには得意なタスクの一つです。

具体的には以下のようなJSONを返すようにプロンプトを設定しています。

{
    "message": "What purpose did you go to the airport for?", // ChatGPTから会話の返答
    "feedback": [ // フィードバック
        {
            "type": "Grammar",
            "content": "昨日の出来事であれば過去形にする方が適切です。"
        },
        {
            "type": "Vocabulary",
            "content":  "この場合は「airport」を使うほうが適切です。"
        }
    ]
}

ChatGPTのリクエスト時にはJSONモードを指定してChatGPTからの出力がJSON形式で返ってくることが保証されるようにしています。
JSONモードについての詳細は以前投稿した記事をご覧ください
https://zenn.dev/microsoft/articles/azure-openai-jsom-mode

TOEICモード

TOEICのような穴埋めの択一問題を出題してくれます。
その問題を正解できた場合にどれくらいのTOEICスコアが見込まれるかの基準が表示されます(TOEICの採点基準は公開されていないため、ある程度の難易度目安です)。

また、問題に回答後にはチャットウインドウを開いてフォローアップができるようにしています。

字が小さい場合は全画面表示にするかYoutubeの画面に飛んでご覧ください。

https://www.youtube.com/watch?v=ijWWxtugcRI

※テストのためにあえて間違え(ry

ポイント

問題生成もFreeChatモードと同様にJSONモードによってJSONを返すように設定しています。
複数問を一度に生成するので少し時間がかかっています。本格的に使う場合は

  • ユーザーがリクエストをする前に裏で問題生成をしてDBに保存しておく
  • 一問ずつ生成する

などの対応が必要かもしれません。

また、フォローアップは問題とユーザーの回答、実際の正解をRAGのようにシステムプロンプトを設定することでChatGPT起点でユーザーへフォローアップを開始します。
WebアプリのChatGPTがそのような実装なので、ユーザー起点でチャットを開始する必要があると思いがちですが、システムプロンプトだけ設定してCompletionを実行するとChatGPT側から話しかけてくれるような会話が実現できます。

サンプルコードリポジトリ

サンプルという特性上、意図的に次のようなコーディングをしていません。

  • コードの共通化
  • 厳密なエラー処理やバリデーション

試行錯誤しながらできたものなのでリファクタの余地は多分にありますが、部分的に参考にしていただければ幸いです。

https://github.com/07JP27/GPTEnglishCoachingApp/

GitHubで編集を提案
Microsoft (有志)

Discussion