Tworzenie magazynu wiedzy przy użyciu interfejsu REST

W usłudze Azure AI Search magazyn wiedzy to repozytorium zawartości generowanej przez sztuczną inteligencję, która jest używana w scenariuszach niezwiązanych z wyszukiwaniem. Magazyn wiedzy jest tworzony przy użyciu indeksatora i zestawu umiejętności oraz określasz usługę Azure Storage do przechowywania danych wyjściowych. Po wypełnieniu magazynu wiedzy użyj narzędzi, takich jak Eksplorator usługi Storage lub Power BI, aby eksplorować zawartość.

W tym artykule używasz interfejsu API REST do pozyskiwania, wzbogacania i eksplorowania zestawu recenzji hotelowych pobytów w magazynie wiedzy. Magazyn wiedzy zawiera oryginalną zawartość tekstową pobraną ze źródła oraz zawartość wygenerowaną przez sztuczną inteligencję, która zawiera wynik tonacji, wyodrębnianie kluczowych fraz, wykrywanie języka i tłumaczenie tekstu komentarzy klientów innych niż angielski.

Aby udostępnić początkowy zestaw danych, opinie hotelowe są najpierw importowane do usługi Azure Blob Storage. Po przetworzeniu wyniki są zapisywane jako magazyn wiedzy w usłudze Azure Table Storage.

Napiwek

W tym artykule użyto interfejsu REST w celu uzyskania szczegółowych wyjaśnień dotyczących każdego kroku. Pobierz plik REST, jeśli chcesz po prostu uruchomić polecenia. Alternatywnie możesz również utworzyć magazyn wiedzy w witrynie Azure Portal.

Wymagania wstępne

Zestaw umiejętności w tych przykładach używa usług Azure AI Services do wzbogacania. Ponieważ obciążenie jest tak małe, usługi azure AI są zakulisowe, aby zapewnić bezpłatne przetwarzanie do 20 transakcji dziennie. Małe obciążenie oznacza, że można pominąć tworzenie lub dołączanie zasobu obejmującego wiele usług w usłudze Azure AI.

Przekazywanie danych do usługi Azure Storage i uzyskiwanie parametry połączenia

  1. Pobierz HotelReviews_Free.csv. Ten plik CSV zawiera 19 elementów opinii klientów dotyczących pojedynczego hotelu (pochodzi z Kaggle.com).

  2. W witrynie Azure Portal znajdź konto magazynu i użyj przeglądarki usługi Storage, aby utworzyć kontener obiektów blob o nazwie hotel-reviews.

  3. Wybierz pozycję Przekaż w górnej części strony, aby załadować plik HotelReviews-Free.csv pobrany z poprzedniego kroku.

    Screenshot of Storage Browser with uploaded file and left nav pane

  4. Po lewej stronie wybierz pozycję Klucze dostępu, wybierz pozycję Pokaż klucze, a następnie skopiuj parametry połączenia dla klucza key1 lub key2. Pełny parametry połączenia dostępu ma następujący format:

"knowledgeStore": {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<YOUR-ACCOUNT-NAME>;AccountKey=<YOUR-ACCOUNT-KEY>;EndpointSuffix=core.windows.net;"
}

Uwaga

Jeśli nie chcesz udostępniać poufnych danych na parametry połączenia, zobacz Połączenie przy użyciu tożsamości zarządzanej.

Kopiowanie klucza i adresu URL

W tym przykładzie wywołania REST wymagają punktu końcowego usługi wyszukiwania i używają klucza interfejsu API dla każdego żądania. Te wartości można uzyskać w witrynie Azure Portal.

  1. Zaloguj się do witryny Azure Portal, przejdź do strony Przegląd i skopiuj adres URL. Przykładowy punkt końcowy może wyglądać podobnie jak https://mydemo.search.windows.net.

  2. W obszarze Ustawienia> Keys skopiuj klucz administratora. Administracja klucze służą do dodawania, modyfikowania i usuwania obiektów. Istnieją dwa zamienne klucze administratora. Skopiuj jedną z nich.

    Screenshot of the URL and API keys in the Azure portal.

Prawidłowy klucz interfejsu API ustanawia relację zaufania dla poszczególnych żądań między aplikacją wysyłającą żądanie a usługą wyszukiwania, która go obsługuje.

