クイックスタート: 質問応答

カスタム質問応答クライアント ライブラリを使用してみましょう。 以下の手順に従って、パッケージをインストールし、基本タスクのコード例を試してみましょう。

FAQ や製品マニュアルなど、独自のコンテンツから質問と回答プロジェクトを作成できます。 この記事には、製品マニュアルから、質問に回答する質問と回答プロジェクトを作成する例が含まれています。

前提条件

  • Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • カスタム質問と回答機能が有効になった言語リソース。 リソースを作成したときに選択した Azure Active Directory ID、サブスクリプション、言語リソース名を覚えておいてください。

最初の質問と回答プロジェクトを作成する

  1. Azure 資格情報を使用して Language Studio にサインインします。

  2. [Answer questions](質問に回答する) セクションまで下にスクロールし、 [Open custom question answering](カスタム質問と回答を開く) を選択します。

    Open custom question answering

  3. リソースがまだ Azure Search に接続されていない場合は、 [Connect to Azure Search](Azure Search に接続する) を選択します。 これにより、新しいブラウザー タブが開き、Azure portal 内のリソースの [機能] ペインが表示されます。

    Connect to Azure Search

  4. [Enable custom question answering](カスタム質問と回答を有効にする) を選択し、リンク先の Azure Search リソースを選択して、 [適用] を選択します。

    Enable custom question answering

  5. Language Studio タブに戻ります。リソースへの変更を登録するには、このページを最新の情報に更新する必要がある場合があります。 [新しいプロジェクトの作成] を選択します。

  6. [I want to set the language for all projects created in this resource](このリソースで作成されたすべてのプロジェクトにこの言語を設定する)> オプションを選択し、[英語]> を選択し、[次へ] を選択します。

  7. プロジェクト名には「Sample-project」、説明には「My first question answering project」(最初の質問と回答プロジェクト) と入力し、既定の回答は、 [No answer found](答えが見つかりません) のままにしておきます。

  8. 選択内容を確認し、 [Create project](プロジェクトの作成) を選択します。

  9. [Manage sources](ソースの管理) ページから、 [Add source](ソースの追加)>[URL] を選択します。

  10. [Add url](URL の追加) を選択し、次の値を入力し、 [Add all](すべて追加) を選択します。

    URL の名前 URL の値
    Surface Book ユーザー ガイド https://download.microsoft.com/download/7/B/1/7B10C82E-F520-4080-8516-5CF0D803EEE0/surface-book-user-guide-EN.pdf

    抽出プロセスでは、ドキュメントを読み取って質問と回答を識別します。これにはしばらくかかります。

    ソースを正常に追加したら、ソース コンテンツを編集して、カスタム質問と回答セットを追加できます。

プロジェクトをテストする

  1. ソースへのリンクを選択すると、ナレッジ ベースの編集ページが開きます。

  2. メニュー バーから [テスト] を選択 >「How do I setup my surface book?」 (Surface Book を設定するにはどうすればいいですか?) という質問を入力します。 ソース URL から自動的に識別されて抽出された質問と回答のペアに基づいて、回答が生成されます。

    Test question chat interface

    [include short answer response](短い回答を含める) チェック ボックスをオンにすると、質問をしたときにテスト ペインに回答パッセージと共に、正確な回答も表示されます (ある場合)。

  3. [検査] を選択し、詳細に応答を確認します。 [テスト] ウィンドウは、プロジェクトをデプロイする前にプロジェクトに対する変更をテストするために使用されます。

    See the confidence interval

    [Inspect](検査) インターフェイスから、この応答が質問に回答する信頼レベルを確認し、特定の質問と回答の応答ペアを直接編集できます。

プロジェクトのデプロイ

  1. ナレッジ ベースのデプロイ アイコンを選択して、ナレッジ ベースのデプロイ メニューを入力します。

    Deploy knowledge base

    プロジェクトをデプロイすると、プロジェクトのコンテンツが test インデックスから Azure Search の prod インデックスに移動します。

  2. [デプロイ] を選択し、> プロンプトが表示されたら、もう一度 [デプロイ] を選択します。

    Successful deployment

    これで、プロジェクトが正常にデプロイされました。 エンドポイントを使用して、独自のカスタム アプリケーションで質問に回答したり、ボットで回答したりできます。

