Udostępnij za pośrednictwem


Przykład: tworzenie niestandardowej umiejętności przy użyciu języka Python (zarchiwizowanego)

Ten przykład jest zarchiwizowany i niedostępny. Wyjaśniono, jak przy użyciu języka Python i programu Visual Studio Code utworzyć niestandardową umiejętność web API. W przykładzie użyto funkcji platformy Azure, która implementuje niestandardowy interfejs umiejętności.

Warunki wstępne

Tworzenie funkcji platformy Azure

W tym przykładzie użyto funkcji platformy Azure do zademonstrowania koncepcji hostowania internetowego interfejsu API, ale możliwe są inne podejścia. Tak długo, jak spełniasz wymagania interfejsu dla umiejętności poznawczej, sposób, w jaki do tego podchodzisz, nie ma znaczenia. Jednak usługa Azure Functions ułatwia tworzenie niestandardowych umiejętności.

Tworzenie projektu dla funkcji

Szablon projektu usługi Azure Functions w programie Visual Studio Code tworzy projekt lokalny, który można opublikować w aplikacji funkcji na platformie Azure. Aplikacja funkcji umożliwia grupowanie funkcji jako jednostki logicznej do zarządzania, wdrażania i udostępniania zasobów.

  1. W programie Visual Studio Code naciśnij F1, aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Azure Functions: Create new project....
  2. Wybierz lokalizację katalogu dla obszaru roboczego projektu i wybierz pozycję Wybierz. Nie używaj folderu projektu, który jest już częścią innego obszaru roboczego.
  3. Wybierz język projektu aplikacji funkcji. Na potrzeby tego samouczka wybierz pozycję Python.
  4. Wybierz wersję języka Python (wersja 3.7.5 jest obsługiwana przez usługę Azure Functions).
  5. Wybierz szablon dla pierwszej funkcji projektu. Wybierz wyzwalacz HTTP, aby utworzyć funkcję wyzwalaną przez protokół HTTP w nowej aplikacji funkcyjnej.
  6. Podaj nazwę funkcji. W tym przypadku użyjemy Concatenator
  7. Wybierz pozycję Funkcja jako poziom autoryzacji. Użyjesz klucza dostępu funkcji, aby wywołać punkt końcowy HTTP funkcji.
  8. Określ sposób otwierania projektu. W tym kroku wybierz pozycję Dodaj do obszaru roboczego, aby utworzyć aplikację funkcji w bieżącym obszarze roboczym.

Program Visual Studio Code tworzy projekt aplikacji funkcjonalnej w nowym obszarze roboczym. Ten projekt zawiera pliki host.json i local.settings.jsonconfiguration oraz wszystkie pliki projektu specyficzne dla języka.

Nowa funkcja wyzwalana przez HTTP jest również tworzona w folderze Concatenator w projekcie aplikacji funkcji. W nim będzie dostępny plik o nazwie "__init__.py", z tą zawartością:

import logging

import azure.functions as func


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

Teraz zmodyfikujmy ten kod, aby był zgodny z niestandardowym interfejsem umiejętności. Zastąp domyślny kod następującą zawartością:

import logging
import azure.functions as func
import json

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    try:
        body = json.dumps(req.get_json())
    except ValueError:
        return func.HttpResponse(
             "Invalid body",
             status_code=400
        )
    
    if body:
        result = compose_response(body)
        return func.HttpResponse(result, mimetype="application/json")
    else:
        return func.HttpResponse(
             "Invalid body",
             status_code=400
        )


def compose_response(json_data):
    values = json.loads(json_data)['values']
    
    # Prepare the Output before the loop
    results = {}
    results["values"] = []
    
    for value in values:
        output_record = transform_value(value)
        if output_record != None:
            results["values"].append(output_record)
    return json.dumps(results, ensure_ascii=False)

## Perform an operation on a record
def transform_value(value):
    try:
        recordId = value['recordId']
    except AssertionError  as error:
        return None

    # Validate the inputs
    try:         
        assert ('data' in value), "'data' field is required."
        data = value['data']        
        assert ('text1' in data), "'text1' field is required in 'data' object."
        assert ('text2' in data), "'text2' field is required in 'data' object."
    except AssertionError  as error:
        return (
            {
            "recordId": recordId,
            "errors": [ { "message": "Error:" + error.args[0] }   ]       
            })

    try:                
        concatenated_string = value['data']['text1'] + " " + value['data']['text2']  
        # Here you could do something more interesting with the inputs

    except:
        return (
            {
            "recordId": recordId,
            "errors": [ { "message": "Could not complete operation for record." }   ]       
            })

    return ({
            "recordId": recordId,
            "data": {
                "text": concatenated_string
                    }
            })

Metoda transform_value wykonuje operację na jednym rekordzie. Możesz zmodyfikować metodę w celu spełnienia określonych potrzeb. Pamiętaj, aby wykonać wszelkie niezbędne weryfikacje danych wejściowych i zwrócić wszelkie błędy i ostrzeżenia, jeśli nie można ukończyć operacji.

Lokalne debugowanie kodu

Program Visual Studio Code ułatwia debugowanie kodu. Naciśnij F5 lub przejdź do menu debugowania i wybierz pozycję Rozpocznij debugowanie.

