Szybki start: odpowiadanie na pytania niestandardowe

Uwaga

Usługa Azure Open AI On Your Data korzysta z dużych modeli językowych (LLMs), aby uzyskać podobne wyniki do niestandardowych odpowiedzi na pytania. Jeśli chcesz połączyć istniejący projekt odpowiedzi na pytania niestandardowe z usługą Azure Open AI On Your Data, zapoznaj się z naszym przewodnikiem.

Uwaga

Czy chcesz migrować obciążenia z usługi QnA Maker? Zapoznaj się z naszym przewodnikiem migracji , aby uzyskać informacje na temat porównań funkcji i kroków migracji.

Rozpocznij pracę z niestandardową biblioteką klienta odpowiadającą na pytania. Wykonaj następujące kroki, aby zainstalować pakiet i wypróbować przykładowy kod dla podstawowych zadań.

Możesz utworzyć niestandardowy projekt odpowiadania na pytania na podstawie własnej zawartości, takiej jak często zadawane pytania lub podręczniki produktów. Ten artykuł zawiera przykład tworzenia niestandardowego projektu odpowiedzi na pytania z podręcznika produktu w celu udzielenia odpowiedzi na pytania.

Wymagania wstępne

  • Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
  • Zasób językowy z włączoną funkcją odpowiadania na pytania niestandardowe. Zapamiętaj identyfikator Entra firmy Microsoft, subskrypcję, nazwę zasobu języka wybraną podczas tworzenia zasobu.

Tworzenie pierwszego niestandardowego projektu odpowiadania na pytania

  1. Zaloguj się do programu Language Studio przy użyciu poświadczeń platformy Azure.

  2. Przewiń w dół do sekcji Odpowiedzi na pytania i wybierz pozycję Otwórz niestandardowe odpowiadanie na pytania.

    Otwieranie niestandardowej odpowiedzi na pytania

  3. Jeśli zasób nie jest jeszcze połączony z usługą Azure Search, wybierz pozycję Połączenie z usługą Azure Search. Spowoduje to otwarcie nowej karty przeglądarki w okienku Funkcje zasobu w witrynie Azure Portal.

    Połączenie do usługi Azure Search

  4. Wybierz pozycję Włącz niestandardowe odpowiadanie na pytania, wybierz zasób usługi Azure Search, do których chcesz utworzyć link, a następnie wybierz pozycję Zastosuj.

    Włączanie niestandardowego odpowiadania na pytania

  5. Wróć do karty Language Studio. Może być konieczne odświeżenie tej strony, aby zarejestrować zmianę zasobu. Wybierz pozycję Utwórz nowy projekt.

  6. Wybierz opcję Chcę ustawić język dla wszystkich projektów utworzonych w tym zasobie>, wybierz pozycję Angielski wybierz pozycję Dalej>.

  7. Wprowadź nazwę projektu Sample-project, opis mojego pierwszego projektu odpowiedzi na pytanie i pozostaw domyślną odpowiedź z ustawieniem Nie znaleziono odpowiedzi.

  8. Przejrzyj wybrane opcje i wybierz pozycję Utwórz projekt

  9. Na stronie Zarządzanie źródłami wybierz pozycję Dodaj źródłowe>adresy URL.

  10. Wybierz pozycję Dodaj adres URL , wprowadź następujące wartości, a następnie wybierz pozycję Dodaj wszystko:

    Nazwa adresu URL Wartość adresu URL
    Podręcznik użytkownika aplikacji Surface Book https://download.microsoft.com/download/7/B/1/7B10C82E-F520-4080-8516-5CF0D803EEE0/surface-book-user-guide-EN.pdf

    Proces wyodrębniania zajmuje kilka chwil, aby odczytać dokument i zidentyfikować pytania i odpowiedzi.

    Po pomyślnym dodaniu źródła możesz edytować zawartość źródłową, aby dodać więcej niestandardowych zestawów odpowiedzi na pytania.

