Örnek: Python kullanarak özel beceri oluşturma (Arşivlenmiş)

Bu örnek arşivlenmiş ve destek dışıdır. Python ve Visual Studio Code kullanarak bir web API'sine özel becerinin nasıl oluşturulacağı açıklanmıştır. Örnek, özel beceri arabirimini uygulayan bir Azure İşlevi kullandı.

Önkoşullar

Azure İşlevi oluşturma

Bu örnekte web API'sini barındırma kavramını göstermek için Azure İşlevi kullanılır, ancak diğer yaklaşımlar mümkündür. Bilişsel beceri için arabirim gereksinimlerini karşıladığınız sürece, benimsediğiniz yaklaşım önemsizdir. Ancak Azure İşlevleri, özel beceri oluşturmayı kolaylaştırır.

İşlev için proje oluşturma

Visual Studio Code'daki Azure İşlevleri proje şablonu, Azure'daki bir işlev uygulamasında yayımlanabilir yerel bir proje oluşturur. İşlev uygulaması, işlevleri yönetim, dağıtım ve kaynakların paylaşımı için mantıksal birim olarak gruplandırmanıza olanak tanır.

  1. Visual Studio Code'da F1 tuşuna basarak komut paletini açın. Komut paletinde Azure Functions: Create new project...araması yapın ve öğesini seçin.
  2. Proje çalışma alanınız için bir dizin konumu seçin ve seçinseçin. Zaten başka bir çalışma alanının parçası olan bir proje klasörünü kullanmayın.
  3. İşlev uygulaması projeniz için bir dil seçin. Bu öğretici için Pythonöğesini seçin.
  4. Python sürümünü seçin (sürüm 3.7.5, Azure İşlevleri tarafından desteklenir).
  5. Projenizin ilk işlevi için bir şablon seçin. Yeni işlev uygulamasında HTTP ile tetiklenen bir işlev oluşturmak için HTTP tetikleyicisi seçin.
  6. bir işlev adı belirtin. Bu durumda, Concatenator kullanalım
  7. Yetkilendirme düzeyi olarak İşlev seçin. İşlevin HTTP uç noktasını çağırmak için bir işlev erişim anahtarı kullanacaksınız.
  8. Projenizi nasıl açmak istediğinizi belirtin. Bu adım için Çalışma alanına ekle'i seçerek işlev uygulamasını geçerli çalışma alanında oluşturun.

Visual Studio Code, işlev uygulaması projesini yeni bir çalışma alanında oluşturur. Bu proje host.json ve local.settings.jsonconfiguration dosyalarının yanı sıra dile özgü proje dosyalarını içerir.

İşlev uygulaması projesinin Concatenator klasöründe de yeni bir HTTP ile tetiklenen işlev oluşturulur. İçinde şu içeriğe sahip "__init__.py" adlı bir dosya bulunur:

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
        )

Şimdi bu kodu özel beceri arabirimini izleyecek şekilde değiştirelim. Varsayılan kodu aşağıdaki içerikle değiştirin:

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 yöntemi tek bir kayıt üzerinde bir işlem gerçekleştirir. Yöntemini kendi gereksinimlerinizi karşılayacak şekilde değiştirebilirsiniz. Gerekli giriş doğrulamasını yapmayı ve işlem tamamlanamazsa hata ve uyarı döndürmeyi unutmayın.

Kodunuzun hatalarını yerel olarak ayıklama

Visual Studio Code, kodun hatalarını ayıklamayı kolaylaştırır. 'F5' tuşuna basın veya Hata Ayıklama menüsüne gidin ve hata ayıklamayı başlat seçin.

İlgi alanı satırındaki 'F9' tuşuna basarak kodda herhangi bir kesme noktası ayarlayabilirsiniz.

Hata ayıklamaya başladıktan sonra işleviniz yerel olarak çalışır. İsteği localhost'a göndermek için Postman veya Fiddler gibi bir araç kullanabilirsiniz. Terminal penceresinde yerel uç noktanızın konumunu not edin.