Tworzenie indeksu

Tworzenie indeksu (REST) powoduje utworzenie indeksu wyszukiwania w usłudze wyszukiwania. Indeks wyszukiwania nie jest związany z magazynem wiedzy, ale indeksator wymaga takiego indeksatora. Indeks wyszukiwania zawiera tę samą zawartość co magazyn wiedzy, którą można eksplorować, wysyłając żądania zapytań.

  1. Otwórz nowy plik tekstowy w programie Visual Studio Code.

  2. Ustaw zmienne na punkt końcowy wyszukiwania i zebrany wcześniej klucz interfejsu API.

    @baseUrl = PUT-YOUR-SEARCH-SERVICE-URL-HERE
    @apiKey = PUT-YOUR-ADMIN-API-KEY-HERE
    @storageConnection = PUT-YOUR-STORAGE-CONNECTION-STRING-HERE
    @blobContainer = PUT-YOUR-CONTAINER-NAME-HERE (hotel-reviews)
    
  3. Zapisz plik z .rest rozszerzeniem pliku.

  4. Wklej poniższy przykład, aby utworzyć żądanie indeksu.

    ### Create a new index
    POST {{baseUrl}}/indexes?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        api-key: {{apiKey}}
    
        {
            "name": "hotel-reviews-kstore-idx",  
            "fields": [
                { "name": "name", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false },
                { "name": "reviews_date", "type": "Edm.DateTimeOffset", "searchable": false, "filterable": false, "sortable": false, "facetable": false },
                { "name": "reviews_rating", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false, "facetable": false },
                { "name": "reviews_text", "type": "Edm.String", "filterable": false,  "sortable": false, "facetable": false },
                { "name": "reviews_title", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false, "facetable": false },
                { "name": "reviews_username", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false, "facetable": false },
                { "name": "AzureSearch_DocumentKey", "type": "Edm.String", "searchable": false, "filterable": false, "sortable": false, "facetable": false, "key": true },
                { "name": "language", "type": "Edm.String", "filterable": true, "sortable": false, "facetable": true },
                { "name": "translated_text", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false },
                { "name": "sentiment", "type": "Collection(Edm.String)", "searchable": false, "filterable": true, "retrievable": true, "sortable": false, "facetable": true },
                { "name": "keyphrases", "type": "Collection(Edm.String)", "filterable": true, "sortable": false, "facetable": true }
            ]
        }
    
  5. Wybierz pozycję Wyślij wniosek. Powinna zostać wyświetlona HTTP/1.1 201 Created odpowiedź, a treść odpowiedzi powinna zawierać reprezentację JSON schematu indeksu.

Utwórz źródło danych

Tworzenie źródła danych tworzy połączenie ze źródłem danych w usłudze Azure AI Search.

  1. Wklej poniższy przykład, aby utworzyć źródło danych.

    ### Create a data source
    POST {{baseUrl}}/datasources?api-version=2023-11-01  HTTP/1.1
      Content-Type: application/json
      api-key: {{apiKey}}
    
        {
            "name": "hotel-reviews-kstore-ds",
            "description": null,
            "type": "azureblob",
            "subtype": null,
            "credentials": {
                "connectionString": "{{storageConnectionString}}"
            },
            "container": {
                "name": "{{blobContainer}}",
                "query": null
            },
            "dataChangeDetectionPolicy": null,
            "dataDeletionDetectionPolicy": null
        }
    
  2. Wybierz pozycję Wyślij wniosek.

Tworzenie zestawu umiejętności