Testowanie projektu

  1. Wybierz link do źródła. Spowoduje to otwarcie strony edycji projektu.

  2. Wybierz pozycję Testuj na pasku > menu Wprowadź pytanie, Jak mogę skonfigurować książkę surface?. Odpowiedź zostanie wygenerowana na podstawie par odpowiedzi na pytanie, które zostały automatycznie zidentyfikowane i wyodrębnione ze źródłowego adresu URL:

    Testowanie interfejsu czatu na pytanie

    Jeśli zaznaczysz pole wyboru, aby uwzględnić krótką odpowiedź , zobaczysz również dokładną odpowiedź, jeśli jest dostępna, wraz z fragmentem odpowiedzi w okienku testu podczas zadawania pytania.

  3. Wybierz pozycję Zbadaj, aby bardziej szczegółowo sprawdzić odpowiedź. Okno testowe służy do testowania zmian w projekcie przed wdrożeniem projektu.

    Wyświetlanie interwału ufności

    W interfejsie Inspekcja można zobaczyć poziom pewności, że ta odpowiedź będzie odpowiadać na pytanie i bezpośrednio edytować daną parę pytań i odpowiedzi.

Wdrażanie projektu

  1. Wybierz ikonę Wdróż projekt, aby wprowadzić menu wdrażania projektu.

    Wdrażanie projektu

    Podczas wdrażania projektu zawartość projektu przechodzi z indeksu do indeksu testprod w usłudze Azure Search.

  2. Wybierz pozycję Wdróż, a następnie po wyświetleniu monitu wybierz pozycję Wdróż> ponownie.

    Pomyślne wdrożenie

    Projekt został pomyślnie wdrożony. Możesz użyć punktu końcowego, aby odpowiedzieć na pytania we własnej aplikacji niestandardowej, aby odpowiedzieć na nie lub w botze.

Wymagania wstępne

  • Bieżąca wersja programu cURL. Kilka przełączników wiersza polecenia jest używanych w przewodnikach Szybki start, które zostały zanotowane w dokumentacji biblioteki cURL.
  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Niestandardowe odpowiadanie na pytania wymaga zasobu language z włączoną funkcją niestandardowego odpowiadania na pytania w celu wygenerowania klucza interfejsu API i punktu końcowego.
    • Po wdrożeniu zasobu Language wybierz pozycję Przejdź do zasobu. Aby nawiązać połączenie z interfejsem API, potrzebny będzie klucz i punkt końcowy z utworzonego zasobu. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
  • Aby utworzyć zasób języka za pomocą interfejsu wiersza polecenia platformy Azure, podaj następujące dodatkowe właściwości: --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>
  • Istniejący projekt do wykonywania zapytań. Jeśli projekt nie został skonfigurowany, możesz postępować zgodnie z instrukcjami w przewodniku Szybki start programu Language Studio. Możesz też dodać projekt, który używa tego adresu URL podręcznika użytkownika urządzenia Surface jako źródła danych.

Konfigurowanie

Tworzenie zmiennych środowiskowych

Aby wysyłać żądania interfejsu API, aplikacja musi być uwierzytelniona. W środowisku produkcyjnym należy użyć bezpiecznego sposobu przechowywania poświadczeń i uzyskiwania do nich dostępu. W tym przykładzie zostaną zapisane poświadczenia do zmiennych środowiskowych na komputerze lokalnym z uruchomioną aplikacją.

Napiwek

Nie dołączaj klucza bezpośrednio do kodu i nigdy nie publikuj go publicznie. Aby uzyskać więcej opcji uwierzytelniania, takich jak usługa Azure Key Vault, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.

Aby ustawić zmienną środowiskową dla klucza zasobu Language, otwórz okno konsoli i postępuj zgodnie z instrukcjami dotyczącymi systemu operacyjnego i środowiska programistycznego.

  1. Aby ustawić zmienną LANGUAGE_KEY środowiskową, zastąp your-key element jednym z kluczy zasobu.
  2. Aby ustawić zmienną LANGUAGE_ENDPOINT środowiskową, zastąp your-endpoint element punktem końcowym zasobu.
setx LANGUAGE_KEY your-key
setx LANGUAGE_ENDPOINT your-endpoint

Uwaga

Jeśli musisz uzyskać dostęp tylko do zmiennych środowiskowych w bieżącej uruchomionej konsoli, możesz ustawić zmienną środowiskową z wartością set zamiast setx.

