Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Azure AI 自然言語理解:テキストから実用的なインサイトへ

By David SpenardFeb 6, 202511 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

写真:Elnur(Shutterstock)

はじめに

AIは今や、アプリケーション開発のあり方やビジネスの進め方を大きく変えつつあります。各社がAI活用を競うなか、Microsoft Azureは高度なAIサービスへのアクセスを広く開放するプラットフォームとして存在感を高めています。Azure AI Services(旧Cognitive Services)を使えば、アプリケーション開発者は機械学習の深い知識や大規模な計算リソースがなくても、自然言語理解や画像認識といった高度なAI機能を組み込めるようになります。

Azure AI Servicesでは数多くのAI機能が利用可能です。本記事ではAzure AI Language Serviceを取り上げ、情報抽出、テキスト分類、会話言語の理解、質問応答などをアプリケーションにスムーズに組み込む方法を紹介します。

前提条件

  1. Azureアカウント(お持ちでない場合は最大30日間無料で利用可能)
  2. AzureおよびAzureポータルの基本的な操作の理解
  3. サンプルのPythonコードを実行する場合、Pythonpipの基礎知識を推奨。サンプルコードのダウンロードにはGitHubへのアクセスが必要です。
  4. Dockerとアプリケーションのコンテナ化に関する知識があるとなお良いでしょう。

全体の流れ

  1. Azure AI Servicesへの権限とアクセスを確認する
  2. Language Service用のマネージドAPIエンドポイントを作成する
  3. PythonコードサンプルでAPIをテストする
  4. (任意)Dockerでローカルにホストし、APIをテストする
  5. リソースをクリーンアップする

ステップバイステップ・ガイド

ステップ1:AI Servicesへのアクセスを確認する初期設定

https://portal.azure.comでAzureポータルを開き、Microsoft Entra ID(旧Azure Active Directory)に移動して自分のユーザーアカウントを検索・選択し、Azureロールの割り当てを選びます。今回の演習では、サブスクリプションまたはリソースグループの単位でOwnerかContributorを割り当てるのが最もシンプルで、これから作成するAzureリソースに対する適切なアクセス権を確保できます。筆者の場合は、リソースグループを作成し、自分のユーザーにそのリソースグループのOwnerロールを付与しました。

Azureロールの割り当てについてはこちら、リソースグループをまだ用意していない方はその使い方の詳しい解説をこちらでご確認ください。

特定ユーザーへのAzureロールの割り当て

続いてAzureポータルでサブスクリプションに移動し、リソースプロバイダーを選択します。Microsoft.CognitiveServicesを見つけ、未登録の場合は登録を選択します。

この手順についてはAzure Resource Managerドキュメントのこちらで詳しく解説されています。

リソースプロバイダー

ステップ2:Language Service用のマネージドAPIエンドポイントを作成する

Azure AI Servicesは、APIを公開した形で提供されるマネージドサービスです。Azure AI service マルチサービスアカウントというオプションでは、複数のAIサービスに単一のエンドポイントからアクセスできますが、APIを公開するにはコンテナデプロイが必要です。そこで本記事では、言語関連の機能に特化した専用リソースで、セットアップも手軽なマネージドのLanguage Serviceを使います。

AzureポータルでAzure AI Servicesに移動し、Language Serviceを選択してCreate Languageをクリックします。

Azure AI service for Languageには、感情分析やキーフレーズ抽出など、すぐに使える機能がいくつも組み込まれており、本演習にはこれで十分です。Continue to create your resourceを選択しましょう。

Language Serviceリソースの作成

ウィザードを進めながら、以下の項目を設定します。

  • サブスクリプション:現在のサブスクリプションが既定で選択されます。
  • リソースグループ:既存のものを使うか、本演習用に新規作成します。
  • リージョン:既定はEast USです。
  • 名前:Language Serviceのドメイン名となる一意の名前を指定します。
  • 料金プラン:無料プランが表示されていればそれを選択します。
  • 責任あるAI利用に関するチェックボックスをオンにします。
  • ネットワーク:特定のネットワーク、IP範囲、プライベートエンドポイントへのアクセス制限を設定する場合を除き、すべてのネットワークを選択します。本記事では使いやすさを優先してパブリックアクセスを選んでいますが、長期運用には推奨されません。

なお、Azureポータルではエラーメッセージが実態と合致しないバグに遭遇したことがあります。同様のメッセージが出たときは、誤検知だと早合点せず、まず上記ステップ1のAI Servicesへのアクセス確認を済ませているかをチェックしてください。