Zestaw umiejętności definiuje wzbogacania (umiejętności) i twój magazyn wiedzy. Utwórz zestaw umiejętności, aby utworzyć obiekt w usłudze wyszukiwania.

  1. Wklej poniższy przykład, aby utworzyć zestaw umiejętności.

    ### Create a skillset
    POST {{baseUrl}}/skillsets?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        api-key: {{apiKey}}
    
        {
            "name": "hotel-reviews-kstore-ss",
            "description": "Skillset to detect language, translate text, extract key phrases, and score sentiment",
            "skills": [ 
                {
                    "@odata.type": "#Microsoft.Skills.Text.SplitSkill", 
                    "context": "/document/reviews_text", "textSplitMode": "pages", "maximumPageLength": 5000,
                    "inputs": [ 
                        { "name": "text", "source": "/document/reviews_text" }
                    ],
                    "outputs": [
                        { "name": "textItems", "targetName": "pages" }
                    ]
                },
                {
                    "@odata.type": "#Microsoft.Skills.Text.V3.SentimentSkill",
                    "context": "/document/reviews_text/pages/*",
                    "inputs": [
                        { "name": "text", "source": "/document/reviews_text/pages/*" },
                        { "name": "languageCode", "source": "/document/language" }
                    ],
                    "outputs": [
                        { "name": "sentiment", "targetName": "sentiment" }
                    ]
                },
                {
                    "@odata.type": "#Microsoft.Skills.Text.LanguageDetectionSkill",
                    "context": "/document",
                    "inputs": [
                        { "name": "text", "source": "/document/reviews_text" }
                    ],
                    "outputs": [
                        { "name": "languageCode", "targetName": "language" }
                    ]
                },
                {
                    "@odata.type": "#Microsoft.Skills.Text.TranslationSkill",
                    "context": "/document/reviews_text/pages/*",
                    "defaultFromLanguageCode": null,
                    "defaultToLanguageCode": "en",
                    "inputs": [
                        { "name": "text", "source": "/document/reviews_text/pages/*" }
                    ],
                    "outputs": [
                        { "name": "translatedText", "targetName": "translated_text" }
                    ]
                },
                {
                    "@odata.type": "#Microsoft.Skills.Text.KeyPhraseExtractionSkill",
                    "context": "/document/reviews_text/pages/*",
                    "inputs": [
                        { "name": "text",  "source": "/document/reviews_text/pages/*" },
                        { "name": "languageCode",  "source": "/document/language" }
                    ],
                    "outputs": [
                        { "name": "keyPhrases" , "targetName": "keyphrases" }
                    ]
                },
                {
                    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
                    "context": "/document",
                    "inputs": [
                        { "name": "name",  "source": "/document/name" },
                        { "name": "reviews_date",  "source": "/document/reviews_date" },
                        { "name": "reviews_rating",  "source": "/document/reviews_rating" },
                        { "name": "reviews_text",  "source": "/document/reviews_text" },
                        { "name": "reviews_title",  "source": "/document/reviews_title" },
                        { "name": "reviews_username",  "source": "/document/reviews_username" },
                        { "name": "AzureSearch_DocumentKey",  "source": "/document/AzureSearch_DocumentKey" },
                        {
                        "name": "pages",
                        "sourceContext": "/document/reviews_text/pages/*",
                        "inputs": [
                            {
                            "name": "languageCode",
                            "source": "/document/language"
                            },
                            {
                            "name": "translatedText",
                            "source": "/document/reviews_text/pages/*/translated_text"
                            },
                            { 
                            "name": "sentiment",
                            "source": "/document/reviews_text/pages/*/sentiment"
                            },
                            {
                            "name": "keyPhrases",
                            "source": "/document/reviews_text/pages/*/keyphrases/*"
                            },
                            {
                            "name": "Page",
                            "source": "/document/reviews_text/pages/*"
                            }
                        ]
                        }
                    ],
                    "outputs": [
                        { "name": "output" , "targetName": "tableprojection" }
                    ]
                }
            ],
            "knowledgeStore": {
                "storageConnectionString": "{{storageConnectionString}}",
                "projections": [
                    {
                        "tables": [
                            { "tableName": "hotelReviews1Document", "generatedKeyName": "Documentid", "source": "/document/tableprojection" },
                            { "tableName": "hotelReviews2Pages", "generatedKeyName": "Pagesid", "source": "/document/tableprojection/pages/*" },
                            { "tableName": "hotelReviews3KeyPhrases", "generatedKeyName": "KeyPhrasesid", "source": "/document/tableprojection/pages/*/keyPhrases/*" }
                        ],
                        "objects": []
                    },
                    {
                        "tables": [
                            { 
                                "tableName": "hotelReviews4InlineProjectionDocument", "generatedKeyName": "Documentid", "sourceContext": "/document",
                                "inputs": [
                                    { "name": "name", "source": "/document/name"},
                                    { "name": "reviews_date", "source": "/document/reviews_date"},
                                    { "name": "reviews_rating", "source": "/document/reviews_rating"},
                                    { "name": "reviews_username", "source": "/document/reviews_username"},
                                    { "name": "reviews_title", "source": "/document/reviews_title"},
                                    { "name": "reviews_text", "source": "/document/reviews_text"},
                                    { "name": "AzureSearch_DocumentKey", "source": "/document/AzureSearch_DocumentKey" }
                                ]
                            },
                            { 
                                "tableName": "hotelReviews5InlineProjectionPages", "generatedKeyName": "Pagesid", "sourceContext": "/document/reviews_text/pages/*",
                                "inputs": [
                                    { "name": "Sentiment", "source": "/document/reviews_text/pages/*/sentiment"},
                                    { "name": "LanguageCode", "source": "/document/language"},
                                    { "name": "Keyphrases", "source": "/document/reviews_text/pages/*/keyphrases"},
                                    { "name": "TranslatedText", "source": "/document/reviews_text/pages/*/translated_text"},
                                    { "name": "Page", "source": "/document/reviews_text/pages/*" }
                                ]
                            },
                            { 
                                "tableName": "hotelReviews6InlineProjectionKeyPhrases", "generatedKeyName": "kpidv2", "sourceContext": "/document/reviews_text/pages/*/keyphrases/*",
                                "inputs": [
                                    { "name": "Keyphrases", "source": "/document/reviews_text/pages/*/keyphrases/*" }
                                ]
                            }
                        ],
                        "objects": []
                    }
                ]
            }
        }
    

