ChatGPT APIで「素人質問で恐縮ですが…」と鋭い質問してくるSlack Botを作った

本記事は、当社オウンドメディア「Doors」に移転しました。

約5秒後に自動的にリダイレクトします。

このたびブレインパッドは、LLM/Generative AIに関する研究プロジェクトを立ち上げ、この「Platinum Data Blog」を通じてLLM/Generative AIに関するさまざまな情報を発信をしています。
今回は、議論を活性化する質問をLLM技術によって生成できないかと考え、『この分野は素人なのですが…Bot』を開発した内容を、ご紹介します。


こんにちは、アナリティクスサービス部の藤田です。

ブレインパッドでは、有志による社内勉強会がとても活発で、ほぼ毎日何かしらの勉強会が開かれています。社内勉強会では、参加者による質問が重要な役割を果たします。質問によって、質問者は理解を深めることができ、他の参加者や発表者にとっても新しい視点を得ることができます。しかし、参加者が多い勉強会では少し質問しにくい空気があり、質問がないまま終わってしまうこともあります。 これは発表者にとっても参加者にとっても損失です。

そこで今回、議論を活性化する質問を生成することがLLM技術によって実現できるのではないかと考え『この分野は素人なのですが…Bot』を開発しました。

『この分野は素人なのですが…Bot』の概要

素人質問で恐縮ですが...Botの概要図
大まかなつくりとしては、Slackbotにメンションをつけて発表資料となるドキュメントのURLを送ると、内部で生成した質問をリプライで返してくれる、というツールになっています。

出力時間は15秒程度と少しかかりますが、ChatGPTに慣れている人であればそれほど苦にならないレベルです。

プロンプト構造

肝心のLLMとのやり取りの部分ですが、下記図の通り「前のステップの出力を次のステップの入力の一部とする」という処理を4段階連続させるやや複雑なつくりになっています。

4段階プロンプトの構造

①と③は入力文章の内容を踏まえる必要があるため記事の内容を入力していますが、②と④はあえて独立して動かしています。 なぜわざわざ複雑な4段階構造にしているかについては、後ほど詳しく説明します。

出力例

データガバナンスの概要をまとめた資料に対する質問

質問・解答例1
答えられるかは別として、気になる質問が並んでいる印象です。botだからこそ聞きづらい質問も遠慮なく聞けるという点もメリットになりそうです。

pytestの使い方をデータサイエンティスト向けに説明した資料に対する質問

質問・解答例2
追加情報をとにかく求めていますが聞き方がちょっと冷たいですね。他との優位性の質問は、ありがちですがいい質問です。

工夫した点 ~プロンプトを4段階に分ける意味

4段階に分けている点がこのbotの一番の工夫点です。分けた理由としては以下が挙げられます。

  1. タスクを細かく分けたほうが出力の精度が上がりやすい
  2. 発表資料には無い観点の質問をするため
  3. 最終的な出力形式を固定しやすい

1.タスクを細かく分けたほうが出力の精度が上がりやすい

一般的に、LLMに入力するプロンプトは回答までの道筋を段階的にすることで性能が上がると言われています。ここでは2つ例を紹介します。

有名なChatGPTのプロンプト術として、入力の最後に「ステップバイステップで考えてください」と付け加えるだけで出力の精度が上がるというテクニックがあります。これは、Zero-Shot CoTと呼ばれるテクニックで、「市場に行って10個のリンゴを買いました。隣人に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか?」のような段階的な思考が必要なタスクも回答の精度が上がるというものです。

さらにその発展形としてGPT-4登場以降に出てきたChatGPT/LLMに関する論文や技術の振り返りでも紹介されているPlan-and-Solveというテクニックがあります。これは、 1. タスク全体を小さなサブタスクに分割する計画を立てる 2. その計画に従ってサブタスクを実行する という2ステップを踏んで検討するように、指示をより明確化することで複数のタスクでZero-Shot CoTを上回ることが示されました。

紹介した2つの例はどちらも道筋そのものからLLMに考えさせるテクニックですが、今回は下記2つの理由からその道筋も固定したいと考え、明示的に4段階に分割しました。

2.発表資料には無い視点の質問をするため

最初はダイレクトに質問を生成するプロンプトを書いていましたが、そこには大きな問題がありました。それは、質問の内容が資料に書いてあることに制約されてしまうということです。これでは、質問によって新しい視点を提供し、議論を活性化させることができません。

その問題を解決するために、まず資料を①トピックレベルに抽象化し、②そのトピックに関する一般的な論点を列挙。③資料と照らし合わせて不足している論点を抽出する。ステップを踏みました。これによって、資料にはない視点からの質問が可能になりました。

3.最終的な出力形式を固定しやすい

LLMの出力をSlackに投稿する際はできるだけフォーマットを固定したいと考えています。output形式を指示することは可能ですが、指示が複雑であるほど、指示通りにならないことが増えます。

今回は、質問文に変換する部分だけを最後に切り出すことで、出力を安定させることができるようになりました。

現状の課題と展望

今回プロトタイプとして実装しましたが、たくさんの課題が残っています。

  • 芯を食った質問がまだ少ない
  • 素人質問で恐縮ですが…の真の意味(その分野のエキスパートですが)が反映されていない
  • 資料に書いてあることを質問することがたまにある
  • PPTなど社内Wiki以外の入力を受け付けられない
  • 「出力中…」みたいな表記も無く、15秒間回答を待たされるのが不安

これらの課題を解決しながら、社内の誰でも使える状態を作り、勉強会の活性化につなげたいと考えています。

まとめ

今回は、LLMを使った「鋭い質問で議論を活性化するSlack Botの開発」についてご紹介しました。

今回、実際にbotを作ってみたことで、これまでのプログラミングでは難しかったアイデアも、LLMをうまく使えば実現可能になることを体感しました。また、出力を安定させるためにはタスクを細かく切ったり、フォーマットを指定するなどプロンプトの工夫が非常に重要であることも身をもって理解できました。

この記事が、「LLMを使って何か作ってみたい」と思っている方の参考になれば幸いです。