Příklad: Vytvoření vlastní dovednosti pomocí Pythonu (archivováno)

Tento příklad je archivován a není podporován. Vysvětluje, jak vytvořit vlastní dovednosti webového rozhraní API pomocí Pythonu a editoru Visual Studio Code. Příklad použil funkci Azure Functions , která implementuje vlastní rozhraní dovedností.

Požadavky

Vytvoření funkce Azure Functions

Tento příklad používá funkci Azure Functions k předvedení konceptu hostování webového rozhraní API, ale další přístupy jsou možné. Pokud splňujete požadavky rozhraní pro kognitivní dovednost, je přístup, který berete, neměnný. Azure Functions ale usnadňuje vytvoření vlastní dovednosti.

Vytvoření projektu pro funkci

Šablona projektu Azure Functions v editoru Visual Studio Code vytvoří místní projekt, který lze publikovat do aplikace funkcí v Azure. Aplikace funkcí umožňuje seskupit funkce jako logickou jednotku pro správu, nasazení a sdílení prostředků.

  1. V editoru Visual Studio Code stisknutím klávesy F1 otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte Azure Functions: Create new project....
  2. Zvolte umístění adresáře pro pracovní prostor projektu a zvolte Vybrat. Nepoužívejte složku projektu, která už je součástí jiného pracovního prostoru.
  3. Vyberte jazyk projektu aplikace funkcí. Pro účely tohoto kurzu vyberte Python.
  4. Vyberte verzi Pythonu (služba Azure Functions podporuje verzi 3.7.5).
  5. Vyberte šablonu pro první funkci projektu. Výběrem triggeru HTTP vytvořte v nové aplikaci funkcí funkci aktivovanou protokolem HTTP.
  6. Zadejte název funkce. V tomto případě použijeme Concatenator.
  7. Jako úroveň autorizace vyberte funkci . K volání koncového bodu HTTP funkce použijete přístupový klíč funkce.
  8. Určete, jak chcete projekt otevřít. V tomto kroku vyberte Přidat do pracovního prostoru a vytvořte aplikaci funkcí v aktuálním pracovním prostoru.

Visual Studio Code vytvoří projekt aplikace funkcí v novém pracovním prostoru. Tento projekt obsahuje soubory host.json a local.settings.jsonconfiguration a všechny soubory projektu specifické pro jazyk.

Nová funkce aktivovaná protokolem HTTP se také vytvoří ve složce Concatenator projektu aplikace funkcí. Uvnitř bude soubor s názvem "__init__.py", s tímto obsahem:

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
        )

Teď tento kód upravíme tak, aby sledoval rozhraní vlastních dovedností. Nahraďte výchozí kód následujícím obsahem:

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 provádí operaci s jedním záznamem. Metodu můžete upravit tak, aby vyhovovala vašim konkrétním potřebám. Nezapomeňte provést jakékoli nezbytné ověření vstupu a vrátit případné chyby a upozornění, pokud operaci nelze dokončit.

Lokálně ladit svůj kód

Visual Studio Code usnadňuje ladění kódu. Stiskněte klávesu F5 nebo přejděte do nabídky Ladění a vyberte Spustit ladění.

Jakékoli zarážky v kódu můžete nastavit stisknutím klávesy F9 na požadovaném řádku.

Jakmile začnete s laděním, vaše funkce bude spuštěna místně. K vydání požadavku na localhost můžete použít nástroj, jako je Postman nebo Fiddler. Poznamenejte si umístění místního koncového bodu v okně terminálu.

Vytvoření aplikace funkcí v Azure

Až budete s chováním funkce spokojeni, můžete ho publikovat. Zatím jste pracovali místně. V této části vytvoříte aplikaci funkcí v Azure a pak nasadíte místní projekt do aplikace, kterou jste vytvořili.

Vytvoření aplikace z editoru Visual Studio Code

  1. V editoru Visual Studio Code stisknutím klávesy F1 otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte Vytvořit aplikaci funkcí v Azure.

  2. Pokud máte více aktivních předplatných, vyberte předplatné pro tuto aplikaci.

  3. Zadejte globálně jedinečný název aplikace funkcí. Zadejte název, který je platný pro adresu URL.

  4. Vyberte runtime a zvolte jazykovou verzi, kterou jste používali lokálně.

  5. Vyberte umístění aplikace. Pokud je to možné, zvolte stejnou oblast, která je také hostitelem vyhledávací služby.

Vytvoření aplikace trvá několik minut. Až bude připravená, uvidíte novou aplikaci v části Prostředky a aplikace funkcí aktivního předplatného.

Nasazení do Azure

  1. V editoru Visual Studio Code stisknutím klávesy F1 otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte Nasadit do Function App....

  2. Vyberte aplikaci funkcí, kterou jste vytvořili.

  3. Potvrďte, že chcete pokračovat, a pak vyberte Nasadit. Stav nasazení můžete monitorovat v okně výstupu.

  4. Přejděte na Azure portal a přejděte do Všechny prostředky. Vyhledejte aplikaci funkcí, kterou jste nasadili, pomocí globálně jedinečného názvu, který jste zadali v předchozím kroku.

    Návod

    Můžete také kliknout pravým tlačítkem na aplikaci funkcí v editoru Visual Studio Code a vybrat Otevřít na portálu.

  5. Na portálu vlevo vyberte Funkce a pak vyberte funkci, kterou jste vytvořili.

  6. Na stránce přehledu funkce vyberte v horní části panelu příkazů získat adresu URL funkce . To vám umožní zkopírovat adresu URL pro volání funkce.

    Snímek obrazovky s příkazem Získat adresu URL funkce na webu Azure Portal

Testování funkce v Azure

Pomocí výchozího klíče hostitele a adresy URL, kterou jste zkopírovali, otestujte funkci na webu Azure Portal.

  1. Na levé straně v části Vývojář vyberte Kód + Test.

  2. Na panelu příkazů vyberte Test/Spustit .

  3. Pro vstup použijte Post, výchozí klíč a vložte text požadavku:

    {
        "values": [
            {
                "recordId": "e1",
                "data":
                {
                    "text1":  "Hello",
                    "text2":  "World"
                }
            },
            {
                "recordId": "e2",
                "data": "This is an invalid input"
            }
        ]
    }
    
  4. Vyberte Spustit.

    Snímek obrazovky se specifikací vstupu

Tento příklad by měl vytvořit stejný výsledek, který jste viděli dříve při spuštění funkce v místním prostředí.

Přidat do portfolia dovedností

Teď, když máte novou vlastní dovednost, můžete ji přidat do sady dovedností. Následující příklad ukazuje, jak využít funkci pro zřetězení názvu a autora dokumentu do jednoho pole, které nazýváme merged_title_author.

Nahraďte [your-function-url-here] adresou URL nové funkce Azure Functions.

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

Nezapomeňte do definice indexeru přidat "outputFieldMapping" a odeslat "merged_title_author" do pole "fullname" v indexu vyhledávání.

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