🤖

Google Cloud で生成 AI アプリケーションを作ろう!パート 3:PaLM API の利用例 2 〜 メールを分類する

2023/08/16に公開

はじめに

今回は、Google Cloud のサービスを用いて、テキスト分類を実施します。

Google Cloud には、大規模言語モデル(LLM)以外にもテキスト分類に利用できる便利なサービスがあります。そこで、それらの概要を紹介した後に、メインテーマとなる大規模言語モデルを用いたテキスト分類の実行方法を説明します。

大規模言語モデルによるテキスト分類では、プロンプトにいくつかのサンプルを与える Few-shot プロンプティングと呼ばれるテクニックが有効ですが、この後で見るように、Generative AI Studio のコンソールには、これを支援する機能も用意されています。

テキスト分類とは?

テキスト分類では、テキストに書かれた内容を理解した上で、事前に用意したいくつかのカテゴリーのどれに当てはまるかを決定します。例えば、happy、neutral、sad の 3 つのカテゴリーに分類するのであれば、テキストに書かれた内容から「感情」を読み取る必要があります。

業務アプリケーションに利用する場合、一例として、次のようなユースケースが考えられます。

  • 顧客レビューの整理
    フリーテキストで記述されたレビュー文書をポジティブな内容とネガティブな内容に分類してカウントすることで、総合的な満足度をすばやく把握します。Natural Language API を用いれば、特定のトピックに触れたレビューを抽出することもできます。暴力的な内容など、不適切な内容のテキストを自動判別して、評価担当者の目に触れないようにフィルタリングするなども考えられます。

  • サポート業務の支援
    カスタマーサポートに送付された問い合わせメールについて、問い合わせ内容をカテゴリーに分けて、適切な担当部署に対応を依頼します。メールの文面から感情を読み取って、感情に応じて対応の優先順位を調整するなどの工夫も考えられます。音声で受け取った内容を Speech-to-Text でテキストに変換して処理することも可能です。

テキスト分類に利用できるサービス

ここでは、大規模言語モデル以外のテキスト分類に利用できるサービスとして、次の 3 つのサービスを紹介します。

Natural Language API

Natural Language API は、Google Cloud が提供する事前学習済みモデルを利用して、テキスト文書から情報を引き出す API です。次のような機能が提供されています。

  • 感情分析 : テキストの背後にある感情を分析して、-1 〜 +1 のスコアを出力します。スコアがマイナスであれば否定的、プラスであれば肯定的な感情を表します。

  • エンティティ分析 : テキストに含まれる既知のエンティティ(著名人、ランドマークなどの固有名詞、料理名などの一般名詞)を検出します。企業名などは、Google 検索のナレッジグラフの情報を利用することで、正式名称以外の一般的な呼び方にも対応します。

  • エンティティ感情分析 : エンティティ分析と感情分析を組み合わせたもので、検出されたエンティティに付随する感情を検出します。「このお寿司とっても美味しい!エビはイマイチだけどね。」という文章であれば、「お寿司」と「エビ」の 2 つのエンティティに対して、それぞれ、プラスとマイナスのスコアを出力します。

  • 構文解析 : テキストデータの文法構造を解析する機能です。例えば、「赤い魚をくわえた猫」といったテキストでは、「赤い」という形容詞は、「魚」という名詞を修飾しているものと自然に理解できますが、このような係り受け構造が図のように分析できます。

  • 不適切なコンテンツの検出 : 暴力的な内容など、不適切なコンテンツを検出します。

  • コンテンツ分類 : 事前に定義された 100 種類以上のカテゴリーに分類します。詳細なカテゴリの一覧はこちらから参照できます。コンテンツ分類の機能では、大規模言語モデルが使用されています。

Natural Language API の機能は、デモページで簡単に試すことができます。その他には、ヘルスケア領域に特化した Healthcare Natural Language API もあります。

Vertex AI AutoML

Natural Language API は、事前学習済みのモデルを利用するので簡単に利用できますが、コンテンツ分類では事前に定義された一般的なカテゴリーのみが使用できます。自社製品の分類など、独自のカテゴリーには対応できません。

このような場合は、Vertex AI AutoML を利用すると、独自のデータでモデルを学習できます。Vertex AI AutoML では、学習データに応じた適切なモデルを自動構築するので、機械学習の専門的な知識がなくても利用できます。数値データ、画像、動画、テキストなどさまざまなデータ形式に対応しており、テキストデータに対するカテゴリー分類にも対応します。

Document AI

Document AI は、OCR 技術をベースにして、請求書など、定型フォーマットのドキュメントに含まれた情報を構造化データとして取り出します。定型フォーマットのドキュメントでは、「一番上のテキストは店名を表す」など、ドキュメントに固有の意味づけがなされることもあります。Document AI は、このようなテキストの位置も加味した上で情報を取り出すことができます。

PDF ファイルを直接入力することもできて、次のような一連の処理を実施します。

  • ドキュメントの画像品質を検出して、傾きを補正する前処理
  • ドキュメントからテキストとレイアウト情報を抽出
  • 構造化フォーム内のキーワードペアを識別
  • ドキュメントをタイプごとに分割および分類
  • エンティティを抽出および正規化
  • ドキュメントをラベル付け
  • 得られたメタデータをデータベース化して、保存、検索、整理、管理、分析