前提条件

  • 最新バージョンの cURL。 クイックスタートでは、いくつかのコマンド ライン スイッチが使用されています。これらのスイッチについては、cURL のドキュメントを参照してください。
  • Azure サブスクリプション - 無料アカウントを作成します
  • 質問応答の API キーとエンドポイントを生成するには、カスタム質問応答機能を有効にした言語リソースが必要です。
    • 言語リソースがデプロイされたら、 [リソースに移動] を選びます。 API に接続するには、作成したリソースのキーとエンドポイントが必要です。 このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。
  • Azure CLI を使って言語リソースを作成するには、リソースの作成時に次の追加プロパティを指定して、言語リソース --api-properties qnaAzureSearchEndpointId=/subscriptions/<azure-subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Search/searchServices/<azure-search-service-name> qnaAzureSearchEndpointKey=<azure-search-service-auth-key> でカスタム質問と回答を構成します
  • クエリを実行する既存のナレッジ ベース。 ナレッジ ベースをまだ設定していない場合は、Language Studio のクイックスタートに関するページに記載されている手順に従ってください。 または、この Surface ユーザー ガイド URL をデータ ソース として使用するナレッジ ベースを追加します。

ナレッジ ベースにクエリを実行する

ナレッジ ベースから回答を生成する

REST API と cURL を使用して、質問応答プロジェクト/ナレッジ ベースに対してクエリを実行するには、次の情報が必要です。

変数名
Endpoint この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 エンドポイントの例: https://southcentralus.api.cognitive.microsoft.com/
API-Key この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 Key1 または Key2 を使用できます。 常に 2 つの有効なキーを持つことで、ダウンタイムなしで安全にキーのローテーションを行うことができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 キー値は、サンプル要求の一部です。
Project 質問応答プロジェクトの名前。
Deployment 使用可能な値は test および production です。 production は、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする] からナレッジ ベースをデプロイしていることに依存します。

cURL コマンドは、BASH シェルから実行します。 コマンドは、実際のリソース名、リソース キー、JSON の値、JSON のサイズに合わせて編集してください。

curl -X POST -H "Ocp-Apim-Subscription-Key: {YOUR_API_KEY}" -H "Content-Type: application/json" -d '{
  "question": "How much battery life do I have left?"
  }'  'https://{YOUR_ENDPOINT}.api.cognitive.microsoft.com/language/:query-knowledgebases?projectName={YOUR_PROJECT_NAME}&api-version=2021-10-01&deploymentName={DEPLOYMENT_NAME}'

上記のコードを実行すると、前提条件のデータ ソースを使用している場合は、次のような回答が表示されます。

{
"answers": [
    {
      "questions": [
        "Check battery level"
      ],
      "answer": "If you want to see how much battery you have left, go to **Start  **> **Settings  **> **Devices  **> **Bluetooth & other devices  **, then find your pen. The current battery level will appear under the battery icon.",
      "confidenceScore": 0.9185,
      "id": 101,
      "source": "https://support.microsoft.com/en-us/surface/how-to-use-your-surface-pen-8a403519-cd1f-15b2-c9df-faa5aa924e98",
      "metadata": {},
      "dialog": {
        "isContextOnly": false,
        "prompts": []
      }
    }
  ]
}

confidenceScore によって 0 から 1 の間の値が返されます。 これはパーセンテージのように考えることができるため、100 を掛けます。つまり、信頼度スコアが 0.9185 の場合、これがナレッジ ベースに基づいた、質問に対する正しい答えであることを質問応答は 91.85% 確信していることを意味します。

信頼度スコアが特定のしきい値を下回る回答を除外したい場合は、confidenceScoreThreshold パラメーターを追加します。

curl -X POST -H "Ocp-Apim-Subscription-Key: {YOUR_API_KEY}" -H "Content-Type: application/json" -d '{
  "question": "How much battery life do I have left?",
  "confidenceScoreThreshold": "0.95",
  }'  'https://{YOUR_ENDPOINT}.api.cognitive.microsoft.com//language/:query-knowledgebases?projectName=Sample-project&api-version=2021-10-01&deploymentName={DEPLOYMENT_NAME}'

