見出し画像

ChatGPT時代の開発テクニック①: ChatGPTにエラーの原因を語らせよう

こんにちは、IVRyでAIエンジニアをやっているべいえりあです。今回は自分が最近使っているChatGPTのプロンプトの改善方法について書いてみようと思います。

皆さんはChatGPTのプロンプトをいじっていてなかなかChatGPTが言うことを聞いてくれないという事態に遭遇したことはないですか?本記事を読めば、そんな時にChatGPTに言うことを聞いてもらえるプロンプトが素早く見つけられるようになるんじゃないかと思います。


従来の機械学習・プロンプト開発について

具体的な手法について書く前に、普通の機械学習モデルやプロンプトの開発について軽くおさらいしておきたいと思います。機械学習モデルやプロンプトの開発は普通は以下のフローに従うと思っています。

機械学習、プロンプトの開発サイクル

一旦モデルやプロンプトを作成したら、それを適当な評価セットの上で評価し、どんなエラーのパターンがあるかを分析し、それらのエラーの原因を推測して解を実装する、というサイクルを繰り返してどんどんモデルやプロンプトを改善していく、というものです。

このエラー分析の部分も面白いトピックなのでそのうちブログ記事にしたいのですが、今回注目するのはエラー分析で典型的な予測エラーのパターンが見つかった際にどうプロンプトを修正するか?の部分です。

ここは今までは「予測エラーのパターンから割と当てずっぽうで原因を推測して、その原因を解決する」というのを上手くいくまで繰り返すものだったと思うのですが、運が良ければ一発で何とかなるものの、運が悪いと何度も上記のサイクルを繰り返さなければならないことになります。このトライアル&エラーを上手いことやりたいというのが本記事の主旨になります。

ChatGPTにエラーの理由を教えてもらう

エラー原因を推定するために今回やりたいこと、それはChatGPTにエラーの原因を教えてもらうということです。自分でいろいろ考えてもよく分からないので、予測を出した本人であるChatGPTにその理由を教えてもらおうという話です。

そのためにやることは簡単で、プロンプトに「あなたがその予測を行った理由を説明してください」という一文を追加するだけです。プロンプトによってはこの一文追加しても理由を説明してくれないこともあるのですが、大抵はやってくれると思います。

このChatGPTに理由を説明してもらうことの利点は二つあると思っていて、

  1. プロンプトを直すべき方向性が分かる

  2. ChatGPTに有効な言い回しキーワードが分かる

プロンプトを見てもエラーのパターンを見ても、どこを改善すれば良いかさっぱり分からないということは個人的には結構あるのですが、そんな時に何となくの方向を提示してくれるというのが1です。

また、ChatGPTは特定の言い回しをしたりキーワードを使わないと上手く認識してくれないことが(特にGPT-3.5では)あると思っており、ChatGPTと使う言語を統一することでChatGPTに言うことを聞いてもらいやすくなるというのが2です。

…とまあ、理屈ばかり語っていても分かりづらいと思うので、以下で具体例を見ていきます。

具体的なプロンプトの改善例

ここからは上記に紹介した手法で具体的にどのようにプロンプトを改善するかをやってみようと思います。

理由を説明させる手法は大体どんなタスクにも応用可能だと思うのですが、ここではAmazonなどのECサイトの商品のレビューがpositiveかnegativeかをゼロショットで分類することを考えます。ゼロショット分類は例えばScikit-LLMで実装されていて、今回使用するプロンプトもScikit-LLMのプロンプトを少し参考にしています。

プロンプトは、サービスに組み込むことを想定して例えばJSONで出力させようとすると以下のようなものが考えられます。

以下はある商品についてのAmazonレビューです。このレビューを書いた購入者が商品について持っている印象を判定してください。答えはJSONで、印象についてはJSONのlabelの値として出力してください。

印象の候補: positive, negative

レビューテキスト: ```(ここにテキストが入る)```
JSON:

一応、今回は全体の購買経験ではなく商品についての評価がpositiveかnegativeかを判定したい(タスクとしてはAspect-Based Sentiment Analysisなどと呼ばれています)として、その旨をプロンプトに入れています。

上記の通り、プロンプトの開発においてはこのプロンプトを何らかのデータセットの上に適用してエラー分析をし、その結果得られた誤分類のパターンを見てプロンプトを修正していくことになると思うのですが、例えばこんな誤分類が見つかったとします。

レビューテキスト: ```映画の内容自体はとても良かったです。ただ、配送に2週間以上かかりました。その間に何の連絡も無く出品者の常識を疑います。いい加減にしてほしい。```
JSON: {"label": "negative"}

このレビュー自体にはpositiveな部分とnegativeな部分があると思うのですが、今は商品の評価をしてほしいわけなので、これはpositiveに分類されるべき例となります。

これを見て多分皆さんが感じると思うのは、後半部分のnegativeな情報に引っ張られすぎてnegativeと判定してしまったんだろうということです。なので、プロンプトに一文注意書きを追加してみます。

以下はある商品についてのAmazonレビューです。このレビューを書いた購入者が商品について持っている印象を判定してください。答えはJSONで、印象についてはJSONのlabelの値として出力してください。

印象の候補: positive, negative

注: 全体の購買経験ではなく、購入者の商品への印象のみを評価してください。

このプロンプトを実際にChatGPTに与えてみたのですが、結果はnegativeのままでした。

このように当てずっぽうでいろいろ試していくというのが従来の手法だと思うのですが、大変なので何故これがnegativeと判定されたか、ChatGPTに説明させてみます。

以下はある商品についてのAmazonレビューです。このレビューを書いた購入者が商品について持っている印象を判定してください。答えはJSONで、印象についてはJSONのlabelの値として出力してください。 また、あなたがそのlabelを選んだ理由について説明してください。

印象の候補: positive, negative

注: 全体の購買経験ではなく、購入者の商品への印象のみを評価してください。

その結果、得られた出力がこちらです。

{"label": "negative"}
理由:
このレビューを書いた購入者は、商品自体に対する印象は「positive」であると述べていますが、配送に関する経験が非常に悪かったため、全体的な印象は「negative」です。配送に2週間以上かかり、出品者からの連絡がなかったことから、購入者は出品者のサービスに不満を抱いており、これが全体的な印象に悪影響を与えています。

どうやら、全体の購買経験を評価するなという指示が通っていないというのと、配送というキーワードが重要であることが分かりました。おそらくですが、プロンプトでの指示が曖昧過ぎたのだと思われます。

そこで、このChatGPTが用いている語彙に合わせて、プロンプトに明示的に「配送の評価を含めるな」というのを追加してみたところ、正しく分類されるようになりました。

以下はある商品についてのAmazonレビューです。このレビューを書いた購入者が商品について持っている印象を判定してください。答えはJSONで、印象についてはJSONのlabelの値として出力してください。

印象の候補: positive, negative

注: 購入者の商品に対する印象のみを評価してください。配送についての印象は含めないでください。

レビューテキスト: ```映画の内容自体はとても良かったです。ただ、配送に2週間以上かかりました。その間に何の連絡も無く出品者の常識を疑います。いい加減にしてほしい。```

JSON: { "label": "positive" }

もちろん、このプロンプトがこの例に過学習している可能性はあるので、実際にやる時はちゃんと他の例にも汎化するのか確認してくださいね。

最後に

IVRyではAIエンジニアを絶賛募集中です。

IVRyではChatGPTに代表されるLLMを使ったサービスを本番環境に出していますし、これからもLLMを使ってサービスを改善していく/LLMを使ったサービスがビジネスの肝となる予定なので、LLMを使ったサービスを極めたい方は是非応募してみてください!


この記事が気に入ったらサポートをしてみませんか?