Aracılığıyla paylaş


Azure OpenAI'i büyük veri kümeleriyle kullanma

Azure OpenAI, tamamlanma API'sini sorarak çok sayıda doğal dil görevini çözmek için kullanılabilir. İstenen iş akışlarınızı birkaç örnekten büyük örnek veri kümelerine ölçeklendirmeyi kolaylaştırmak için Azure OpenAI Hizmeti, dağıtılmış makine öğrenmesi kitaplığı SynapseML ile tümleşiktir. Bu tümleştirme, Azure OpenAI Hizmeti ile milyonlarca istem işlemek için Apache Spark dağıtılmış bilgi işlem çerçevesini kullanmayı kolaylaştırır.

Bu öğreticide, Azure OpenAI ve Azure Synapse Analytics kullanılarak dağıtılmış ölçekte büyük dil modellerinin nasıl uygulanacağı gösterilmektedir.

Önkoşullar

  • Azure aboneliği. Ücretsiz bir tane oluşturun.

  • Azure aboneliğinizde Azure OpenAI'ye erişim izni verilir.

    Şu anda Azure OpenAI Hizmeti'ne erişmek için bir uygulama göndermeniz gerekir. Erişime başvurmak için bu formu doldurun. Yardıma ihtiyacınız varsa Microsoft'a başvurmak için bu depoda bir sorun açın.

  • Azure OpenAI kaynağı. Kaynak oluşturma.

  • SynapseML yüklü bir Apache Spark kümesi.

Not

OpenAICompletion() Transformatör, gibi istem tabanlı tamamlamaları destekleyen Azure OpenAI Hizmeti eski modelleriyle Text-Davinci-003çalışacak şekilde tasarlanmıştır. Geçerli GPT-3.5 Turbo ve GPT-4 model serisi gibi daha yeni modeller, giriş olarak özel olarak biçimlendirilmiş bir ileti dizisi bekleyen yeni sohbet tamamlama API'siyle çalışacak şekilde tasarlanmıştır. Eklemeler veya sohbet tamamlama modelleri ile çalışıyorsanız lütfen Sohbet Tamamlama ve Metin Ekleme Oluşturma bölümlerine göz atın.

Azure OpenAI SynapseML tümleştirmesi, OpenAIChatCompletion() dönüştürücüsü aracılığıyla en son modelleri destekler.

Azure Synapse çalışma alanı oluşturmanızı öneririz. Ancak paketle pyspark Azure Databricks, Azure HDInsight, Kubernetes üzerinde Spark veya Python ortamını da kullanabilirsiniz.

Örnek kodu not defteri olarak kullanma

Bu makaledeki örnek kodu Apache Spark kümenizle birlikte kullanmak için aşağıdaki adımları tamamlayın:

  1. Yeni veya var olan bir not defterini hazırlayın.

  2. Apache Spark kümenizi not defterinizle Bağlan.

  3. Not defterinize Apache Spark kümeniz için SynapseML yükleyin.

  4. Not defterini Azure OpenAI hizmeti kaynağınızla çalışacak şekilde yapılandırın.

Not defterinizi hazırlama

Apache Spark platformunuzda yeni bir not defteri oluşturabilir veya mevcut bir not defterini içeri aktarabilirsiniz. Bir not defteriniz olduktan sonra, bu makaledeki her örnek kod parçacığını not defterinize yeni bir hücre olarak ekleyebilirsiniz.

  • Azure Synapse Analytics'te not defteri kullanmak için bkz . Azure Synapse Analytics'te Synapse not defterleri oluşturma, geliştirme ve sürdürme.

  • Azure Databricks'te not defteri kullanmak için bkz . Azure Databricks için not defterlerini yönetme.

  • (İsteğe bağlı) Bu tanıtım not defterini indirin ve çalışma alanınıza bağlayın. İndirme işlemi sırasında Ham'ı seçin ve dosyayı kaydedin.

Kümenizi Bağlan

