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

Tento příklad je archivovaný a není podporován. Vysvětluje, jak vytvořit vlastní dovednost webového rozhraní API pomocí Pythonu a editoru Visual Studio Code. V příkladu se použila funkce Azure Functions , která implementuje rozhraní vlastních dovedností.

Požadavky

Vytvoření funkce Azure Function

V tomto příkladu se k předvedení konceptu hostování webového rozhraní API používá funkce Azure Functions, ale jsou možné i jiné přístupy. Pokud splňujete požadavky na rozhraní pro kognitivní dovednost, je přístup, který používáte, irelevantní. Azure Functions ale snadno vytvořit vlastní dovednost.

Vytvoření projektu pro funkci

Šablona projektu Azure Functions v editoru Visual Studio Code vytvoří místní projekt, který je možné publikovat do aplikace funkcí v Azure. Aplikace funkcí umožňuje seskupit funkce jako logickou jednotku pro snadnější správu, nasazování 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 váš pracovní prostor projektu a zvolte Vybrat. Nepoužívejte složku projektu, která je již součástí jiného pracovního prostoru.
  3. Vyberte jazyk pro projekt aplikace funkcí. Pro účely tohoto kurzu vyberte Python.
  4. Vyberte verzi Pythonu (verze 3.7.5 je podporována Azure Functions).
  5. Vyberte šablonu pro první funkci projektu. Výběrem triggeru HTTP vytvořte funkci aktivovanou protokolem HTTP v nové aplikaci funkcí.
  6. Zadejte název funkce. V tomto případě použijeme zřetězení.
  7. Jako úroveň autorizace vyberte Funkce . Přístupový klíč funkce použijete k volání koncového bodu HTTP 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 konkrétní jazyk.

Ve složce Zřetězení projektu aplikace funkcí se také vytvoří nová funkce aktivovaná protokolem HTTP. 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 se řídil rozhraním 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 potřebné ověření vstupu a vrátit případné chyby a upozornění, pokud operaci nejde dokončit.

Místní ladění kódu

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í.

V kódu můžete nastavit zarážky stisknutím klávesy F9 na řádku zájmu.

Jakmile spustíte ladění, funkce se spustí místně. K vystavení požadavku na localhost můžete použít nástroj, jako je Postman nebo Fiddler. Poznamenejte si umístění vašeho místního koncového bodu v okně Terminálu.

Vytvoření aplikace funkcí v Azure

Pokud jste s chováním funkce spokojeni, můžete ji publikovat. Zatím jste pracoval 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 zásobník modulu runtime a zvolte jazykovou verzi, ve které jste místně spustili.

  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. Stisknutím klávesy F1 v editoru Visual Studio Code otevřete paletu příkazů. Na paletě příkazů vyhledejte a vyberte Nasadit do aplikace funkcí....

  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řepněte na Azure Portal a přejděte na 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.

    Tip

    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 Na panelu příkazů nahoře možnost 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 v Azure Portal

Testování funkce v Azure

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

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

  2. Na panelu příkazů vyberte Testovat/spustit .

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

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

    Snímek obrazovky se specifikací vstupu

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

Přidání do sady dovedností

Teď, když máte novou vlastní dovednost, ji můžete přidat do sady dovedností. Následující příklad ukazuje, jak volat dovednost ke 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", který odešle "merged_title_author" do pole "fullname" ve vyhledávacím indexu.

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