Kluczowe punkty:

  • Umiejętność kształtowania jest ważna dla definicji magazynu wiedzy. Określa sposób przepływu danych do tabel magazynu wiedzy. Dane wejściowe to części wzbogaconego dokumentu, które chcesz przechowywać. Dane wyjściowe to konsolidacja węzłów w jedną strukturę.

  • Projekcje określają tabele, obiekty i obiekty blob magazynu wiedzy. Każdy element projekcji określa "name" kolumnę lub pole do utworzenia w usłudze Azure Storage. Określa "source" , która część danych wyjściowych kształtu jest przypisana do tego pola lub kolumny.

Tworzenie indeksatora

Tworzenie indeksatora powoduje utworzenie i uruchomienie indeksatora. Wykonywanie indeksatora rozpoczyna się od złamania dokumentów, wyodrębniania tekstu i obrazów oraz inicjowania zestawu umiejętności. Indeksator sprawdza inne utworzone obiekty: źródło danych, indeks i zestaw umiejętności.

  1. Wklej poniższy przykład, aby utworzyć indeksator.

    ### Create indexer
    POST {{baseUrl}}/indexers?api-version=2023-11-01  HTTP/1.1
        Content-Type: application/json
        api-key: {{apiKey}}
    
        {
            "name": "hotel-reviews-kstore-idxr",
            "dataSourceName": "hotel-reviews-kstore-ds",
            "skillsetName": "hotel-reviews-kstore-ss",
            "targetIndexName": "hotel-reviews-kstore-idx",
            "parameters": {
                "configuration": {
                    "dataToExtract": "contentAndMetadata",
                    "parsingMode": "delimitedText",
                    "firstLineContainsHeaders": true,
                    "delimitedTextDelimiter": ","
        }
    },
    "fieldMappings": [
        {
            "sourceFieldName": "AzureSearch_DocumentKey",
            "targetFieldName": "AzureSearch_DocumentKey",
            "mappingFunction": { "name": "base64Encode" }
        }
    ],
    "outputFieldMappings": [
        { "sourceFieldName": "/document/reviews_text/pages/*/Keyphrases/*", "targetFieldName": "Keyphrases" },
        { "sourceFieldName": "/document/Language", "targetFieldName": "Language" },
        { "sourceFieldName": "/document/reviews_text/pages/*/Sentiment", "targetFieldName": "Sentiment" }
        ]
    }
    
  2. Wybierz pozycję Wyślij żądanie , aby utworzyć i uruchomić indeksator. Wykonanie tego kroku zajmuje kilka minut.