Hazır bir not defteriniz olduğunda, not defterinizi bir Apache Spark kümesine bağlayın veya ekleyin .

SynapseML'yi yükleme

Alıştırmaları çalıştırmak için Apache Spark kümenize SynapseML yüklemeniz gerekir. Daha fazla bilgi için bkz . SynapseML web sitesinde SynapseML'yi yükleme.

SynapseML'yi yüklemek için not defterinizin üst kısmında yeni bir hücre oluşturun ve aşağıdaki kodu çalıştırın.

  • Spark3.2 havuzu için aşağıdaki kodu kullanın:

    %%configure -f
    {
       "name": "synapseml",
       "conf": {
           "spark.jars.packages": "com.microsoft.azure:synapseml_2.12:0.11.2,org.apache.spark:spark-avro_2.12:3.3.1",
           "spark.jars.repositories": "https://mmlspark.azureedge.net/maven",
           "spark.jars.excludes": "org.scala-lang:scala-reflect,org.apache.spark:spark-tags_2.12,org.scalactic:scalactic_2.12,org.scalatest:scalatest_2.12,com.fasterxml.jackson.core:jackson-databind",
           "spark.yarn.user.classpath.first": "true",
           "spark.sql.parquet.enableVectorizedReader": "false",
           "spark.sql.legacy.replaceDatabricksSparkAvro.enabled": "true"
       }
    }
    
  • Spark3.3 havuzu için aşağıdaki kodu kullanın:

    %%configure -f
    {
       "name": "synapseml",
       "conf": {
           "spark.jars.packages": "com.microsoft.azure:synapseml_2.12:0.11.2-spark3.3",
           "spark.jars.repositories": "https://mmlspark.azureedge.net/maven",
           "spark.jars.excludes": "org.scala-lang:scala-reflect,org.apache.spark:spark-tags_2.12,org.scalactic:scalactic_2.12,org.scalatest:scalatest_2.12,com.fasterxml.jackson.core:jackson-databind",
           "spark.yarn.user.classpath.first": "true",
           "spark.sql.parquet.enableVectorizedReader": "false"
       }
    }
    

Bağlantı işlemi birkaç dakika sürebilir.

Not defterini yapılandırma

Yeni bir kod hücresi oluşturun ve aşağıdaki kodu çalıştırarak not defterini hizmetiniz için yapılandırın. resource_name, deployment_name, locationve key değişkenlerini Azure OpenAI kaynağınıza karşılık gelen değerlere ayarlayın.

import os

# Replace the following values with your Azure OpenAI resource information
resource_name = "<RESOURCE_NAME>"      # The name of your Azure OpenAI resource.
deployment_name = "<DEPLOYMENT_NAME>"  # The name of your Azure OpenAI deployment.
location = "<RESOURCE_LOCATION>"       # The location or region ID for your resource.
key = "<RESOURCE_API_KEY>"             # The key for your resource.

assert key is not None and resource_name is not None

Artık örnek kodu çalıştırmaya başlamaya hazırsınız.

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.

İstemlerden oluşan bir veri kümesi oluşturma

İlk adım, satır başına bir istem içeren bir dizi satırdan oluşan bir veri çerçevesi oluşturmaktır.

Verileri doğrudan Azure Data Lake Depolama veya diğer veritabanlarından da yükleyebilirsiniz. Spark veri çerçevelerini yükleme ve hazırlama hakkında daha fazla bilgi için bkz . Apache Spark Veri Kaynakları.

df = spark.createDataFrame(
    [
        ("Hello my name is",),
        ("The best code is code that's",),
        ("SynapseML is ",),
    ]
).toDF("prompt")

OpenAICompletion Apache Spark istemcisini oluşturma

Azure OpenAI Tamamlama oluşturma işlemini veri çerçevesine uygulamak için dağıtılmış istemci olarak hizmet veren bir OpenAICompletion nesne oluşturun. Parametreler tek bir değerle veya nesnede OpenAICompletion uygun ayarlayıcılarla veri çerçevesinin bir sütunu tarafından ayarlanabilir.