Po dodaniu zmiennych środowiskowych może być konieczne ponowne uruchomienie wszystkich uruchomionych programów, które będą musiały odczytać zmienne środowiskowe, w tym okno konsoli. Jeśli na przykład używasz programu Visual Studio jako edytora, uruchom ponownie program Visual Studio przed uruchomieniem przykładu.

Wykonywanie zapytań względem projektu

Generowanie odpowiedzi na podstawie projektu

Aby wykonać zapytanie dotyczące niestandardowego projektu odpowiedzi na pytania przy użyciu interfejsów API REST i biblioteki cURL, potrzebne są następujące informacje:

Nazwa zmiennej Wartość
Endpoint Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Przykładowy punkt końcowy to: https://southcentralus.api.cognitive.microsoft.com/
API-Key Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Możesz użyć klawisza Key1 lub Key2. Zawsze posiadanie dwóch prawidłowych kluczy zawsze w celu zapewnienia bezpiecznej rotacji kluczy z zerowym przestojem. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Wartość klucza jest częścią przykładowego żądania.
Project Nazwa niestandardowego projektu odpowiadania na pytania.
Deployment Istnieją dwie możliwe wartości: test, i production. productionprogram jest zależny od wdrożenia projektu z poziomu programu Language Studio>z odpowiedzią>na pytanie Wdrażanie projektu.

Polecenie cURL jest wykonywane z powłoki BASH. Edytuj to polecenie przy użyciu własnej nazwy zasobu, klucza zasobu i wartości JSON oraz rozmiaru kodu 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}'

Po uruchomieniu powyższego kodu, jeśli używasz źródła danych z wymagań wstępnych, otrzymasz odpowiedź, która wygląda następująco:

{
"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": []
      }
    }
  ]
}

Funkcja confidenceScore zwraca wartość z zakresu od 0 do 1. Możesz pomyśleć o tym jak o wartości procentowej i pomnożyć przez 100, więc współczynnik ufności 0,9185 oznacza, że niestandardowe odpowiadanie na pytania wynosi 91,85% przekonanych, że jest to prawidłowa odpowiedź na pytanie na podstawie projektu.

Jeśli chcesz wykluczyć odpowiedzi, w których współczynnik ufności spadnie poniżej określonego confidenceScoreThreshold progu, możesz dodać parametr .

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}'

Ponieważ wiemy z poprzedniego wykonania kodu, że nasz współczynnik ufności to: .9185 ustawienie progu na .95 wartość spowoduje zwrócenie odpowiedzi domyślnej.

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

Tekst zapytania bez projektu

Możesz również użyć niestandardowego odpowiadania na pytania bez projektu przy użyciu wstępnie utworzonego niestandardowego interfejsu API REST odpowiadania na pytania, który jest wywoływany za pomocą metody query-text. W takim przypadku należy podać odpowiedź na pytanie zarówno przy użyciu pytania, jak i skojarzonych rekordów tekstowych, które chcesz wyszukać w momencie wysłania żądania.

W tym przykładzie wystarczy zmodyfikować zmienne dla API KEY i ENDPOINT.

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'

W tym przykładzie zostanie zwrócony wynik:

{  
"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
    }
  ]
}

Skorzystaj z tego przewodnika Szybki start, aby uzyskać niestandardową bibliotekę klienta odpowiadającą na pytania dla platformy .NET, aby:

  • Uzyskaj odpowiedź z projektu.
  • Uzyskaj odpowiedź z treści tekstu wysyłanego wraz z pytaniem.
  • Uzyskaj współczynnik ufności odpowiedzi na twoje pytanie.

Dokumentacja referencyjna | Package (NuGet) | Dodatkowe przykłady | kod źródłowy biblioteki

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Środowisko IDE programu Visual Studio lub bieżąca wersja platformy .NET Core.
  • Niestandardowe odpowiadanie na pytania wymaga zasobu language z włączoną funkcją niestandardowego odpowiadania na pytania w celu wygenerowania klucza interfejsu API i punktu końcowego.
    • Po wdrożeniu zasobu Language wybierz pozycję Przejdź do zasobu. Aby nawiązać połączenie z interfejsem API, potrzebny będzie klucz i punkt końcowy z utworzonego zasobu. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
  • Aby utworzyć zasób języka za pomocą interfejsu wiersza polecenia platformy Azure, podaj następujące dodatkowe właściwości: --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>
  • Istniejący projekt do wykonywania zapytań. Jeśli projekt nie został skonfigurowany, możesz postępować zgodnie z instrukcjami w przewodniku Szybki start dla programu Language Studio. Możesz też dodać projekt, który używa tego adresu URL podręcznika użytkownika urządzenia Surface jako źródła danych.