Możesz ustawić wszystkie punkty przerwania w kodzie, naciskając "F9" w wierszu zainteresowania.

Po rozpoczęciu debugowania funkcja będzie uruchamiana lokalnie. Aby wysłać żądanie do hosta lokalnego, możesz użyć narzędzia takiego jak Postman lub Fiddler. Zanotuj lokalizację lokalnego punktu końcowego w oknie Terminal.

Tworzenie aplikacji funkcji na platformie Azure

Jeśli zachowanie funkcji jest zadowalające, możesz ją opublikować. Do tej pory pracujesz lokalnie. W tej sekcji utworzysz aplikację funkcji na platformie Azure, a następnie wdrożysz projekt lokalny w utworzonej aplikacji.

Tworzenie aplikacji z poziomu programu Visual Studio Code

  1. W programie Visual Studio Code naciśnij F1, aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Utwórz funkcję aplikacji na platformie Azure.

  2. Jeśli masz wiele aktywnych subskrypcji, wybierz subskrypcję dla tej aplikacji.

  3. Wprowadź globalnie unikatową nazwę dla aplikacji funkcjonalnej. Wpisz nazwę prawidłową dla adresu URL.

  4. Wybierz stos środowiska uruchomieniowego i wybierz wersję języka, której używasz lokalnie.

  5. Wybierz lokalizację aplikacji. Jeśli to możliwe, wybierz ten sam region, który hostuje również usługę wyszukiwania.

Utworzenie aplikacji może potrwać kilka minut. Gdy będzie gotowa, zobaczysz nową aplikację w sekcji Resources i Funkcje aplikacji aktywnej subskrypcji.

Wdrażanie na platformie Azure

  1. Nadal w programie Visual Studio Code naciśnij F1, aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Wdróż do aplikacji funkcji....

  2. Wybierz utworzoną aplikację funkcjonalną.

  3. Upewnij się, że chcesz kontynuować, a następnie wybierz opcję Deplojuj. Stan wdrożenia można monitorować w oknie danych wyjściowych.

  4. Przejdź do portalu Azure, a następnie przejdź do Wszystkie zasoby. Wyszukaj tę wdrożoną aplikację funkcji przy użyciu globalnie unikalnej nazwy podanej w poprzednim kroku.

    Napiwek

    Możesz również kliknąć prawym przyciskiem myszy aplikację funkcjonalną w programie Visual Studio Code i wybrać pozycję Otwórz w portalu.

  5. W portalu po lewej stronie wybierz pozycję Functions, a następnie wybierz utworzoną funkcję.

  6. Na stronie przeglądu funkcji wybierz na pasku poleceń u góry pozycję Pobierz adres URL funkcji. Umożliwi to skopiowanie adresu URL w celu wywołania funkcji.

    zrzut ekranu przedstawiający polecenie Pobierz adres URL funkcji w portalu Azure.

Testowanie funkcji na platformie Azure

Używając domyślnego klucza hosta i skopiowanego adresu URL, przetestuj funkcję z poziomu witryny Azure Portal.

  1. Po lewej stronie, w obszarze Deweloper, wybierz pozycję Kod + Test.

  2. Na pasku poleceń wybierz pozycję Test/Uruchom.

  3. W przypadku danych wejściowych użyj Post, klucza domyślnego, a następnie wklej w treści żądania:

    {
        "values": [
            {
                "recordId": "e1",
                "data":
                {
                    "text1":  "Hello",
                    "text2":  "World"
                }
            },
            {
                "recordId": "e2",
                "data": "This is an invalid input"
            }
        ]
    }
    
  4. Wybierz pozycję Uruchom.

    Zrzut ekranu przedstawiający specyfikacji wejściowej

W tym przykładzie powinien zostać wygenerowany ten sam wynik, który był wcześniej wyświetlany podczas uruchamiania funkcji w środowisku lokalnym.

Dodawanie do zestawu umiejętności

Teraz, gdy masz nową niestandardową umiejętność, możesz dodać ją do zestawu umiejętności. W poniższym przykładzie pokazano, jak wywołać umiejętność, aby połączyć tytuł i autora dokumentu w jedno pole, które nazywamy „merged_title_author”.

Zastąp [your-function-url-here] adresem URL nowej funkcji platformy Azure.

{
    "skills": [
      "[... other existing skills in the skillset are here]",  
      {
        "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
        "description": "Our new search custom skill",
        "uri": "https://[your-function-url-here]",        
          "context": "/document/merged_content/organizations/*",
          "inputs": [
            {
              "name": "text1",
              "source": "/document/metadata_title"
            },
            {
              "name": "text2",
              "source": "/document/metadata_author"
            },
          ],
          "outputs": [
            {
              "name": "text",
              "targetName": "merged_title_author"
            }
          ]
      }
  ]
}

Pamiętaj, aby dodać element "outputFieldMapping" w definicji indeksatora, aby wysłać ciąg "merged_title_author" do pola "fullname" w indeksie wyszukiwania.

"outputFieldMappings": [
    {
        "sourceFieldName": "/document/content/merged_title_author",
        "targetFieldName": "fullname"
    }
]