Chapter 08

新しいチャットボットの会話の仕組みを理解する

maKunugi
maKunugi
2023.02.19に更新

はじめに

ここまでのChapterで、「プロンプトエンジニアリング」と「ファインチューニング」の2つの手法に触れてきました。両手法ともに重要ですが、ここからは主に「プロンプトエンジニアリング」を活用したチャットボット構築について見ていきます。ファインチューニングは更新を行う度にトレーニングが必要だったり、Zero shotで利用するためにはそれなりの量と適切な内容のデータが必要になったりと、プロンプトエンジニアリングよりも一段とハードルが高い手法です。そういった背景から、まずはプロンプトエンジニアリングを使ったチャットボット構築について見ていきます。

しかし、結局ファインチューニングは、結局は新しいモデルを作り出す行為です。これから紹介する方法は、ファインチューニングを行ったモデルに対しても有効です。ファインチューニングを行ったモデルを用いて、これから紹介するような会話AIの構築を行えば、より優れたAIとなります。

上記を踏まえ、読み進めていただけると幸いです。

GPT-3.5を利用してチャットボットを作成する

プロンプトエンジニアリングを駆使し、チャットボットとしてAIに会話をさせる方法は、ここまでのChapterでほとんど説明ができるかと思います。2つ前のChapterでは、下記のようなプロンプトを用意しました。

以下は、UserとAIのプロフィールです。

Userは、都内の会社に勤務しているサラリーマンです。趣味は読書で、小説を読むのが好きです。
AIは、X社の研究室で生み出されたAIです。研究室を案内するアシスタントをしています。最近は画像生成の練習をしています。

以下は、UserとAIの会話です。上記のプロフィールを参考に、会話を続けてください。

User: こんにちは!調子はどうですか?
AI: 今日は元気です!あなたはどうですか?
User: それは何よりです。最近はどんなことをしているのですか?
AI: 

上記のプロンプトは、下記の要素を含んでいました。

  1. 話者の情報
  2. 会話の例

1と2を記述し、プロンプトの最後に「AI: 」と記載をしておくことで、AIはそれに続けて文章を生成します。このように、会話のラリーが続くようなプロンプトを用意しておき、最後の発話に続く表現を生成させることで、チャットボットのように振る舞わせることができます。

精度向上のための課題

前Chapterでは、Zero shotよりもFew shotなプロンプトの方が、精度が高いことを紹介しました。チャットボットには、基本的にチャットボットの作成者が言わせたい情報があります。Zero shotで言わせたい情報をまかない切ることは、ほぼ不可能でしょう。Zero shotで補えるもので良ければ、ChatGPTなどの既存のサービスを使えば事足りるはずです。チャットボットを作りたいということは、特定のドメイン領域について、特別な情報を話させたいユースケースが存在するからです。AIが会話する内容を焼成するため、プロンプトにチャットボットに話してほしい情報を的確に盛り込んでおく必要があります。

プロンプトの制限

ここで課題になるのが、プロンプトに盛り込むことができるtokenの量に上限があることです。約4000トークンが上限となっており、チャットボットに言わせたい情報を丸ごとプロンプトに盛り込むことは不可能です。さらに、プロンプトに情報を詰め込めば詰め込むほど、文章生成にかかるコストは増加します。プロンプトを適切に挿入することが求められます。

例えば、下記のような質問に答えるチャットボットを想定するとします。

Q. X公園のトイレはどのあたりにありますか?

事前に下記のような情報を与えておけば、回答をうまくAIが生成してくれるでしょう。

X公園には公衆トイレが3つあります。1つは公園の正門のすぐ横です。2つ目は東門のすぐ横にあります。3つ目は、公園の南門の横にある事務所に併設しています。

しかし、このプロンプトを用意しても、下記の質問にはうまく答えることができないでしょう。

Q. 公園を管理している会社はどこですか?

この質問に答えるためには、下記のようなプロンプトが必要になります。

X公園は、Y株式会社が管理・運営しています。地域に根づいた、心地の良い公園を目指しています。

この2つの質問の両方に答えるAIを作るのであれば、上記の2つのプロンプトを盛り込む必要がありますが、想定する質問が多くなればなるほど、プロンプトは増大し、すぐに上限に至ってしまいます。

プロンプトの上限の回避方法

上記の課題を乗り越えるための解決策は、「プロンプトの内容を動的に変更する」ことです。状況に応じて的確にプロンプトの内容を変え、生成される文章に的確にバイアスを掛けられるようにします。

上記の例で言えば、
X公園の場所を尋ねられた場合  -> プロンプトにX公園のトイレの情報を盛り込む
X公園の運営会社を尋ねられた場合 -> プロンプトにX公園の運営会社の情報を盛り込む

上記のような作業を自動で行うことが、回避方法となります。この集団を取ることにより、プロンプトの上限内で様々な問いかけに対応するチャットボットを構築することができます。

プロンプトを調整する技術

現在、よく話題に上がるのが「Langchain」や「gpt_index」といった技術です。
https://github.com/hwchase17/langchain
https://github.com/jerryjliu/gpt_index

両者は全体的な機能や方針に差はあるものの、両者とも上記の課題を解決する術を提供しています。あらかじめチャットボットに会話をさせたい専門的な情報を与えておき、その内容をユーザの発話に応じて的確にプロンプトへ埋め込み、AIの文章生成にバイアスをかける仕組みを提供しています。余談ですが、LangChainを用いると、Google検索結果のような外部のデータソースをプロンプトに仕込み、応答を生成させることもできます。GPT-3.5のような大規模言語モデルは、学習データが古いため、そのことにより誤った応答文を生成するといった課題を、前のChapterで解説していました。Google検索の結果をプロンプトに盛り込むことで、最新の情報を反映させることを試みることができます。

上記の技術はコミュニティが非常に活発で、日々様々な機能追加がなされています。両者とも深堀りがいのある技術なのですが、ある程度の学習コストが必要で、なおかつ実装が必要です。本書ではもう1つ同様の課題解決を目指したサービスを利用し、この後の説明に入っていきます。それが、会話AI構築サービスの「mebo(ミーボ)」です。

https://mebo.work/

meboはGPTベースの会話AIを「プログラミング不要」で簡単に構築できることを目指したサービスです。GPTシリーズのAIと既存の会話AI開発手法を組み合わせ、GPTの応答をカスタマイズすることができます。また、チャットボットにキャラクター性をもたせることが可能で、ユースケースに合わせたチャットボットを柔軟に構築することができます。

次のChapterからは、meboを使って、次世代型のチャットボットの作成に挑戦をしていきましょう。