前回のコードの実行から、信頼度スコアが .9185 であることが分かっているため、しきい値を .95 に設定すると、既定の回答が返されます。

{
  "answers": [
    {
      "questions": [],
      "answer": "No good match found in KB",
      "confidenceScore": 0.0,
      "id": -1,
      "metadata": {}
    }
  ]
}

ナレッジ ベースを使用せずにテキストに対してクエリを実行する

query-text 経由で呼び出される事前構築済みの質問応答 REST API を使用して、ナレッジ ベースなしで質問応答を使用することもできます。 この場合、質問を送信する際に、質問と、回答の検索先となる関連テキスト レコードの両方を質問応答に提供します。

この例の場合は、API KEYENDPOINT の変数だけを変更する必要があります。

curl -X POST -H "Ocp-Apim-Subscription-Key: {YOUR_API_KEY}" -H "Content-Type: application/json" -d '{
"question":"How long does it takes to charge a surface?",
"records":[
{"id":"doc1","text":"Power and charging.It takes two to four hours to charge the Surface Pro 4 battery fully from an empty state. It can take longer if you\u0027re using your Surface for power-intensive activities like gaming or video streaming while you\u0027re charging it"},
{"id":"doc2","text":"You can use the USB port on your Surface Pro 4 power supply to charge other devices, like a phone, while your Surface charges. The USB port on the power supply is only for charging, not for data transfer. If you want to use a USB device, plug it into the USB port on your Surface."}],
"language":"en",
"stringIndexType":"Utf16CodeUnit"
}'  'https://{YOUR_ENDPOINT}.api.cognitive.microsoft.com/language/:query-text?&api-version=2021-10-01'

この例では、次のような結果が返されます。

{  
"answers": [
    {
      "answer": "Power and charging.It takes two to four hours to charge the Surface Pro 4 battery fully from an empty state. It can take longer if you're using your Surface for power-intensive activities like gaming or video streaming while you're charging it",
      "confidenceScore": 0.9118788838386536,
      "id": "doc1",
      "answerSpan": {
        "text": "two to four hours",
        "confidenceScore": 0.9850527,
        "offset": 27,
        "length": 18
      },
      "offset": 0,
      "length": 243
    },
    {
      "answer": "It can take longer if you're using your Surface for power-intensive activities like gaming or video streaming while you're charging it",
      "confidenceScore": 0.052793052047491074,
      "id": "doc1",
      "answerSpan": {
        "text": "longer",
        "confidenceScore": 0.6694634,
        "offset": 11,
        "length": 7
      },
      "offset": 109,
      "length": 134
    },
    {
      "answer": "You can use the USB port on your Surface Pro 4 power supply to charge other devices, like a phone, while your Surface charges. The USB port on the power supply is only for charging, not for data transfer. If you want to use a USB device, plug it into the USB port on your Surface.",
      "confidenceScore": 0.017600709572434425,
      "id": "doc2",
      "answerSpan": {
        "text": "USB port on your Surface Pro 4 power supply to charge other devices, like a phone, while your Surface charges. The USB port on the power supply is only for charging",
        "confidenceScore": 0.1544854,
        "offset": 15,
        "length": 165
      },
      "offset": 0,
      "length": 280
    }
  ]
}

このクイックスタートは、以下を行う .NET 用の質問応答クライアント ライブラリに使用します。

  • ナレッジ ベースから回答を取得する。
  • 質問と共に送信したテキストの本文から回答を取得する。
  • 質問に対する回答の信頼度スコアを取得する。