Konfigurowanie

Tworzenie zmiennych środowiskowych

Aby wysyłać żądania interfejsu API, aplikacja musi być uwierzytelniona. W środowisku produkcyjnym należy użyć bezpiecznego sposobu przechowywania poświadczeń i uzyskiwania do nich dostępu. W tym przykładzie zostaną zapisane poświadczenia do zmiennych środowiskowych na komputerze lokalnym z uruchomioną aplikacją.

Napiwek

Nie dołączaj klucza bezpośrednio do kodu i nigdy nie publikuj go publicznie. Aby uzyskać więcej opcji uwierzytelniania, takich jak usługa Azure Key Vault, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.

Aby ustawić zmienną środowiskową dla klucza zasobu Language, otwórz okno konsoli i postępuj zgodnie z instrukcjami dotyczącymi systemu operacyjnego i środowiska programistycznego.

  1. Aby ustawić zmienną LANGUAGE_KEY środowiskową, zastąp your-key element jednym z kluczy zasobu.
  2. Aby ustawić zmienną LANGUAGE_ENDPOINT środowiskową, zastąp your-endpoint element punktem końcowym zasobu.
setx LANGUAGE_KEY your-key
setx LANGUAGE_ENDPOINT your-endpoint

Uwaga

Jeśli musisz uzyskać dostęp tylko do zmiennych środowiskowych w bieżącej uruchomionej konsoli, możesz ustawić zmienną środowiskową z wartością set zamiast setx.

Po dodaniu zmiennych środowiskowych może być konieczne ponowne uruchomienie wszystkich uruchomionych programów, które będą musiały odczytać zmienne środowiskowe, w tym okno konsoli. Jeśli na przykład używasz programu Visual Studio jako edytora, uruchom ponownie program Visual Studio przed uruchomieniem przykładu.

Interfejs wiersza polecenia

W oknie konsoli (takim jak cmd, PowerShell lub Bash) użyj dotnet new polecenia , aby utworzyć nową aplikację konsolową o nazwie question-answering-quickstart. To polecenie tworzy prosty projekt języka C# "Hello World" z jednym plikiem źródłowym: program.cs.

dotnet new console -n question-answering-quickstart

Zmień katalog na nowo utworzony folder aplikacji. Aplikację można skompilować za pomocą następujących funkcji:

dotnet build

Dane wyjściowe kompilacji nie powinny zawierać żadnych ostrzeżeń ani błędów.

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

W katalogu aplikacji zainstaluj niestandardową bibliotekę klienta odpowiadającą na pytania dla platformy .NET za pomocą następującego polecenia:

dotnet add package Azure.AI.Language.QuestionAnswering

Wykonywanie zapytań względem projektu

Generowanie odpowiedzi na podstawie projektu

Poniższy przykład umożliwia wykonywanie zapytań dotyczących projektu przy użyciu GetAnswers metody w celu uzyskania odpowiedzi na twoje pytanie.

Musisz zaktualizować poniższy kod i podać własne wartości dla następujących zmiennych.

Nazwa zmiennej Wartość
endpoint Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Przykładowy punkt końcowy to: https://southcentralus.api.cognitive.microsoft.com/
credential Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Możesz użyć klawisza Key1 lub Key2. Zawsze posiadanie dwóch prawidłowych kluczy zawsze w celu zapewnienia bezpiecznej rotacji kluczy z zerowym przestojem. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Wartość klucza jest częścią przykładowego żądania.
projectName Nazwa niestandardowego projektu odpowiadania na pytania.
deploymentName Istnieją dwie możliwe wartości: test, i production. productionprogram jest zależny od wdrożenia projektu z poziomu programu Language Studio>z odpowiedzią>na pytanie Wdrażanie projektu.

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.

W katalogu projektu otwórz plik program.cs i zastąp ciąg następującym kodem:

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}");
            }
        }
    }
}