ウィザードの最終ページで設定内容を確認し、作成を選択してリソースを作成します。

Language Service作成の確認画面

デプロイは数分で完了します。完了後、リソースに移動を選択して設定を確認しましょう。ここでLanguage Serviceの機能や設定をひと通り見渡せます。キーとエンドポイントを選択すると、次のステップ3でAPIにアクセスする際に使う2つの情報が表示されます。

キーが2つ用意されているのは、必要なときにスムーズにローテーションできるようにするためで、APIアクセスにはどちらのキーでも利用できます。Azureにおけるシークレット管理のベストプラクティスはこちらを参照してください。

Language Serviceのキーとエンドポイント

ステップ3:PythonコードサンプルでAPIをテストする

前提条件で触れたとおり、ローカルにPythonとpipがインストールされ、GitHubにアクセスできることを前提に、こちらのリポジトリのサンプルコードを、ZIPでダウンロードするかリポジトリをクローンして利用します。

git clone https://github.com/doitintl/azure-ai-services-demo.git

コードがローカルに用意できたら、.envファイルを編集し、上記ステップ3で取得したAPIキーとエンドポイントを設定します。本記事の執筆時点ではText Analytics version 3.1が現行でしたので、バージョンに関する不明点があればLanguage REST APIリファレンスを参照してください。

COGNITIVE_SERVICES_ENDPOINT=<your endpoint>
COGNITIVE_SERVICES_KEY=<your api key>
SENTIMENT_ANALYSIS_PATH=/text/analytics/v3.1/sentiment?
KEY_PHRASE_EXTRACTION_PATH=/text/analytics/v3.1/keyPhrases
LANGUAGE_DETECTION_PATH=/text/analytics/v3.1/languages?

コードを実行する前に、1つだけ依存ライブラリのインストールが必要です。インストールやPythonコードの実行で問題が発生した場合は、Pythonの仮想環境を使ってクリーンな状態でサンプルを動かすこともできます。仮想環境についてはこちらで解説されており、Pythonでの構築と利用は数ステップで完了します。

pip install python-dotenv

Language Serviceの機能のうち、感情分析キーフレーズ抽出言語検出を試せる3つのPythonファイルが用意されています。下記のいずれかのコマンドで対象のファイルを実行してください。

python sentiment_analysis.py
python key_phrase_extraction.py
python language_detection.py

コマンドラインで分析したいテキストを入力します。以下はキーフレーズ抽出の例です。

david@Mac azure-ai-services-demo % python key_phrase_extraction.py
Enter some text to extract its key phrases. Enter q to quit.

Language detection is one of the features offered by Azure AI Language,
a collection of machine learning and AI algorithms in the cloud for
developing intelligent applications that involve written language.
Language detection is able to detect more than 100 languages in their
primary script.

Request:
 {
  "documents": [\
    {\
      "id": 1,\
      "text": "Language detection is one of the features offered by\
Azure AI Language, a collection of machine learning and AI algorithms\
in the cloud for developing intelligent applications that involve written\
language. Language detection is able to detect more than 100 languages\
in their primary script."\
    }\
  ]
}

Response:
 {
  "documents": [\
    {\
      "id": "1",\
      "keyPhrases": [\
        "Azure AI Language",\
        "AI algorithms",\
        "Language detection",\
        "written language",\
        "machine learning",\
        "intelligent applications",\
        "primary script",\
        "features",\
        "collection",\
        "cloud",\
        "100 languages"\
      ],\
      "warnings": []\
    }\
  ],
  "errors": [],
  "modelVersion": "2022-10-01"
}

Key Phrases:
- Azure AI Language
- AI algorithms
- Language detection
- written language
- machine learning
- intelligent applications
- primary script
- features
- collection
- cloud
- 100 languages

CURLコマンドでAPIを試す場合の感情分析の例は次のとおりです。コマンド内のmy-endpointmy-keyはご自身の値に置き換えてください。