API のリファレンスのドキュメント|ソース コード | パッケージ (NuGet) | サンプル |

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • Visual Studio IDE または現在のバージョンの .NET Core
  • 質問応答の API キーとエンドポイントを生成するには、カスタム質問応答機能を有効にした言語リソースが必要です。
    • 言語リソースがデプロイされたら、 [リソースに移動] を選びます。 API に接続するには、作成したリソースのキーとエンドポイントが必要です。 このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。
  • Azure CLI を使って言語リソースを作成するには、リソースの作成時に次の追加プロパティを指定して、言語リソース --api-properties qnaAzureSearchEndpointId=/subscriptions/<azure-subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Search/searchServices/<azure-search-service-name> qnaAzureSearchEndpointKey=<azure-search-service-auth-key> でカスタム質問と回答を構成します
  • クエリを実行する既存のナレッジ ベース。 ナレッジ ベースをまだ設定していない場合は、Language Studio のクイックスタートに関するページに記載されている手順に従ってください。 または、この Surface ユーザー ガイド URL をデータ ソース として使用するナレッジ ベースを追加します。

設定

CLI

コンソール ウィンドウ (cmd、PowerShell、Bash など) で、dotnet new コマンドを使用し、question-answering-quickstart という名前で新しいコンソール アプリを作成します。 このコマンドにより、1 つのソース ファイル (program.cs) を使用する単純な "Hello World" C# プロジェクトが作成されます。

dotnet new console -n question-answering-quickstart

新しく作成されたアプリ フォルダーにディレクトリを変更します。 次を使用してアプリケーションをビルドできます。

dotnet build

ビルドの出力に警告やエラーが含まれないようにする必要があります。

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

次のコマンドを使用して、アプリケーション ディレクトリ内に .NET 用カスタム質問応答クライアント ライブラリをインストールします。

dotnet add package Azure.AI.Language.QuestionAnswering

ナレッジ ベースにクエリを実行する

ナレッジ ベースから回答を生成する

以下の例では、GetAnswers を使ってナレッジ ベースに対してクエリを実行し、質問に対する回答を得ることができます。

以下の変数を実際の値に変更して、以下のコードを更新する必要があります。

変数名
endpoint この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 エンドポイントの例: https://southcentralus.api.cognitive.microsoft.com/
credential この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 Key1 または Key2 を使用できます。 常に 2 つの有効なキーを持つことで、ダウンタイムなしで安全にキーのローテーションを行うことができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 キー値は、サンプル要求の一部です。
projectName 質問応答プロジェクトの名前。
deploymentName 使用可能な値は test および production です。 production は、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする] からナレッジ ベースをデプロイしていることに依存します。

プロジェクト ディレクトリから program.cs ファイルを開いて、以下のコードに置き換えます。

using Azure;
using Azure.AI.Language.QuestionAnswering;
using System;

namespace question_answering
{
    class Program
    {
        static void Main(string[] args)
        {

            Uri endpoint = new Uri("https://{YOUR-ENDPOINT}.api.cognitive.microsoft.com/");
            AzureKeyCredential credential = new AzureKeyCredential("{YOUR-LANGUAGE-RESOURCE-KEY}");
            string projectName = "{YOUR-PROJECT-NAME}";
            string deploymentName = "production";

            string question = "How long should my Surface battery last?";

            QuestionAnsweringClient client = new QuestionAnsweringClient(endpoint, credential);
            QuestionAnsweringProject project = new QuestionAnsweringProject(projectName, deploymentName);

            Response<AnswersResult> response = client.GetAnswers(question, project);

            foreach (KnowledgeBaseAnswer answer in response.Value.Answers)
            {
                Console.WriteLine($"Q:{question}");
                Console.WriteLine($"A:{answer.Answer}");
            }
        }
    }
}

この例では変数をハード コーディングしています。 運用環境では、資格情報を安全に格納して利用するための方法を用いることを検討してください。 たとえば、Azure Key Vault で安全なキー記憶域を確保できます。

上記のコードを使用して Program.cs を更新し、正しい変数値で置き換えます。 自分のアプリケーション ディレクトリで dotnet run コマンドを使用してアプリケーションを実行します。

dotnet run

応答は次のようになります。

Q: How much battery life do I have left?
A: If you want to see how much battery you have left, go to **Start  **> **Settings  **> **Devices  **> **Bluetooth & other devices  **, then find your pen. The current battery level will appear under the battery icon.

この回答の精度に関する質問応答による信頼度については、既存の print ステートメントの下に print ステートメントを追加します。

