10
5

More than 1 year has passed since last update.

Azure で ChatGPT × Cognitive Search を使ったエンタープライズサーチにフォローアップ質問を付ける

Last updated at Posted at 2023-06-09

はじめに

Azure OpenAI Service を中心としたパートナーコミュニティも活発になってきてうれしい限りです。様々なパートナー様が ChatGPT を使ったソリューションを立てつけてくれています。私としてはさらに Azure OpenAI Serivce を使っていただきたいということで、その 1 つの案として「フォローアップ質問」を追加することをおすすめしております。

フォローアップ質問とは

フォローアップ質問は、先に行われた質問や話題に対して、さらに詳細な情報や補足を求めるための質問です。通常、初めの質問や議論に基づいて、より深い理解を得るために使用されます。
001.png
Bing AI では上記の部分のことですね。

このフォローアップ質問をユーザーのさらに知りたい事、好奇心をくすぐるような事を先回りして候補を出せれば、まるで Wikipedia を一日中見てしまうような、より深い ChatGPT の会話体験に誘うことができるはずです。

エンタープライズサーチへの実装

すでに紹介した以下の UI ではフォローアップ質問の機能は用意されてはいますが、この部分を常に精度の高いフォローアップ質問が出るように改良します。

改良プロンプト例

chatreadretrieveread.py のメインプロンプト prompt_prefix を下記のように改良します。解説のため日本語で記述していますが、精度の問題により実際は英語で記述しています。

日本の鎌倉時代の歴史の読解問題を回答します。
SOURCES から問題の答えが推測できない場合は、「わかりません」と答えてください。
回答には、フォローアップ質問を3つ追加して答えてください。フォローアップ質問のルールは制約条件で定義します。
回答は日本語でお願いします。

# 制約条件
- SOURCES の接頭辞には、ファイル名の後にコロンと実際の情報があり、回答で使用する各事実には必ず出典名を記載してください。
- 出典を参照するには、四角いブラケットを使用します。例えば、[info1.txt]です。出典を組み合わせず、各出典を別々に記載すること。例えば、[info1.txt][info2.pdf] など。
- 日本の鎌倉時代の歴史に関する質問にのみ答えてください。鎌倉時代の歴史に関係ない場合は「わかりません」と答えてください。
- フォローアップ質問を参照するには、二重の角括弧を使用します(例:<<徳川家康とは何をした人ですか?>>)。
- フォローアップ質問はすでに聞かれたことや、過去に似たような内容を繰り返さないこと。
- フォローアップ質問は、ユーザーの好奇心を広げるアイデアであるべきです。

SOURCES:###
{sources}
###

EXAMPLE:###
Q:徳川家康はどのような人物ですか?
A:徳川家康は、日本の戦国時代から江戸時代初期にかけての武将、大名、政治家であり、江戸幕府を開いた人物です。彼は義を重んじ、家来のことを大切にした人物とされています。また、負けず嫌いで血気盛んだったが、臆病だが冷静に対処できる性格だったとされています。 [徳川家康-0.txt][徳川家康-1.txt][徳川家康-2.txt]<<徳川家康はどのような功績を残しましたか?>><<徳川家康はどのように江戸幕府を開いたのですか?>><<他にも有名な武将や大名はいますか?>>

Q:関ケ原の戦いはどのような戦いですか?
A:関ヶ原の戦いは、1600年10月21日に美濃国不破郡関ヶ原(岐阜県不破郡関ケ原町)で行われた野戦です。関ヶ原における決戦を中心に日本の全国各地で戦闘が行われ、関ヶ原の合戦・関ヶ原合戦とも呼ばれます。合戦当時は南北朝時代の古戦場・「青野原」や「青野カ原」と書かれた文献もある。主戦場となった関ヶ原古戦場跡は国指定の史跡となっています。豊臣秀吉が死んだ後の権力をめぐって石田三成が率いる西軍と、徳川家康が率いる東軍が戦いました。[徳川家康-1.txt][石田三成-2.txt]<<戦いの結果はどうなったのですか?>><<徳川家康と石田三成について教えてください>><<他にも有名な合戦がありますか?>>
###

"""

このプロンプトによって、<<徳川家康とは何をした人ですか?>> のようなフォローアップ質問が 3 つ出力されるので、これをフロントエンドでパースすれば OK です。

テスト

フォローアップ質問は本来「Developer settings」の「Suggest follow-up questions」を毎回 ON にしないと表示されませんが、デフォルトで表示されるようにフロントエンドを修正しました。
003.png
はい、一発目の質問からちゃんとフォローアップ質問が生成されましたね。では、「三浦義澄はどのような戦いに参加したのですか?」をクリックしてみましょう。
004.png

このような形で、どんどん深堀したり横に広げていくことができそうです。ユーザーの質問だけでなく、Azure Cognitive Search の検索結果の中の情報もコンテキストとしてフォローアップ質問を生成するところが重要です。

ただ、例にあるプロンプトでは質問がループしてしまうケースが出てきてしまうので、さらにプロンプトや temperature パラメータ等を改良する余地があります。

セレンディピティを高めるプロンプト例

- フォローアップ質問は、ユーザーの好奇心を広げるアイデアであるべきです。

006.png

COOL!

007.png

やるやん。嘘もついてないです。

008.png

話題を広げすぎてしまって、ソースにはない回答を生成してしまいました。。。まだ改善の余地はあります。少なくとも出典のチェックとして、Azure Cognitive Search の検索結果のファイル名の存在チェックは行うべきかと思います。

フォローアップ質問の利用例

フォローアップ質問はカスタマイズによって様々なシーンで利用できます。

  • 詳細を求める
    初めの質問の回答が不明確だったり、十分な情報を提供していなかった場合に、さらなる説明や具体的な例を求める
  • 対話の整理
    長く続いた対話から重要なポイントを整理する
  • タスク解決のためのフォローアップ質問
    ReAct などでタスクを解決するのに必要な内容を補完する
  • パーソナライズ
    ユーザーの興味テーブルのようなものと連携して、ユーザーごとにパーソナライズされたフォローアップ質問を生成

サンプルコード

Chat Completion API のバージョン 2023-05-15 が GA となったので、古い Completion API から書き直していますが、あくまで動作確認用です。

すでにコチラで環境構築された方は、.azure の追加だけで起動できますし、app.py にある環境変数をセットして実行するだけです。

おわりに

面白いアイデア、どんどん実装していきましょう!

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5