Bu örnekte parametresini maxTokens 200 olarak ayarlarsınız. Belirteç dört karakter civarındadır ve bu sınır istem ve sonucun toplamı için geçerlidir. Ayrıca parametreyipromptCol, veri çerçevesindeki istem sütununun adıyla (istem gibi) ayarlarsınız.

from synapse.ml.cognitive import OpenAICompletion

completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setUrl("https://{}.openai.azure.com/".format(resource_name))
    .setMaxTokens(200)
    .setPromptCol("prompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

OpenAICompletion istemcisiyle veri çerçevesini dönüştürme

Veri çerçevesini ve tamamlama istemcisini aldıktan sonra, giriş veri kümenizi dönüştürebilir ve Azure OpenAI tamamlama API'sinden oluşturulan tüm metinlerle birlikte adlı completions bir sütun ekleyebilirsiniz. Bu örnekte basitlik için yalnızca metni seçin.

from pyspark.sql.functions import col

completed_df = completion.transform(df).cache()
display(completed_df.select(
  col("prompt"), col("error"), col("completions.choices.text").getItem(0).alias("text")))

Aşağıdaki görüntüde Azure Synapse Analytics Studio'da tamamlamaları olan örnek çıktı gösterilmektedir. Tamamlama metinlerinin farklılık gösterebileceğini unutmayın. Çıkışınız farklı görünebilir.

Screenshot that shows sample completions in Azure Synapse Analytics Studio.

Diğer kullanım senaryolarını keşfetme

Azure OpenAI Hizmeti ve büyük veri kümeleriyle çalışmaya yönelik diğer bazı kullanım örnekleri aşağıdadır.

Metin Ekleme Oluşturma

Metni tamamlamanın yanı sıra, aşağı akış algoritmalarında veya vektör alma mimarilerinde kullanmak üzere metin de ekleyebiliriz. Eklemeler oluşturmak, büyük koleksiyonlardan belge aramanıza ve almanıza olanak tanır ve istem mühendisliği görev için yeterli olmadığında kullanılabilir. OpenAIEmbedding kullanma hakkında daha fazla bilgi için ekleme kılavuzumuza bakın.

synapse.ml.services.openai import OpenAIEmbedding'ten

embedding = (
    OpenAIEmbedding()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name_embeddings)
    .setCustomServiceName(service_name)
    .setTextCol("prompt")
    .setErrorCol("error")
    .setOutputCol("embeddings")
)

display(embedding.transform(df))

Sohbet Tamamlama

ChatGPT ve GPT-4 gibi modeller tek istemler yerine sohbetleri anlayabilecek kapasitededir. OpenAIChatCompletion transformatörü bu işlevi büyük ölçekte kullanıma sunar.

from synapse.ml.services.openai import OpenAIChatCompletion
from pyspark.sql import Row
from pyspark.sql.types import *


def make_message(role, content):
    return Row(role=role, content=content, name=role)


chat_df = spark.createDataFrame(
    [
        (
            [
                make_message(
                    "system", "You are an AI chatbot with red as your favorite color"
                ),
                make_message("user", "Whats your favorite color"),
            ],
        ),
        (
            [
                make_message("system", "You are very excited"),
                make_message("user", "How are you today"),
            ],
        ),
    ]
).toDF("messages")

chat_completion = (
    OpenAIChatCompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setCustomServiceName(service_name)
    .setMessagesCol("messages")
    .setErrorCol("error")
    .setOutputCol("chat_completions")
)

display(
    chat_completion.transform(chat_df).select(
        "messages", "chat_completions.choices.message.content"
    )
)

OpenAICompletion'dan istek toplu işlemiyle aktarım hızını geliştirme