Console.WriteLine($"Q:{question}");
Console.WriteLine($"A:{answer.Answer}");
Console.WriteLine($"({answer.Confidence})"); // add this line

dotnet run を再度実行すると、信頼度スコアを含む結果が返されます。

Q:How much battery life do I have left?
A:If you want to see how much battery you have left, go to **Start  **> **Settings  **> **Devices  **> **Bluetooth & other devices  **, then find your pen. The current battery level will appear under the battery icon.
(0.9185)

信頼度スコアは、0 から 1 の値で返されます。 これはパーセンテージのように考えることができるため、100 を掛けます。つまり、信頼度スコアが 0.9185 の場合、これがナレッジ ベースに基づいた、質問に対する正しい答えであることを質問応答は 91.85% 確信していることを意味します。

信頼度スコアが特定のしきい値を下回る回答を除外したい場合は、AnswerOptions を使用して ConfidenceScoreThreshold プロパティを追加します。

QuestionAnsweringClient client = new QuestionAnsweringClient(endpoint, credential);
QuestionAnsweringProject project = new QuestionAnsweringProject(projectName, deploymentName);
AnswersOptions options = new AnswersOptions(); //Add this line
options.ConfidenceThreshold = 0.95; //Add this line

Response<AnswersResult> response = client.GetAnswers(question, project, options); //Add the additional options parameter

前回のコードの実行から、信頼度スコアが .9185 であることが分かっているため、しきい値を .95 に設定すると、既定の回答が返されます。

Q:How much battery life do I have left?
A:No good match found in KB
(0)

ナレッジ ベースを使用せずにテキストに対してクエリを実行する

GetAnswersFromText を使用することで、ナレッジ ベースなしで質問応答を使用することもできます。 この場合、質問を送信する際に、質問と、回答の検索先となる関連テキスト レコードの両方を質問応答に提供します。

この例の場合は、endpointcredential の変数だけを変更する必要があります。

using Azure;
using Azure.AI.Language.QuestionAnswering;
using System;
using System.Collections.Generic;


namespace questionansweringcsharp
{
    class Program
    {
        static void Main(string[] args)
        {

            Uri endpoint = new Uri("https://{YOUR-ENDPOINT}.api.cognitive.microsoft.com/");
            AzureKeyCredential credential = new AzureKeyCredential("YOUR-LANGUAGE-RESOURCE-KEY");
            QuestionAnsweringClient client = new QuestionAnsweringClient(endpoint, credential);

            IEnumerable<TextDocument> records = new[]
            {
                new TextDocument("doc1", "Power and charging.It takes two to four hours to charge the Surface Pro 4 battery fully from an empty state. " +
                         "It can take longer if you're using your Surface for power-intensive activities like gaming or video streaming while you're charging it"),
                new TextDocument("doc2", "You can use the USB port on your Surface Pro 4 power supply to charge other devices, like a phone, while your Surface charges. " +
                         "The USB port on the power supply is only for charging, not for data transfer. If you want to use a USB device, plug it into the USB port on your Surface."),
            };

            AnswersFromTextOptions options = new AnswersFromTextOptions("How long does it takes to charge a surface?", records);
            Response<AnswersFromTextResult> response = client.GetAnswersFromText(options);

           foreach (TextAnswer answer in response.Value.Answers)
            {
                if (answer.Confidence > .9)
                {
                    string BestAnswer = response.Value.Answers[0].Answer;

                    Console.WriteLine($"Q:{options.Question}");
                    Console.WriteLine($"A:{BestAnswer}");
                    Console.WriteLine($"Confidence Score: ({response.Value.Answers[0].Confidence:P2})"); //:P2 converts the result to a percentage with 2 decimals of accuracy. 
                    break;
                }
                else
                {
                    Console.WriteLine($"Q:{options.Question}");
                    Console.WriteLine("No answers met the requested confidence score.");
                    break;
                }
            }

        }
    }
}

上記のコードを実行するには、Program.cs を上記のスクリプト ブロックの内容で置き換え、endpointcredential の変数を、前提条件の一部として作成した言語リソースに対応するように変更します。

今回は、すべての回答を繰り返し処理し、最大の信頼性スコアが 0.9 より大きい回答のみを返します。 GetAnswersFromText で使用できるオプションの詳細について理解する。