Azure'da işlev uygulaması oluşturma

İşlev davranışından memnun olduğunuzda yayımlayabilirsiniz. Şu ana kadar yerel olarak çalışıyordun. Bu bölümde Azure'da bir işlev uygulaması oluşturacak ve ardından yerel projeyi oluşturduğunuz uygulamaya dağıtacaksınız.

Visual Studio Code'dan uygulama oluşturma

  1. Visual Studio Code'da F1 tuşuna basarak komut paletini açın. Komut paletinde, Azure'da İşlev Uygulaması Oluştur arayın ve seçin.

  2. Birden çok etkin aboneliğiniz varsa bu uygulamanın aboneliğini seçin.

  3. İşlev uygulaması için genel olarak benzersiz bir ad girin. URL için geçerli bir ad yazın.

  4. Bir çalışma zamanı yığını seçin ve yerel olarak çalıştırdığınız dil sürümünü seçin.

  5. Uygulamanız için bir konum seçin. Mümkünse, arama hizmetinizi de barındıran bölgeyi seçin.

Uygulamanın oluşturulması birkaç dakika sürer. Hazır olduğunda, etkin aboneliğin Kaynaklar ve İşlev Uygulaması altında yeni uygulamayı görürsünüz.

Azure'a dağıtma

  1. Hala Visual Studio Code'da, komut paletini açmak için F1 tuşuna basın. Komut paletinde İşlev Uygulamasına Dağıt... öğesini arayın ve seçin..

  2. Oluşturduğunuz işlev uygulamasını seçin.

  3. Devam etmek istediğinizi onaylayın ve Dağıt'ı seçin. Dağıtım durumunu çıkış penceresinde izleyebilirsiniz.

  4. Azure portalına geçin, Tüm Kaynaklaradresine gidin. Önceki adımda sağladığınız genel benzersiz adı kullanarak dağıttığınız işlev uygulamasını arayın.

    Bahşiş

    Ayrıca Visual Studio Code'da işlev uygulamasına sağ tıklayıp Portalda Açseçeneğini belirleyebilirsiniz.

  5. Portalda, sol tarafta İşlevler seçin ve ardından oluşturduğunuz işlevi seçin.

  6. İşlevin genel bakış sayfasında, en üstteki komut çubuğunda İşlev URL'sini al seçin. Bu, işlevi çağırmak için URL'yi kopyalamanıza olanak tanır.

    Azure portalında İşlev URL'sini Al komutunun ekran görüntüsü.

İşlevi Azure'da test edin

Kopyaladığınız varsayılan konak anahtarını ve URL'yi kullanarak işlevinizi Azure portalından test edin.

  1. Geliştirici altında, sol tarafta, Code + Testöğesini seçin.

  2. Komut çubuğunda Test/Çalıştır'i seçin.

  3. Giriş için, Postkullanın, varsayılan anahtarı kullanın ve ardından istek gövdesine yapıştırın:

    {
        "values": [
            {
                "recordId": "e1",
                "data":
                {
                    "text1":  "Hello",
                    "text2":  "World"
                }
            },
            {
                "recordId": "e2",
                "data": "This is an invalid input"
            }
        ]
    }
    
  4. 'i seçin.

    Giriş belirtimi ekran görüntüsü

Bu örnek, işlevi yerel ortamda çalıştırırken daha önce gördüğünüz sonucun aynısını üretmelidir.

Beceri kümesine ekleme

Artık yeni bir özel beceriniz olduğuna göre, beceri kümesine ekleyebilirsiniz. Aşağıdaki örnekte, belgenin Başlığı ve Yazarı'nı tek bir alanda birleştirme becerisini nasıl çağırabileceğiniz gösterilmektedir ve bu alanda merged_title_author diyoruz.

[your-function-url-here] değerini yeni Azure İşlevinizin URL'si ile değiştirin.

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

"Dizinleyici tanımına 'merged_title_author' öğesini arama dizininde bir 'tam ad' alanına göndermek için 'outputFieldMapping' eklemeyi unutmayın."

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