はじめに
2021年9月までの一般的な知識しかもっていない ChatGPT を業務で使うなら ReAct (Reasoning and Action)は欠かせませんよね。API の公開以来色々な ReAct が出てきていると思います。
- 検索エンジンと組み合わせて、検索結果を ChatGPT に取り込み、要約させる
- 外部 API を呼んで、その結果を ChatGPT に取り込んで、文章として生成させる
- などなど
でも、この情報を見てほしい! っていうときに色々ともどかしいことってありません?正しく外部の情報を取りに行ってくれるのか、あるいはそもそもどこに正しい情報があるのかわからないっていう状況とか。
今回は 「何か聞く」-> 「外部の情報をとってくる」-> 「答えが返ってくる」、のうち「外部の情報をとってくる」は一旦人間がやればいいや。っていう思いで作った ChatGPT + 人間 ReAct の組み合わせの考察です。
実装したものと動きの紹介
右側に情報 BOX という名前の枠があって、ここに事前情報をいれます。どんどんいれます。その上で、左側のチャットパネルに、「説明会用にアジェンダを作成して」とかいれてると、真ん中にアジェンダが返ってくる、っていう感じです。
右下にGPT-3 Encoder のトークン数を出してます。ChatGPTとしては参考までではありますが、上限が4096なので、ここが3000を超えるとちょっときつい。っていう感じで見れるようにはしています。(2000くらいなら余裕ですね)
上の画像では、右側に公式サイトからとってきた Azure Container Apps の説明文章を入れています。このあたりかな?っていうのを特に中身を見ずにバンバン張り付けてます。順序とかフォーマットとかはとりあえず気にせずに。
で、「Azure Container Apps紹介セミナーのアジェンダ案を作成してください」と入れた結果が真ん中に出ています。補足もいれてもらったので画像上は見づらいですが、アジェンダとしてはこんな感じです。
- Azure Container Appsとは
- Azure Container Appsのユースケース
- Azure Container Appsの機能
- Azure Container Appsと他のAzureコンテナオプションの比較
- Azure Container Appsの特徴と利点
情報ボックスにいれた内容が色濃く反映されますが、補足説明も素のChatGPT が知りえない情報がたくさん入ってますので、まぁいいんじゃないでしょうか。
あと、日本語サマリー文書を生成してください。とかやると翻訳にもなったりしますね。英語だとトークン消費量が日本語に比べて少ないので、英語でジャンジャン集めて、日本語にしたり分析したりっていう使い方がアリな気がします。
下の画像は、wikipedia の Economy of Japan の内容をどかっと入れてサマリーさせたものです。今回 ChatGPT のフォーマットが揺れてしまうことが多々あったので、フォーマットエラーがでたら気にせず全部貼る形にしてます。
読みやすい感じでいいかなーって思いつつ、ただ特定のページの情報だけをまとめる場合は、Edge + Bing Chat ができることに劣化版になってしまうので、いろんなページから集めないとうま味は0ですねー。なのでこれは動きの確認のためにという感じです。
今回のプロンプト
基本指示プロンプトは以下の形です。フォーマット指定を例文もいれて頑張ったのですが、文書生成以外っぽい指示が入ると途端にフォーマットが崩れてしまうことがあり、アプリ側でエラー時にとりあえあず表示しちゃうようにしました。
本当はもう少しちゃんとプロンプトをブラッシュすると良いですね。
最後の${infobase}
が画面右側の情報 Box の内容になります。そのままぶちこんでます。
const system_prompt = `あなたはユーザの文章作成アシスタントです。
事前情報として以下の情報BOXの内容が与えられています。
指示に従い、**情報BOXの内容を使って**、以下のJSONフォーマットで回答を出力してください。
**JSONのみ出力してください**
**改行コードなどの特殊記号はエスケープしてください**
# 回答JSONフォーマット
{"message": "補足メッセージ", "output": "指示に従って作成した文章"}
入力例: XXXの説明資料をつくっています。アジェンダを考えてください
出力例: {"message": "アジェンダを作成しました", "output": "1. XXXとは、\\n2. XXX の...、\\n3. ...."}
入力例: A社の財務状況を説明してください。
出力例: {"message": "A社の財務状況文章を作成しました", "output": "A社の財務状況は ..."}
入力例: 文章を適当に考えて
出力例:{"message": "文章を作成するにはテーマなどが必要です", "output" : ""}
# 情報BOX:
${infobase}
`
まとめと ReAct についての考察
ReAct は素晴らしい考え方で、ChatGPT のポテンシャルをぐっと引き上げた半面、どの情報をどういう風にとってくるか、っていうところを考えないとならないかと思います。
検索サービスがあればクエリを生成させたり、PDFがあるならOCRをかけてどこかに集約して、そこに検索させたり、あとはAPIを呼びに行くならAPIに必要なパラメータを抽出させたり。
理想的には ChatGPT に何か聞くと、うまいこと情報をとってくれて、その情報を料理してくれる。までをシステム的に一気通貫でやると良いのですが、検索精度やそもそもの情報の量と質なんかは大きな課題になって、「うまいこと」っていうのが難しい状況もありますよね。
- 正しい情報があること
- 正しい情報をある程度正確に取得できること
の2点を、まぁいろいろな仕組みで代替しているわけですが、例えば資料を作りたいよとかそもそも情報が散らかっている時は ChatGPT だと token 上限もあるので、まだまだ人間がやっぱりある程度情報をスクリーニングする必要もあるかなっていうところで作ってみたツールでした。(標準のプレイグラウンドとかポータルでも見づらいけど同じことができるんですが)
やってみたところ
- ChatGPT は4096tokenの上限があるので、そうとう上手く情報を取らないとすぐにあふれる。英語有利。
- ChatGPT に入力する情報に量的な偏りがあると、それに引っ張られる
というのが ReAct の基本的な制限ということがよくわかりました。
検索エンジンなりとつないでから、あれ?なんか期待したほどではないなぁって思う前に、どういう情報がどういう風にとってこれてこういう風に使えそう、っていうのは検証しないとダメですね。特にデータ量。検索の場合なんかで特定の方向の情報ばっかりとれちゃうと、それに染まっちゃうので後々困ったことになりそうです。
ReAct するなら、そもそもの情報の質と量を整えたり、また取得精度を上げる前処理が大事になりそう。っていう従来のQA ChatBot と同じような結論になってしまいました。現実感…