Kluczowe punkty:

  • Obiekt parameters/configuration steruje sposobem pozyskiwania danych przez indeksator. W takim przypadku dane wejściowe są w jednym pliku CSV, który zawiera wiersz nagłówka i wartości rozdzielane przecinkami.

  • Mapowania pól tworzą "AzureSearch_DocumentKey" to unikatowy identyfikator każdego dokumentu generowanego przez indeksator obiektów blob (na podstawie ścieżki magazynu metadanych).

  • Mapowania pól wyjściowych określają sposób mapowania wzbogaconych pól na pola w indeksie wyszukiwania. Mapowania pól wyjściowych nie są używane w magazynach wiedzy (magazyny wiedzy używają kształtów i projekcji do wyrażania fizycznych struktur danych).

Sprawdź stan

Po wysłaniu każdego żądania usługa wyszukiwania powinna odpowiedzieć z komunikatem o powodzeniu 201.

### Get Indexer Status (wait several minutes for the indexer to complete)
GET {{baseUrl}}/indexers/hotel-reviews-kstore-idxr/status?api-version=2023-11-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}

Po kilku minutach możesz wykonać zapytanie dotyczące indeksu, aby sprawdzić zawartość. Nawet jeśli nie używasz indeksu, ten krok jest wygodnym sposobem potwierdzenia, że zestaw umiejętności wygenerował oczekiwane dane wyjściowe.

### Query the index (indexer status must be "success" before querying the index)
POST {{baseUrl}}/indexes/hotel-reviews-kstore-idxr/docs/search?api-version=2023-11-01  HTTP/1.1
  Content-Type: application/json
  api-key: {{apiKey}}
  
  {
    "search": "*",
    "select": "reviews_title, reviews_username, language, translated_text, sentiment",
    "count": true
  }

Sprawdzanie tabel w witrynie Azure Portal

W witrynie Azure Portal przejdź do konta usługi Azure Storage i użyj przeglądarki usługi Storage, aby wyświetlić nowe tabele. Powinny zostać wyświetlone sześć tabel, po jednym dla każdej projekcji zdefiniowanej w zestawie umiejętności.

Każda tabela jest generowana przy użyciu identyfikatorów niezbędnych do łączenia krzyżowego tabel w zapytaniach. Po otwarciu tabeli przewiń obok tych pól, aby wyświetlić pola zawartości dodane przez potok.

Screenshot of the knowledge store tables in Storage Browser

W tym przewodniku magazyn wiedzy składa się z różnych tabel pokazujących różne sposoby kształtowania i tworzenia struktury tabeli. Tabele od trzech do trzech używają danych wyjściowych umiejętności kształtowania w celu określenia kolumn i wierszy. Tabele od czterech do sześciu są tworzone na podstawie wbudowanych instrukcji kształtowania osadzonych w samym projekcji. Możesz użyć dowolnego podejścia, aby osiągnąć ten sam wynik.

Table opis
hotelReviews1Document Zawiera pola przenoszone z woluminu CSV, takie jak reviews_date i reviews_text.
hotelReviews2Pages Zawiera wzbogacone pola utworzone przez zestaw umiejętności, takie jak ocena tonacji i przetłumaczony tekst.
hotelReviews3KeyPhrases Zawiera długą listę tylko kluczowych fraz.
hotelReviews4InlineProjectionDocument Alternatywą dla pierwszej tabeli jest użycie kształtowania wbudowanego zamiast umiejętności Kształtowanie w celu kształtowania danych dla projekcji.
hotelReviews5InlineProjectionPages Alternatywą dla drugiej tabeli przy użyciu kształtowania wbudowanego.
hotelreviews6InlineProjectionKeyPhrases Alternatywą dla trzeciej tabeli przy użyciu kształtowania wbudowanego.

Czyszczenie

Jeśli pracujesz w ramach własnej subskrypcji, dobrym pomysłem po zakończeniu projektu jest sprawdzenie, czy dalej potrzebujesz utworzonych zasobów. Uruchomione zasoby mogą generować koszty. Zasoby możesz usuwać pojedynczo lub jako grupę zasobów, usuwając cały zestaw zasobów.

Zasoby można znaleźć w portalu i zarządzać nimi, korzystając z linku Wszystkie zasoby lub Grupy zasobów w okienku nawigacji po lewej stronie.

Następne kroki

Po wzbogaceniu danych przy użyciu usług Azure AI i projekcji wyników do magazynu wiedzy możesz użyć Eksplorator usługi Storage lub innych aplikacji do eksplorowania wzbogaconego zestawu danych.