Chociaż kodujemy stałe zmienne dla naszego przykładu. W przypadku środowiska produkcyjnego rozważ użycie bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń. Na przykład usługa Azure Key Vault zapewnia bezpieczny magazyn kluczy.

Po zaktualizowaniu Program.cs przy użyciu powyższego kodu i podstawieniu w poprawnych wartościach zmiennych. Uruchom aplikację za pomocą dotnet run polecenia z katalogu aplikacji.

dotnet run

Odpowiedź będzie wyglądać następująco:

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.

Aby uzyskać informacje na temat pewności, w jaki sposób niestandardowe odpowiadanie na pytania jest poprawne, dodaj dodatkową instrukcję drukowania poniżej istniejących instrukcji drukowania:

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

Jeśli wykonasz dotnet run ponownie, otrzymasz wynik z oceną ufności:

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)

Wynik ufności zwraca wartość z zakresu od 0 do 1. Możesz pomyśleć o tym jak o wartości procentowej i pomnożyć przez 100, więc współczynnik ufności 0,9185 oznacza, że niestandardowe odpowiadanie na pytania wynosi 91,85% przekonanych, że jest to prawidłowa odpowiedź na pytanie na podstawie projektu.

Jeśli chcesz wykluczyć odpowiedzi, w których współczynnik ufności spadnie poniżej określonego progu, użyj polecenia AnswerOptions , aby dodać ConfidenceScoreThreshold właściwość .

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

Ponieważ wiemy z poprzedniego wykonania kodu, że nasz współczynnik ufności to: .9185 ustawienie progu na .95 wartość spowoduje zwrócenie odpowiedzi domyślnej.

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

Tekst zapytania bez projektu

Możesz również użyć niestandardowego odpowiadania na pytania bez projektu za pomocą polecenia GetAnswersFromText. W takim przypadku należy podać niestandardową odpowiedź na pytanie oraz skojarzone rekordy tekstowe, na które chcesz wyszukać odpowiedź w momencie wysłania żądania.

W tym przykładzie wystarczy zmodyfikować zmienne dla endpoint i credential.

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;
                }
            }

        }
    }
}

Aby uruchomić powyższy kod, zastąp Program.cs element zawartością powyższego bloku skryptu i zmodyfikuj endpoint zmienne i credential , aby odpowiadały zasobowi języka utworzonemu w ramach wymagań wstępnych.

W takim przypadku iterujemy wszystkie odpowiedzi i zwracamy tylko odpowiedź z najwyższym współczynnikiem ufności większym niż 0,9. Aby dowiedzieć się więcej o opcjach dostępnych w programie GetAnswersFromText.

Skorzystaj z tego przewodnika Szybki start, aby uzyskać niestandardową bibliotekę klienta odpowiadającą na pytania dla języka Python:

  • Uzyskaj odpowiedź z projektu.
  • Uzyskaj odpowiedź z treści tekstu wysyłanego wraz z pytaniem.
  • Uzyskaj współczynnik ufności odpowiedzi na twoje pytanie.

Dokumentacja referencyjna | Package (PyPI) | Dodatkowe przykłady | kod źródłowy biblioteki

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Python 3.x
  • Niestandardowe odpowiadanie na pytania wymaga zasobu language z włączoną funkcją niestandardowego odpowiadania na pytania w celu wygenerowania klucza interfejsu API i punktu końcowego.
    • Po wdrożeniu zasobu Language wybierz pozycję Przejdź do zasobu. Potrzebny jest klucz i punkt końcowy z utworzonego zasobu, aby nawiązać połączenie z interfejsem API. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
  • Aby utworzyć zasób języka za pomocą interfejsu wiersza polecenia platformy Azure, podaj następujące inne właściwości: --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>
  • Istniejący projekt do wykonywania zapytań. Jeśli projekt nie został skonfigurowany, możesz postępować zgodnie z instrukcjami w przewodniku Szybki start dla programu Language Studio. Możesz też dodać projekt, który używa tego adresu URL podręcznika użytkownika urządzenia Surface jako źródła danych.

Konfigurowanie

Instalowanie biblioteki klienta

Po zainstalowaniu środowiska Python możesz zainstalować bibliotekę klienta przy użyciu następującego polecenia:

pip install azure-ai-language-questionanswering

Wykonywanie zapytań względem projektu