curl -X POST "https://my-endpoint/text/analytics/v3.1/sentiment" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: my-key" \
-d "{\"documents\":[{\"id\":\"1\",\"text\":\"The performance was amazing! The sound could have been clearer.\"},{\"id\":\"2\",\"text\":\"The food and service were unacceptable. While the host was nice, the waiter was rude and food was cold.\"}]}"
{
    "documents": [\
        {\
            "id": "1",\
            "sentiment": "mixed",\
            "confidenceScores": {\
                "positive": 0.5,\
                "neutral": 0.09,\
                "negative": 0.41\
            },\
            "sentences": [\
                {\
                    "sentiment": "positive",\
                    "confidenceScores": {\
                        "positive": 1.0,\
                        "neutral": 0.0,\
                        "negative": 0.0\
                    },\
                    "offset": 0,\
                    "length": 29,\
                    "text": "The performance was amazing! "\
                },\
                {\
                    "sentiment": "negative",\
                    "confidenceScores": {\
                        "positive": 0.0,\
                        "neutral": 0.17,\
                        "negative": 0.82\
                    },\
                    "offset": 29,\
                    "length": 34,\
                    "text": "The sound could have been clearer."\
                }\
            ],\
            "warnings": []\
        },\
        {\
            "id": "2",\
            "sentiment": "negative",\
            "confidenceScores": {\
                "positive": 0.0,\
                "neutral": 0.0,\
                "negative": 1.0\
            },\
            "sentences": [\
                {\
                    "sentiment": "negative",\
                    "confidenceScores": {\
                        "positive": 0.0,\
                        "neutral": 0.0,\
                        "negative": 1.0\
                    },\
                    "offset": 0,\
                    "length": 40,\
                    "text": "The food and service were unacceptable. "\
                },\
                {\
                    "sentiment": "negative",\
                    "confidenceScores": {\
                        "positive": 0.0,\
                        "neutral": 0.0,\
                        "negative": 1.0\
                    },\
                    "offset": 40,\
                    "length": 63,\
                    "text": "While the host was nice, the waiter was rude and food was cold."\
                }\
            ],\
            "warnings": []\
        }\
    ],
    "errors": [],
    "modelVersion": "2024-03-01"
}

ステップ4:DockerでAPIをホストする

こちらは任意の演習で、Dockerに慣れていてLanguage Service APIをDockerコンテナでホストしてみたい方向けです。セットアップは簡単で、このシナリオでは感情分析などLanguage Serviceの機能ごとにイメージが提供されています。

Dockerコンテナをローカルにデプロイします。コマンド内のmy-endpointmy-keyはご自身の値に置き換えてください。感情分析コンテナの設定と実行に関する詳細はこちらで確認できます。

docker run --rm -it -p 5000:5000 --memory 4g --cpus 1 mcr.microsoft.com/azure-cognitive-services/textanalytics/sentiment:latest Eula=accept Billing=https://my-endpoint ApiKey=my-key

ポート5000で問題が起きる場合は、別のポートを選んでください。macOSの場合、AirPlay Receiverがポート5000を使用していることがあり、システム設定 > 一般 > AirDropとHandoff > AirPlayレシーバーで無効化できます。

イメージのプルとコンテナのビルドが完了したら、http://localhost:5000/にアクセスして動作を確認できます。

ローカルで動作するDockerコンテナ

ステータスページはhttp://localhost:5000/status、エンドポイントの完全なドキュメントはhttp://localhost:5000/swaggerで確認できます。

ローカルDockerコンテナのステータスページ

続いて、Azure AI Servicesのマネージドサービスを試したときと同じ要領で、CURLコマンドでコンテナをテストします。違いはポートを指定する点と、ヘッダーにAPIキーを含めない点だけです。

 curl -X POST "http://localhost:5000/text/analytics/v3.1/sentiment" -H "Content-Type: application/json" --data-ascii "{'documents':[{'id':1,'text':'The performance was amazing! The sound could have been clearer.'},{'id':2,'text':'The food and service were unacceptable. While the host was nice, the waiter was rude and food was cold.'}]}"
{
    "documents": [\
        {\
            "id": "1",\
            "sentiment": "positive",\
            "confidenceScores": {\
                "positive": 0.99,\
                "neutral": 0.0,\
                "negative": 0.0\
            },\
            "sentences": [\
                {\
                    "sentiment": "positive",\
                    "confidenceScores": {\
                        "positive": 0.99,\
                        "neutral": 0.0,\
                        "negative": 0.0\
                    },\
                    "offset": 0,\
                    "length": 29,\
                    "text": "The performance was amazing! "\
                },\
                {\
                    "sentiment": "neutral",\
                    "confidenceScores": {\
                        "positive": 0.19,\
                        "neutral": 0.47,\
                        "negative": 0.34\
                    },\
                    "offset": 29,\
                    "length": 34,\
                    "text": "The sound could have been clearer."\
                }\
            ],\
            "warnings": []\
        },\
        {\
            "id": "2",\
            "sentiment": "negative",\
            "confidenceScores": {\
                            "positive": 0.0,\
                "neutral": 0.01,\
                "negative": 0.98\
            },\
            "sentences": [\
                {\
                    "sentiment": "negative",\
                    "confidenceScores": {\
                        "positive": 0.0,\
                        "neutral": 0.01,\
                        "negative": 0.99\
                    },\
                    "offset": 0,\
                    "length": 40,\
                    "text": "The food and service were unacceptable. "\
                },\
                {\
                    "sentiment": "negative",\
                    "confidenceScores": {\
                        "positive": 0.0,\
                        "neutral": 0.02,\
                        "negative": 0.98\
                    },\
                    "offset": 40,\
                    "length": 63,\
                    "text": "While the host was nice, the waiter was rude and food was cold."\
                }\
            ],\
            "warnings": []\
        }\
    ],
    "errors": [],
    "modelVersion": "2022-11-01"
}

コンテナをAzureにデプロイする

本記事の主題からは外れますが、Dockerでのホスティングを取り上げた流れで補足しておくと、Azureにはcloud-nativeなアプリケーションやコンテナ化アプリケーションを構築・デプロイするための選択肢が豊富に揃っています。スケーリング、コスト、高可用性、Azure AIのマネージドサービスを使わない運用方針など、要件に応じてAzure Container Instances、Azure Container Apps、Azure Kubernetes Serviceなどの選択肢が考えられます。これらをはじめとする選択肢の詳細はこちらで解説されています。

ステップ5:Azureリソースのクリーンアップ

本演習で作成したのはLanguage Serviceのみなので、クリーンアップは簡単です。本演習用にリソースグループを作成した場合、必要に応じて併せて削除しても構いません(リソースグループ自体はAzureリソースをまとめるための仕組みで、コストは発生しません)。

Azure AI Servicesに移動してLanguage Serviceを選択し、作成したサービスのチェックボックスをオンにしたうえで削除を選び、削除を実行してください。

Language Serviceの削除

Azure AI Language Serviceは、感情分析、キーフレーズ抽出、言語検出を活用してテキストから有意義なインサイトを引き出す力をビジネスにもたらします。本記事では、これらの機能をマネージドのAzure AI Servicesエンドポイント経由で、あるいはDockerやコンテナ化アプリケーションをデプロイできる任意の環境にセルフホストして、アプリケーションへ手軽に組み込めることを示しました。

キーポイント

なぜAzure AI Language Serviceなのか?

  • 使いやすさ:事前構築済みモデルとシンプルなAPIにより、機械学習の深い専門知識がなくても、高度な自然言語処理機能をスピーディーにアプリケーションへ組み込めます。
  • シームレスな統合:Azure AI Language Serviceは、Azure Machine LearningPower BIAzure Synapse Analyticsといった他のAzureツールとスムーズに連携し、エンドツーエンドのデータ分析・可視化を実現します。
  • コスト効率:従量課金とスケーラブルなインフラにより、使った分だけ支払うモデルなので、規模を問わずあらゆる組織が活用できます。
  • 柔軟性とスケーラビリティ:素早く統合するためのマネージドエンドポイントの利用も、より細かな制御を求めるコンテナでの運用も可能で、Azure AI Language Serviceは多様なビジネス要件に応えます。スケーラビリティにも優れ、小規模スタートアップから大企業まで、あらゆる規模のworkloadsを処理できます。
  • エンタープライズグレードのセキュリティ:Azureの堅牢なセキュリティとコンプライアンス機能により、データはあらゆる段階で保護されます。

活用例

  • 感情分析:顧客フィードバック、レビュー、SNS投稿に込められた感情を読み取ることで、改善ポイントの特定、顧客満足度の測定、顧客体験を高めるための戦略づくりに役立てられます。
  • キーフレーズ抽出:ドキュメント、メール、サポートチケットからキーフレーズを抽出することで、主要なトピック、傾向、課題を素早く把握できます。これにより、対応のスピードアップ、リソース配分の最適化、より的確な意思決定が可能になります。
  • 言語検出:テキストの言語を自動判別することで、多言語ワークフローの効率化、グローバル顧客とのコミュニケーション改善、コンテンツの適切なローカライズが実現します。

はじめましょう

コスト最適化からインフラ自動化、セキュリティ強化、クラウドアーキテクチャ設計まで、DoiT Internationalは幅広いクラウド領域で豊富な専門知識を提供しています。AI導入をはじめ、クラウドインフラのモダナイゼーションをDoiTがどのように支援できるかについては、こちらからお問い合わせください。クラウドエンジニアリングソリューションの詳細をご案内します。