分享方式:


快速入門:自訂問題解答

注意

您要從 QnA Maker 移轉工作負載嗎? 如需功能比較和移轉步驟的相關資訊,請參閱我們的移轉指南

開始使用自訂問題解答用戶端程式庫。 請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

您可以從自己的內容 (例如常見問題集或產品手冊) 建立自訂問題解答專案。 本文包含相關範例,說明如何從產品手冊建立自訂問題解答專案以回答問題。

必要條件

  • 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • 已啟用自訂問題解答功能的語言資源。 請記住您在建立資源時選取的 Microsoft Entra ID、訂用帳戶、語言資源名稱。

建立您的第一個自訂問題解答專案

  1. 使用您的 Azure 認證登入 Language Studio

  2. 向下捲動至 [回答問題] 區段,然後選取 [開啟自訂問題解答]

    開啟自訂問題解答

  3. 如果您的資源尚未連線至 Azure 搜尋服務,請選取 [連線至 Azure 搜尋服務]。 這會開啟新的瀏覽器索引標籤,顯示您的資源在 Azure 入口網站中的 [功能] 窗格。

    連線到 Azure 搜尋服務

  4. 選取 [啟用自訂問題解答],選擇要連結到的 Azure 搜尋服務資源,然後選取 [套用]

    啟用自訂問題解答

  5. 返回 [Language Studio] 索引標籤。您可能需要重新整理此頁面,才能將變更註冊至您的資源。 選取 [建立新專案]

  6. 選擇 [我要為在此資源中建立的所有專案設定語言] 選項> 選取 [英文]> 選取 [下一步]

  7. 輸入範例專案的專案名稱、第一個問題解答專案的描述,並保留預設答案的設定找不到答案

  8. 檢閱您的選擇,然後選取 [建立專案]

  9. 在 [管理來源] 頁面中,選取 [新增來源]>[URL]

  10. 選取 [新增 URL],輸入下列值,然後選取 [全部新增]

    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. 從功能表列中選取 [測試] > 輸入問題如何設定我的 Surface Book?。 系統會根據從您的來源 URL 自動識別和擷取的問答配對產生答案:

    測試問題聊天介面

    如果您勾選 [包含簡短的回答回應] 的方塊,則在您提出問題時,除了測試窗格中的答案段落以外,您也將看到精確的答案 (如果有的話)。

  3. 選取 [檢查],更詳細地檢查回應。 測試視窗可讓您在部署專案前測試您對專案所做的變更。

    查看信賴區間

    您可以從 [檢查] 介面查看此回應回答問題的信賴等級,並可直接編輯指定的問答回應配對。

部署您的專案

  1. 選擇 [部署專案] 圖示進入 [部署專案] 選單。

    部署專案

    當您部署專案時,專案的內容會從 test 索引移至 Azure 搜尋服務中的 prod 索引。

  2. 選取 [部署] > 在出現提示時,再次選取 [部署]

    部署成功

    您的專案現已成功部署。 您可以使用端點,在您自己的自訂應用程式中或 Bot 中回答問題。

必要條件

  • 最新版的 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 作為資料來源的專案。

設定

建立環境變數

您的應用程式必須經過驗證後,才能傳送 API 要求。 在生產環境中,請運用安全的方式來儲存和存取您的登入資訊。 在此範例中,您會在執行應用程式的本機電腦上將認證寫入環境變數。

若要設定語言資源金鑰的環境變數,請開啟主控台視窗,並遵循作業系統和開發環境的指示進行。

  • 若要設定 LANGUAGE_KEY 環境變數,請將 your-key 取代為您資源的其中一個金鑰。
  • 若要設定 LANGUAGE_ENDPOINT 環境變數,請將 your-endpoint 取代為您資源的端點。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx LANGUAGE_KEY your-key
setx LANGUAGE_ENDPOINT your-endpoint

注意

如果您只需要存取目前執行中主控台的環境變數,您可以使用 set (而不是 setx) 來設定環境變數。

新增環境變數之後,您可能需要重新啟動任何需要讀取環境變數的執行中程式,包括主控台視窗。 例如,如果您使用 Visual Studio 做為編輯器,請在執行範例前重新啟動 Visual Studio。

查詢專案

從專案產生答案

若要使用 REST API 和 cURL 查詢自訂問題解答專案,您需要下列資訊:

變數名稱
Endpoint 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 範例端點為:https://southcentralus.api.cognitive.microsoft.com/
API-Key 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 您可以使用 Key1 或 Key2。 隨時都有兩個有效金鑰有助於進行安全的金鑰輪替,而不需要停機。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 金鑰值是範例要求的一部分。
Project 自訂問題解答專案的名稱。
Deployment 有兩個可能的值:testproductionproduction 取決於您如何從 Language Studio>問題解答>部署專案部署您的專案。