このクイックスタートは、以下を行う Python 用の質問応答クライアント ライブラリに使用します。

  • ナレッジ ベースから回答を取得する。
  • 質問と共に送信したテキストの本文から回答を取得する。
  • 質問に対する回答の信頼度スコアを取得する。

API リファレンス ドキュメント | ソース コード | パッケージ (PyPI) | Python サンプル |

前提条件

  • Azure サブスクリプション - 無料アカウントを作成します
  • Python 3.x
  • 質問応答の API キーとエンドポイントを生成するには、カスタム質問応答機能を有効にした言語リソースが必要です。
    • 言語リソースがデプロイされたら、 [リソースに移動] を選びます。 API に接続するには、作成したリソースのキーとエンドポイントが必要です。 このクイックスタートで後に示すコードに、自分のキーとエンドポイントを貼り付けます。
  • Azure CLI を使って言語リソースを作成するには、リソースの作成時に次の追加プロパティを指定して、言語リソース --api-properties qnaAzureSearchEndpointId=/subscriptions/<azure-subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Search/searchServices/<azure-search-service-name> qnaAzureSearchEndpointKey=<azure-search-service-auth-key> でカスタム質問と回答を構成します
  • クエリを実行する既存のナレッジ ベース。 ナレッジ ベースをまだ設定していない場合は、Language Studio のクイックスタートに関するページに記載されている手順に従ってください。 または、この Surface ユーザー ガイド URL をデータ ソース として使用するナレッジ ベースを追加します。

設定

クライアント ライブラリをインストールする

Python をインストールしたら、次を使用してクライアント ライブラリをインストールすることができます。

pip install azure-ai-language-questionanswering

ナレッジ ベースにクエリを実行する

ナレッジ ベースから回答を生成する

以下の例では、get_answers を使ってナレッジ ベースに対してクエリを実行し、質問に対する回答を得ることができます。 このコードは、専用の .py ファイルや Jupyter Notebook または Lab のセルにコピーすることができます。

以下の変数を実際の値に変更して、以下のコードを更新する必要があります。

変数名
endpoint この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 エンドポイントの例: https://southcentralus.api.cognitive.microsoft.com/
credential この値は、Azure portal からリソースを確認する際に、[Keys & Endpoint](キーとエンドポイント) セクションで確認することができます。 Key1 または Key2 を使用できます。 常に 2 つの有効なキーを持つことで、ダウンタイムなしで安全にキーのローテーションを行うことができます。 または、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする]>[Get prediction URL](予測 URL の取得) で値を見つけることができます。 キー値は、サンプル要求の一部です。
knowledge_base_project 質問応答プロジェクトの名前。
deployment 使用可能な値は test および production です。 production は、 [Language Studio]>[質問応答]>[ナレッジ ベースをデプロイする] からナレッジ ベースをデプロイしていることに依存します。
from azure.core.credentials import AzureKeyCredential
from azure.ai.language.questionanswering import QuestionAnsweringClient

endpoint = "https://{YOUR-ENDPOINT}.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("{YOUR-LANGUAGE-RESOURCE-KEY}")
knowledge_base_project = "{YOUR-PROJECT-NAME}"
deployment = "production"

def main():
    client = QuestionAnsweringClient(endpoint, credential)
    with client:
        question="How much battery life do I have left?"
        output = client.get_answers(
            question = question,
            project_name=knowledge_base_project,
            deployment_name=deployment
        )
    print("Q: {}".format(question))
    print("A: {}".format(output.answers[0].answer))

if __name__ == '__main__':
    main()

この例では変数をハード コーディングしています。 運用環境では、資格情報を安全に格納して利用するための方法を用いることを検討してください。 たとえば、Azure Key Vault で安全なキー記憶域を確保できます。

上記のコードを実行すると、前提条件のデータ ソースを使用している場合は、次のような回答が表示されます。

Q: How much battery life do I have left?
A: If you want to see how much battery you have left, go to **Start  **> **Settings  **> **Devices  **> **Bluetooth & other devices  **, then find your pen. The current battery level will appear under the battery icon.