最後のメタデータによる検索は、次のような使い方ができます。例えば、下記の画像を読み込ませると、「アメリカの運転免許証」とカテゴリ分けして、この情報を自動保存します。その後、「アメリカの運転免許証」で検索すると、同様の画像をまとめて引き出せます。抽出した名前や発行年月もメタデータ化されるので、これらで検索することもできます。

Document AI では、様々な種類の書類をフォーマットごとに分類できます。独自のフォーマットを学習させることも可能です。

大規模言語モデル(LLM)によるカテゴリー分類

ここまで、大規模言語モデル以外のサービスを紹介してきましたが、ここからは、大規模言語モデルを用いたカテゴリー分類の方法を説明します。大規模言語モデルを用いると、次のようなユースケースに対応できます。

  • カテゴリーを事前に列挙できない場合
    例えば、古典文学のテキストを作者ごとに分類する場合、すべての作者を事前に列挙して定義するのは大変です。言語モデルに作者を予測するように依頼すれば、このようなユースケースにも対応できます。

  • 付随情報を加味して分類する場合
    例えば、「この映画はやばかった。」というコメントでは、これを書いた人の世代によって、ポジティブな評価かどうかの判断が変わる可能性があります。このような場合、テキストを書いた人のプロフィール情報を加味して分類するように言語モデルに依頼する方法が考えられます。

ここではまず、Generative AI Studio の GUI コンソールからカテゴリー分類を試します。事前に定義したカテゴリーに分類する基本的な例として、金融機関に送られてきた問い合わせメッセージから、問い合わせ内容のカテゴリーを検出する例を示します。本記事の執筆時点では、まだ日本語テキストの取り扱いに対応していないため、英語のテキストでの例になります。

パート 1 : 生成 AI ソリューションを使うための基本的なセットアップ」の手順を参考にして、Google Cloud のプロジェクトを作成したら、クラウドコンソールのナビゲーションメニューから[Vertex AI]-[GENERATIVE AI STUDIO]-[言語]を選択します。

次の画面が表示されるので、[テキスト プロンプト]をクリックします。

次のプロンプト入力画面が表示されるので、ここにテキストを入力して、[送信]をクリックすると、言語モデルからの応答が表示されます。ここではさらに、右上の「構造化」ボタンをクリックします。

すると、Few-Shot プロンプティングに特化した対話コンソール画面が開きます。Few-Shot プロンプティングとは、問題と回答の例をプロンプトに追加することで、回答のトーンや回答の形式を調整するテクニックです。適切な例を与えることで回答の精度を向上することもできます。

まず、下図の「Context」の部分に言語モデルに対する指示を入力します。

ここでは、次の内容を入力します。

Multi-choice problem: Define the category of the ticket?
Categories:
- Credit card
- Bank account services
- Loans and Mortgages

これは、問い合わせチケットを「Credit card(クレジットカード)」、「Bank account services(銀行口座サービス)」、「Loans and Mortgages(融資と住宅ローン)」の 3 種類に分類するように指示しています。「Multi-choice problem」なので、複数のカテゴリーを回答しても構いません。

その下の「Examples」の「入力」と「出力」に数個の例を与えます。ここでは、次の内容を入力します。それぞれのカテゴリーについて、1 つずつの例を与えています。

入力 出力
I lost my credit card numbered 12345. Can you help with deactivating the card? Credit card
I would like to change the address associated with my account. I have been calling the bank multiple times but couldn't get through. Please help me. Bank account services
I appreciate it if you could help me put a stop to the cardmember services. I wrote to the bank asking for debt verification and what they sent me a statement which is not acceptable. I am asking the bank to validate the debt, instead I been receiving mail every month from them attempting to collect a debt. Loans and Mortgages

そして、「Test」の「入力を記述します」という部分に分類したい次のテキストを入力します。

My grand son give me check for I deposit it into my account. After fund clear bank closed my account and never paid me my money. They said they need to speak with my grand son.

画面の右下にある[送信]をクリックすると、「モデルの応答がここに表示されます」という部分に、「Bank account services(銀行口座サービス)」という結果が表示されます。

簡単な例ですので、これだけで正しい結果が得られました。より複雑な分類処理の場合は、さらに多数の適切な例を追加してチューニングしていくことになります。

それでは、これと同じ処理を Python のコードから実行するにはどうすればよいのでしょうか? 画面の右上にある[コードを表示]をクリックすると、対応するコードが確認できます。言語モデルに送信するプロンプトの内容を確認すると、次のような構造になっていることがわかります。

prompt = """
Multi-choice problem: Define the category of the ticket?
Categories:
- Credit card
- Bank account services
- Loans and Mortgages

Here are few examples.

input: [入力例1]
output: [出力例1]

input: [入力例2]
output: [出力例2]

input: [入力3]
output: [出力例3]

input: [分類したいテキスト]
output: 
"""

パート 2 : PaLM API の利用例 1 〜 英文を日本語に要約して理解する」の記事では、Python SDKを用いて、Python のコードから言語モデルを呼び出す例を紹介しました。同じ方法で、上記の構造のプロントを用いたコードを実装してみてください。

まとめ

今回は、Google Cloud のサービスを利用して、テキストの分類処理を行う例を紹介しました。テキスト分類では、大規模言語モデル(LLM)を直接利用する以外に、既存のサービスも活用できることをぜひ知っておいてください。サービスごとの特徴がありますので、ユースケースに応じて、最適なサービスを選ぶことが大切になります。

Google Cloud Japan

Discussion