İstek toplu işlemiyle aktarım hızını artırmak için Azure OpenAI Hizmeti'ni büyük veri kümeleriyle kullanabilirsiniz. Önceki örnekte, hizmete her istem için bir tane olmak üzere birkaç istekte bulunursunuz. Tek bir istekte birden çok istem tamamlamak için toplu iş modunu kullanabilirsiniz.

OpenAItCompletion nesne tanımında, veri çerçevesini "batchPrompt" batchPrompt sütunu kullanacak şekilde yapılandırılacak değeri belirtirsiniz. Her satır için istem listesiyle veri çerçevesini oluşturun.

Not

Şu anda tek bir istekte 20 istem ve 2048 belirteç veya yaklaşık 1500 sözcük sınırı vardır.

Not

Şu anda istek toplu işlemi dönüştürücü tarafından OpenAIChatCompletion() desteklenmiyor.

batch_df = spark.createDataFrame(
    [
        (["The time has come", "Pleased to", "Today stocks", "Here's to"],),
        (["The only thing", "Ask not what", "Every litter", "I am"],),
    ]
).toDF("batchPrompt")

Ardından nesnesini oluşturun OpenAICompletion . Sütununuz türündeyseArray[String], değer yerine sütun başlığının promptCol değerini ayarlayınbatchPromptCol.

batch_completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setUrl("https://{}.openai.azure.com/".format(resource_name))
    .setMaxTokens(200)
    .setBatchPromptCol("batchPrompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

çağrısında transformsatır başına bir istek yapılır. Tek bir satırda birden çok istem olduğundan, her istek bu satırdaki tüm istemlerle gönderilir. Sonuçlar, istekteki her satır için bir satır içerir.

completed_batch_df = batch_completion.transform(batch_df).cache()
display(completed_batch_df)

Otomatik mini batcher kullanma

Veri biçimini değiştirmek için büyük veri kümeleriyle Azure OpenAI Hizmeti'ni kullanabilirsiniz. Verileriniz sütun biçimindeyse SynapseML FixedMiniBatcherTransformer nesnesini kullanarak verileri satır biçimine çevirebilirsiniz.

from pyspark.sql.types import StringType
from synapse.ml.stages import FixedMiniBatchTransformer
from synapse.ml.core.spark import FluentAPI

completed_autobatch_df = (df
 .coalesce(1) # Force a single partition so your little 4-row dataframe makes a batch of size 4 - you can remove this step for large datasets.
 .mlTransform(FixedMiniBatchTransformer(batchSize=4))
 .withColumnRenamed("prompt", "batchPrompt") 
 .mlTransform(batch_completion))

display(completed_autobatch_df)

Çeviri için mühendislik istemi

Azure OpenAI, istem mühendisliği aracılığıyla birçok farklı doğal dil görevini çözebilir. Daha fazla bilgi için bkz . Metin oluşturmayı veya işlemeyi öğrenme. Bu örnekte, dil çevirisi isteyebilirsiniz:

translate_df = spark.createDataFrame(
    [
        ("Japanese: Ookina hako \nEnglish: Big box \nJapanese: Midori tako\nEnglish:",),
        ("French: Quelle heure est-il à Montréal? \nEnglish: What time is it in Montreal? \nFrench: Où est le poulet? \nEnglish:",),
    ]
).toDF("prompt")

display(completion.transform(translate_df))

Soru yanıtlama istemi

Azure OpenAI ayrıca modelin Text-Davinci-003 genel bilgi sorusu yanıtlaması istemini de destekler:

qa_df = spark.createDataFrame(
    [
        (
            "Q: Where is the Grand Canyon?\nA: The Grand Canyon is in Arizona.\n\nQ: What is the weight of the Burj Khalifa in kilograms?\nA:",
        )
    ]
).toDF("prompt")

display(completion.transform(qa_df))

Sonraki adımlar

  • GPT-35 Turbo ve GPT-4 modelleriyle çalışmayı öğrenin.
  • Azure OpenAI Hizmeti modelleri hakkında daha fazla bilgi edinin.