この回答の精度に関する質問応答による信頼度については、既存の print ステートメントの下に print ステートメントを追加します。

print("Q: {}".format(question))
print("A: {}".format(output.answers[0].answer))
print("Confidence Score: {}".format(output.answers[0].confidence_score)) # add this line 

これで、信頼度スコアを含む結果が返されます。

Q: How much battery life do I have left?
A: If you want to see how much battery you have left, go to **Start  **> **Settings  **> **Devices  **> **Bluetooth & other devices  **, then find your pen. The current battery level will appear under the battery icon.
Confidence Score: 0.9185

信頼度スコアは、0 から 1 の値で返されます。 これはパーセンテージのように考えることができるため、100 を掛けます。つまり、信頼度スコアが 0.9185 の場合、これがナレッジ ベースに基づいた、質問に対する正しい答えであることを質問応答は 91.85% 確信していることを意味します。

信頼度スコアが特定のしきい値を下回る回答を除外したい場合は、AnswerOptions を変更して confidence_threshold パラメーターを追加します。

        output = client.get_answers(
            confidence_threshold = 0.95, #add this line
            question = question,
            project_name=knowledge_base_project,
            deployment_name=deployment
        )

前回のコードの実行から、信頼度スコアが .9185 であることが分かっているため、しきい値を .95 に設定すると、既定の回答が返されます。

Q: How much battery life do I have left?
A: No good match found in KB
Confidence Score: 0.0

ナレッジ ベースを使用せずにテキストに対してクエリを実行する

get_answers_from_text を使用することで、ナレッジ ベースなしで質問応答を使用することもできます。 この場合、質問を送信する際に、質問と、回答の検索先となる関連テキスト レコードの両方を質問応答に提供します。

この例の場合は、endpointcredential の変数だけを変更する必要があります。

import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.language.questionanswering import QuestionAnsweringClient
from azure.ai.language.questionanswering import models as qna

endpoint = "https://{YOUR-ENDPOINT}.api.cognitive.microsoft.com/"
credential = AzureKeyCredential("YOUR-LANGUAGE-RESOURCE-KEY")

def main():
    client = QuestionAnsweringClient(endpoint, credential)
    with client:
        question="How long does it takes to charge a surface?"
        input = qna.AnswersFromTextOptions(
            question=question,
            text_documents=[
                "Power and charging. It takes two to four hours to charge the Surface Pro 4 battery fully from an empty state. " +
                "It can take longer if you're using your Surface for power-intensive activities like gaming or video streaming while you're charging it.",
                "You can use the USB port on your Surface Pro 4 power supply to charge other devices, like a phone, while your Surface charges. " +
                "The USB port on the power supply is only for charging, not for data transfer. If you want to use a USB device, plug it into the USB port on your Surface.",
            ]
        )


        output = client.get_answers_from_text(input)

    best_answer = [a for a in output.answers if a.confidence > 0.9][0]
    print(u"Q: {}".format(input.question))
    print(u"A: {}".format(best_answer.answer))
    print("Confidence Score: {}".format(output.answers[0].confidence))

if __name__ == '__main__':
    main()

このコードは、専用の .py ファイルや Jupyter Notebook または Lab の新しいセルにコピーすることができます。 この例では、次のような結果が返されます。

Q: How long does it takes to charge surface?
A: Power and charging. It takes two to four hours to charge the Surface Pro 4 battery fully from an empty state. It can take longer if you're using your Surface for power-intensive activities like gaming or video streaming while you're charging it.
Confidence Score: 0.9254655838012695

今回は、すべての回答を繰り返し処理し、最大の信頼性スコアが 0.9 より大きい回答のみを返します。 get_answers_from_text で使用できるオプションについて詳しく理解するには、AnswersFromTextOptions パラメーターに関するページを参照してください。

リソースをクリーンアップする

Cognitive Services サブスクリプションをクリーンアップして削除したい場合は、リソースまたはリソース グループを削除することができます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。

REST API の確認

質問応答パイプラインの自動化については、REST API のドキュメントを参照してください。 現在、オーサリング機能は REST API 経由でのみ使用できます。

次のステップ