Azure OpenAI Serviceを使用して文章を分類する ~GPTを用いた少数例つき&クラス説明付き分類編~

はじめに

ISID AITCに所属しております、阿田木です。   本記事では、下記の記事で紹介されている、4.少数例つき分類(Few-Shot Learning)と5.クラス説明付き分類(k-shot Learning with Class Explanation)をピックアップして解説を行います。

isid-ai.jp

具体的なタスクとしては、Azure OpenAIサービスを用いた、問い合わせメールの分類を行います。なお、タスクの詳細については元記事をご一読いただければ幸いです。

目的

本記事は以下のようにプロンプトの与え方を工夫(プロンプトエンジニアリング)した場合、GPTを使った分類精度にどれくらい影響があるのか確認します。

※ プロンプト:AIモデルに対する「入力文」もしくは「命令文」のこと

プロンプトエンジニアリングの工夫点

GPTによる文章分類において、プロンプトエンジニアリングを工夫しました。プロンプトエンジニアリングを文章分類に応用することで、与えられたテキストに基づいて、より適切なラベルを割り当てることができます。

  1. 分類すべきメールのクラスラベル説明付き分類(k-shot Learning with Class Explanation)
  2. 少数例つき分類(Few-Shot Learning)
  3. 一部のラベルに対するプロンプトエンジニアリング

なお、本実験では、GPT-3(text-davinci-003)のみ使用しています。

実験結果

前提として、ゼロショット分類(こちらの記事)の結果の最高精度32%をベースとします。評価指標はAccuracyです。

  1. 分類すべきメールのクラスラベル説明付き分類(k-shot Learning with Class Explanation)

    分類するカテゴリを明確にするため、各ラベルの説明を追加しました。 例えば、新聞記事に対する「スポーツ」というラベルに対して、「サッカーや野球などの競技に関する記事」という説明を付けることで、より正確な回答が期待できます。 これにより、GPTが正しいラベルに分類するためのヒントを与えることができます。

    ラベルの説明追加のパターンは以下の通りです。

    • パターン①:ヒトがネットで調べて追加した情報
    • パターン②:ChatCPTが出力した情報
    • パターン③:ChatCPTが出力した情報+ヒトが調べて追加した情報を基に整理

    プロンプトの例


    下記のようなプロンプトを用いて分類を行いました。

    以下の条件に従って、promptの文章がどのカテゴリに属するかをlabelに表示してください。
    カテゴリは下記の種類があります。
    <ラベル0>
    <ラベル1>
    <ラベル2>
    ...
    <ラベル0の説明>
    <ラベル1の説明>
    <ラベル2の説明>
    
    prompt:
    {text}
    
    label:
    

    <ラベルN>には実際のラベル名が、{text}には問い合わせメールの内容が入ります。
    一部省略していますが、今回は15クラス分類ですのでラベルが15個並ぶ形になります。

    ラベルの説明を追加した結果は以下の通りです。

    手法 評価精度
    パターン1 30%
    パターン2 35%
    パターン3 38%
  2. 少数例つき分類(Few-Shot Learning)

    次に、ラベル追加の結果、最も精度の良かったパターン3の手法に加え、少数例つき分類を適用しました。 少数例つき分類とは、わずかな量のラベル付きデータを用いて、タスクを学習する機械学習の手法です。 少数例つき分類により、学習に使用するデータが限られている場合でも、高い精度を実現することが期待されます。 今回は、プロンプトにデータとその正解ラベルの例をいくつか用意することにしました。

    プロンプトの例


    下記のようなプロンプトを用いて分類を行いました。

    以下の条件に従って、promptの文章がどのカテゴリに属するかをlabelに表示してください。
    カテゴリは下記の種類があります。
    <ラベル0>
    <ラベル1>
    <ラベル2>
    ...
    <ラベル0の説明>
    <ラベル1の説明>
    <ラベル2の説明>
    
    <ラベル0とそのtextの例>
    <ラベル1とそのtextの例>
    <ラベル2とそのtextの例>
    
    prompt:
    {text}
    
    label:
    

    少数例つき分類の結果は以下の通りです。 精度の高いラベルと低いラベルそれぞれで1例→2例にすることで、精度が向上しました。

    手法 評価精度
     1例  38%
     2例  40%
  3. 一部のラベルに対するプロンプトエンジニアリング

    さらに、上記の少数例つき分類の結果に加え、一部のラベルに対するプロンプトエンジニアリングを実施しました。 誤分類しているラベルを確認したところ、「その他」や「記載なし」などのあいまいなラベルとして予測されてしまっているものが多かったです。これは、不確実性の高いラベルには、もっともあいまいなラベルを割り当ててしまう傾向にあることが考えられます。 そこで、このような回答を生成するための情報がほとんどない「その他」等のあいまいなラベルに対しては、ラベル割合の明示や「できる限り予測しない」というプロンプトを追加しました。 これにより、より高い精度で分類することができるようになりました。

    パターンは以下の通りです。

    • パターン①:「その他」ラベルを「できる限り予測しない」というプロンプトを追加
    • パターン②:「その他」と「記載なし」ラベルを「できる限り予測しない」というプロンプトを追加
    • パターン③:パターン②に対して、「その他」ラベル説明部分を削除

    結果は以下の通りです。

    手法 評価精度
    パターン① 42%
    パターン② 48%
    パターン③ 50%

まとめ

本記事では、GPT-3を用いた少数例つき分類(Few-Shot Learning)とクラスラベル説明付き分類(k-shot Learning with Class Explanation)の結果をまとめました。 ラベルの説明や、少数例つきとして例を与えるほど精度が向上したことから、GPTに業務知識を与えることはある程度成功していそうです。 まだまだ精度改善の余地はありますが、GPT-3では、与えらえる語彙数に制限があるためこれ以上の情報を追加することはできませんでした。最近リリースされたGPT-4ではその点が改善されているため、さらに高い精度が期待されそうです。

ここまでお読みいただきありがとうございました。

執筆
AITC AI製品開発グループ
阿田木 勇八