cURL 命令是從 BASH 殼層執行。 使用您自己的資源名稱、資源金鑰,以及 JSON 值和 JSON 大小來編輯此命令。

curl -X POST -H "Ocp-Apim-Subscription-Key: $LANGUAGE_KEY" -H "Content-Type: application/json" -d '{
  "question": "How much battery life do I have left?"
  }'  '$LANGUAGE_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: $LANGUAGE_KEY" -H "Content-Type: application/json" -d '{
  "question": "How much battery life do I have left?",
  "confidenceScoreThreshold": "0.95",
  }'  '$LANGUAGE_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: $LANGUAGE_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"
}'  '$LANGUAGE_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 的自訂問題解答用戶端程式庫快速入門來:

  • 從專案取得答案。
  • 從與您的問題一起傳送的文字本文取得答案。
  • 取得問題解答的信賴分數。

參考文件 | 套件 (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 作為資料來源的專案。

設定

建立環境變數

您的應用程式必須經過驗證後,才能傳送 API 要求。 在生產環境中,請運用安全的方式來儲存和存取您的登入資訊。 在此範例中,您會在執行應用程式的本機電腦上將認證寫入環境變數。

若要設定語言資源金鑰的環境變數,請開啟主控台視窗,並遵循作業系統和開發環境的指示進行。

  • 若要設定 LANGUAGE_KEY 環境變數,請將 your-key 取代為您資源的其中一個金鑰。
  • 若要設定 LANGUAGE_ENDPOINT 環境變數,請將 your-endpoint 取代為您資源的端點。

重要

如果您使用 API 金鑰,請將其安全地儲存在別處,例如 Azure Key Vault。 請勿在程式碼中直接包含 API 金鑰,且切勿公開張貼金鑰。

如需 AI 服務安全性的詳細資訊,請參閱驗證對 Azure AI 服務的要求 (英文)。

setx LANGUAGE_KEY your-key
setx LANGUAGE_ENDPOINT your-endpoint

注意

如果您只需要存取目前執行中主控台的環境變數,您可以使用 set (而不是 setx) 來設定環境變數。

新增環境變數之後,您可能需要重新啟動任何需要讀取環境變數的執行中程式,包括主控台視窗。 例如,如果您使用 Visual Studio 做為編輯器,請在執行範例前重新啟動 Visual Studio。

CLI

在主控台視窗中 (例如 cmd、PowerShell 或 Bash),使用 dotnet new 命令建立名為 question-answering-quickstart 的新主控台應用程式。 此命令會建立簡單的 "Hello World" C# 專案,內含單一原始程式檔:program.cs

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 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 範例端點為:https://southcentralus.api.cognitive.microsoft.com/
credential 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 您可以使用 Key1 或 Key2。 隨時都有兩個有效金鑰有助於進行安全的金鑰輪替,而不需要停機。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 金鑰值是範例要求的一部分。
projectName 自訂問題解答專案的名稱。
deploymentName 有兩個可能的值:testproductionproduction 取決於您如何從 Language Studio>問題解答>部署專案部署您的專案。

重要

完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。 在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需詳細資訊,請參閱 Azure AI 服務安全性一文。

從專案目錄中開啟 program.cs 檔案,並取代為下列程式碼:

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

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

            // This example requires environment variables named "LANGUAGE_KEY" and "LANGUAGE_ENDPOINT"
            Uri endpoint = new Uri("LANGUAGE_ENDPOINT");
            AzureKeyCredential credential = new AzureKeyCredential("LANGUAGE_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 的自訂問題解答用戶端程式庫快速入門來:

  • 從專案取得答案。
  • 從與您的問題一起傳送的文字本文取得答案。
  • 取得問題解答的信賴分數。

參考文件 | 套件 (PyPI) | 其他範例 | 程式庫原始程式碼

必要條件

  • 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/實驗室中的儲存格。

您需要更新下列程式碼,並為下列變數提供您自己的值。

變數名稱
endpoint 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 範例端點為:https://southcentralus.api.cognitive.microsoft.com/
credential 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 您可以使用 Key1 或 Key2。 隨時都有兩個有效金鑰有助於進行安全的金鑰輪替,而不需要停機。 或者,您可以在 [Language Studio]>[問題解答]>[部署專案]>[取得預測 URL] 中找到此值。 金鑰值是範例要求的一部分。
knowledge_base_project 問題解答專案的名稱。
deployment 有兩個可能的值:testproductionproduction 取決於您如何從 Language Studio>問題解答>部署專案部署您的專案。

重要

完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。 在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需詳細資訊,請參閱 Azure AI 服務安全性一文。

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)) # 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/實驗室中的新儲存格。 此範例會傳回下列結果:

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 參數

清除資源

如果您想要清除和移除 Azure AI 服務訂用帳戶,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

探索 REST API

若要瞭解如何將您的自訂問題解答管線自動化,請參閱 REST API 文件。 目前只能透過 REST API 來使用撰寫功能:

下一步