Generowanie odpowiedzi na podstawie projektu

Poniższy przykład umożliwia wykonywanie zapytań dotyczących projektu przy użyciu get_answers w celu uzyskania odpowiedzi na pytanie. Możesz skopiować ten kod do dedykowanego pliku .py lub do komórki w aplikacji Jupyter Notebook/Lab.

Musisz zaktualizować poniższy kod i podać własne wartości dla następujących zmiennych.

Nazwa zmiennej Wartość
endpoint Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Przykładowy punkt końcowy to: https://southcentralus.api.cognitive.microsoft.com/
credential Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu z poziomu witryny Azure Portal. Możesz użyć klawisza Key1 lub Key2. Zawsze posiadanie dwóch prawidłowych kluczy zawsze w celu zapewnienia bezpiecznej rotacji kluczy z zerowym przestojem. Alternatywnie możesz znaleźć wartość w artykule Language Studio>question answering>Deploy project Get prediction URL (Wdrażanie projektu>Uzyskiwanie adresu URL przewidywania). Wartość klucza jest częścią przykładowego żądania.
knowledge_base_project Nazwa projektu odpowiedzi na pytanie.
deployment Istnieją dwie możliwe wartości: test, i production. productionprogram jest zależny od wdrożenia projektu z poziomu programu Language Studio>z odpowiedzią>na pytanie Wdrażanie projektu.

Ważne

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Azure AI Services security (Zabezpieczenia usług 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()

Mimo że kodujemy stałe zmienne dla naszego przykładu. W przypadku środowiska produkcyjnego rozważ użycie bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń. Na przykład usługa Azure Key Vault zapewnia bezpieczny magazyn kluczy.

Po uruchomieniu powyższego kodu, jeśli używasz źródła danych z wymagań wstępnych, otrzymasz odpowiedź, która wygląda następująco:

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.

Aby uzyskać informacje na temat tego, jak pewna jest pewność, że niestandardowe odpowiadanie na pytanie jest poprawne, dodaj kolejną instrukcję drukowania poniżej istniejących instrukcji drukowania:

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

Otrzymasz teraz wynik z współczynnikiem ufności:

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

Wynik ufności zwraca wartość z zakresu od 0 do 1. Możesz pomyśleć o tym jak o wartości procentowej i pomnożyć przez 100, więc współczynnik ufności 0,9185 oznacza, że niestandardowe odpowiadanie na pytania wynosi 91,85% przekonanych, że jest to prawidłowa odpowiedź na pytanie na podstawie projektu.

Jeśli chcesz wykluczyć odpowiedzi, w których współczynnik ufności spadnie poniżej określonego progu, możesz zmodyfikować parametr AnswerOptions , aby dodać confidence_threshold parametr .

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

Ponieważ wiemy z poprzedniego wykonania kodu, że nasz współczynnik ufności to: .9185 ustawienie progu .95 na wyniki zwracanej odpowiedzi domyślnej.

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

Tekst zapytania bez projektu

Możesz również użyć niestandardowej odpowiedzi na pytania bez projektu z get_answers_from_text. W takim przypadku należy podać niestandardową odpowiedź na pytanie oraz skojarzone rekordy tekstowe, na które chcesz wyszukać odpowiedź w momencie wysłania żądania.

W tym przykładzie wystarczy zmodyfikować zmienne dla endpoint i credential.

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()

Możesz skopiować ten kod do dedykowanego pliku .py lub do nowej komórki w aplikacji Jupyter Notebook/Lab. Ten przykład zwraca wynik:

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

W takim przypadku iterujemy wszystkie odpowiedzi i zwracamy tylko odpowiedź z najwyższym współczynnikiem ufności większym niż 0,9. Aby dowiedzieć się więcej o opcjach dostępnych za pomocą get_answers_from_text, zapoznaj się z parametrami AnswersFromTextOptions.

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć subskrypcję usług Azure AI, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów.

Poznawanie interfejsu API REST

Aby dowiedzieć się więcej na temat automatyzacji niestandardowego potoku odpowiadania na pytania, zapoznaj się z dokumentacją interfejsu API REST. Obecnie funkcja tworzenia jest dostępna tylko za pośrednictwem interfejsu API REST:

Następne kroki