Поделиться через


Пример: Создание пользовательского навыка с помощью Python (архивировано)

Этот пример архивируется и не поддерживается. В нем объясняется, как создать пользовательский навык веб-API с помощью Python и Visual Studio Code. В примере используется функция Azure, реализующая пользовательский интерфейс навыка.

Необходимые условия

Создание функции Azure

В этом примере функция Azure используется для демонстрации концепции размещения веб-API, но другие подходы возможны. Если вы соответствуете требованиям интерфейса для когнитивного навыка, подход, который вы выбираете, не имеет значения. Однако функции Azure упрощают создание пользовательского навыка.

Создание проекта для функции

Шаблон проекта Функций Azure в Visual Studio Code создает локальный проект, который можно опубликовать в приложении-функции в Azure. Приложение-функция позволяет группировать функции как логическую единицу для управления, развертывания и совместного использования ресурсов.

  1. В Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. В палитре команд найдите и выберите Azure Functions: Create new project....
  2. Выберите расположение каталога для рабочей области проекта и выберите Выбрать. Не используйте папку проекта, которая уже входит в другую рабочую область.
  3. Выберите язык для проекта приложения-функции. В этом руководстве выберите Python.
  4. Выберите версию Python (версия 3.7.5 поддерживается функциями Azure).
  5. Выберите шаблон для первой функции проекта. Выберите триггер HTTP, чтобы создать функцию, активированную HTTP, в новом функциональном приложении.
  6. Укажите имя функции. В этом случае давайте будем использовать Сцепление
  7. Выберите параметр в качестве уровня авторизации. Вы будете использовать ключ доступа к функции для вызова конечной точки HTTP функции.
  8. Укажите способ открытия проекта. На этом шаге выберите Добавить в рабочую область, чтобы создать функциональное приложение в текущей рабочей области.

Visual Studio Code создает проект приложения-функции в новой рабочей области. Этот проект содержит файлы host.json и local.settings.jsonconfiguration, а также все файлы проекта, относящиеся к языку.

Новая функция, активироваемая HTTP, также создается в папке Concatenator проекта приложения-функции. Внутри него будет файл с именем "__init__.py", с этим содержимым:

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
        )

Теперь давайте изменим этот код, чтобы следовать настраиваемому интерфейсу навыка. Замените код по умолчанию следующим содержимым:

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

Метод transform_value выполняет операцию с одной записью. Этот метод можно изменить в соответствии с конкретными потребностями. Не забудьте выполнить любую необходимую проверку входных данных и вернуть все ошибки и предупреждения, если операция не может быть завершена.

Отладка кода локально

Visual Studio Code упрощает отладку кода. Нажмите клавишу F5 или перейдите в меню Отладка и выберите Начать отладку.

Вы можете задать любые точки останова в коде, нажав клавишу F9 в строке интереса.

После начала отладки функция будет выполняться локально. Вы можете использовать средство, например Postman или Fiddler, чтобы отправить запрос на localhost. Обратите внимание на расположение локальной конечной точки в окне терминала.

Создание приложения-функции в Azure

Если вы удовлетворены поведением функции, его можно опубликовать. До сих пор вы работали локально. В этом разделе описано, как создать приложение-функцию в Azure, а затем развернуть локальный проект в созданном приложении.

Создание приложения из Visual Studio Code

  1. В Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. В палитре команд найдите и выберите Создать функциональное приложение в Azure.

  2. Если у вас несколько активных подписок, выберите подписку для этого приложения.

  3. Введите глобально уникальное имя приложения-функции. Введите имя, допустимое для URL-адреса.

  4. Выберите стек среды выполнения и выберите языковую версию, в которой вы работали локально.

  5. Выберите расположение для приложения. Если это возможно, выберите тот же регион, который также размещает службу поиска.

Создание приложения занимает несколько минут. Когда он будет готов, вы увидите новое приложение в разделе Resources и Функциональные приложения активной подписки.

Развертывание в Azure

  1. По-прежнему в Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. В палитре команд найдите и выберите Развернуть в приложении функций....

  2. Выберите приложение с функцией, которое вы создали.

  3. Подтвердите, что вы хотите продолжить, а затем выберите Развернуть. Состояние развертывания можно отслеживать в окне вывода.

  4. Перейдите на портала Azure, перейдите к все ресурсы. Найдите развернутое приложение-функцию с помощью глобально уникального имени, предоставленного на предыдущем шаге.

    Совет

    Вы также можете щелкнуть правой кнопкой мыши функциональное приложение в Visual Studio Code и выбрать Открыть в портале.

  5. На портале слева выберите Функции, а затем выберите созданную функцию.

  6. На странице обзора функции выберите Получить URL-адрес функции на верхней командной панели. Это позволит скопировать URL-адрес для вызова функции.

    снимок экрана: команда Get Function URL на портале Azure.

Проверка функции в Azure

Используя ключ узла по умолчанию и URL-адрес, скопированный, протестируйте функцию на портале Azure.

  1. Слева в разделе "Разработчик" выберите Code + Test.

  2. На панели команд выберите "Тест/Запуск".

  3. Для ввода используйте Post, ключ по умолчанию и вставьте в текст запроса:

    {
        "values": [
            {
                "recordId": "e1",
                "data":
                {
                    "text1":  "Hello",
                    "text2":  "World"
                }
            },
            {
                "recordId": "e2",
                "data": "This is an invalid input"
            }
        ]
    }
    
  4. Выберите Выполнить.

    снимок экрана: спецификация ввода

В этом примере должен быть получен тот же результат, который вы видели ранее при запуске функции в локальной среде.

Добавление в набор навыков

Теперь, когда у вас есть новый пользовательский навык, вы можете добавить его в набор навыков. В приведенном ниже примере показано, как вызвать навык для объединения заголовка и автора документа в одно поле, которое мы называем merged_title_author.

Замените [your-function-url-here] URL-адресом новой функции 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"
            }
          ]
      }
  ]
}

Не забудьте добавить "outputFieldMapping" в определение индексатора для отправки "merged_title_author" в поле "fullname" в индексе поиска.

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