İngilizce dilinde oku

Aracılığıyla paylaş


Büyük veriler için Azure OpenAI

Azure OpenAI hizmeti, tamamlama API'sini sorarak çok sayıda doğal dil görevini çözmek için kullanılabilir. İstem içeren iş akışlarınızı birkaç örnekten büyük örnek veri kümelerine ölçeklendirmeyi kolaylaştırmak için Azure OpenAI hizmetini dağıtılmış makine öğrenmesi kitaplığı SynapseML ile tümleştirdik. Bu tümleştirme, OpenAI hizmetiyle 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

Bu hızlı başlangıcın temel önkoşulları, çalışan bir Azure OpenAI kaynağı ve SynapseML yüklü bir Apache Spark kümesidir.

Bu kılavuzu not defteri olarak içeri aktar

Sonraki adım, bu kodu Spark kümenize eklemektir. Spark platformunuzda bir not defteri oluşturabilir ve tanıtımı çalıştırmak için kodu bu not defterine kopyalayabilirsiniz. Veya not defterini indirip Synapse Analytics'e aktarın

  1. Bu tanıtımı not defteri olarak indirin (Ham'ı seçin ve dosyayı kaydedin)
  2. Not defterini Synapse Çalışma Alanı'na veya Doku içeri aktarmayı doku çalışma alanına kullanıyorsanız içeri aktarma
  3. SynapseML'yi kümenize yükleyin. SynapseML web sitesinin alt kısmındaki Synapse yükleme yönergelerine bakın. Doku kullanıyorsanız Yükleme Kılavuzu'nu denetleyin. Bunun için, içeri aktardığınız not defterinin en üstüne fazladan bir hücre yapıştırılması gerekir.
  4. Not defterinizi bir kümeye bağlayın ve hücreleri düzenleyip çalıştırarak izleyin.

Hizmet bilgilerini doldurma

Ardından, not defterindeki hücreyi hizmetinize işaret eden şekilde düzenleyin. Özellikle , deployment_name, locationve key değişkenlerini OpenAI hizmetinizle eşleşecek şekilde ayarlayınservice_name:

import os
from pyspark.sql import SparkSession
from synapse.ml.core.platform import running_on_synapse, find_secret

# Bootstrap Spark Session
spark = SparkSession.builder.getOrCreate()

if running_on_synapse():
    from notebookutils.visualization import display

# Fill in the following lines with your service information
# Learn more about selecting which embedding model to choose: https://openai.com/blog/new-and-improved-embedding-model
service_name = "synapseml-openai"
deployment_name = "gpt-35-turbo"
deployment_name_embeddings = "text-embedding-ada-002"

key = find_secret(
    "openai-api-key"
)  # please replace this line with your key as a string

assert key is not None and service_name is not None

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

Ardından, satır başına bir istem içeren bir dizi satırdan oluşan bir veri çerçevesi oluşturun.

Verileri doğrudan ADLS'den veya diğer veritabanlarından da yükleyebilirsiniz. Spark veri çerçevelerini yükleme ve hazırlama hakkında daha fazla bilgi için Apache Spark veri yükleme kılavuzuna bakın.

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

OpenAICompletion Apache Spark İstemcisi oluşturma

Oluşturduğunuz veri çerçevenize OpenAI Tamamlama hizmetini uygulamak için, dağıtılmış istemci olarak hizmet veren bir OpenAICompletion nesnesi oluşturun. Hizmetin parametreleri tek bir değerle veya nesne üzerinde OpenAICompletion uygun ayarlayıcılarla veri çerçevesinin bir sütunu tarafından ayarlanabilir. Burada 200 olarak ayarlıyoruz maxTokens . Belirteç dört karakter civarındadır ve bu sınır istem ve sonucun toplamı için geçerlidir. Ayrıca parametresini promptCol veri çerçevesindeki istem sütununun adıyla ayarlıyoruz.

from synapse.ml.cognitive import OpenAICompletion

completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setCustomServiceName(service_name)
    .setMaxTokens(200)
    .setPromptCol("prompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

OpenAICompletion İstemcisi ile veri çerçevesini dönüştürme

Veri çerçevesini ve tamamlanma istemcisini tamamladıktan sonra, giriş veri kümenizi dönüştürebilir ve hizmetin eklediği tüm bilgileri içeren adlı completions bir sütun ekleyebilirsiniz. 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"),
    )
)

Çıkışınız şuna benzer olmalıdır. Tamamlanma metni örnekten farklı olacaktır.

Istemi hata text
Merhaba benim adım boş Makaveli 18 yaşındayım ve büyüdüğüm zaman rapçi olmak istiyorum.
En iyi kod şu koddur: boş anlaşılabilir Bu öznel bir ifadedir ve kesin bir yanıt yoktur.
SynapseML şudur: boş Olayların gelecekteki sonuçlarını tahmin etmeyi öğrenebilen bir makine öğrenmesi algoritması.

Diğer Kullanım Örnekleri

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. kullanma OpenAIEmbeddinghakkında daha fazla bilgi için ekleme kılavuzumuza bakın.

from synapse.ml.cognitive import OpenAIEmbedding

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. Transformatör OpenAIChatCompletion bu işlevi büyük ölçekte kullanıma sunar.

from synapse.ml.cognitive 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"
    )
)

İstek toplu işlemiyle aktarım hızını geliştirme

Örnek, hizmete her istem için bir tane olmak üzere birkaç istekte bulunur. Tek bir istekte birden çok istem tamamlamak için toplu iş modunu kullanın. İlk olarak, OpenAICompletion nesnesinde, İstem sütununu "İstem" olarak ayarlamak yerine BatchPrompt sütunu için "batchPrompt" değerini belirtin. Bunu yapmak için satır başına istem listesini içeren bir veri çerçevesi oluşturun.

Bu yazıdan itibaren şu anda tek bir istekte 20 istem sınırı ve 2048 "belirteçler" veya yaklaşık 1500 sözcük sabit sınırı vardır.

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 OpenAICompletion nesnesini oluşturacağız. İstem sütununu ayarlamak yerine, sütununuz türündeyse Array[String]batchPrompt sütununu ayarlayın.

batch_completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setCustomServiceName(service_name)
    .setMaxTokens(200)
    .setBatchPromptCol("batchPrompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

Dönüştürme çağrısında satı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 bir minibatcher kullanma

Verileriniz sütun biçimindeyse SynapseML'nin FixedMiniBatcherTransformeröğesini kullanarak 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 that our 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 hizmeti, istem mühendisliği aracılığıyla birçok farklı doğal dil görevini çözebilir. Burada, dil çevirisi isteme örneğini göstereceğiz:

translate_df = spark.createDataFrame(
    [
        ("Japanese: Ookina hako \nEnglish: Big box \nJapanese: Midori tako\nEnglish:",),
        (
            "French: Quel heure et il au Montreal? \nEnglish: What time is it in Montreal? \nFrench: Ou est le poulet? \nEnglish:",
        ),
    ]
).toDF("prompt")

display(completion.transform(translate_df))

Soru yanıtlama istemi

Burada GPT-3'e genel bilgi sorusunun yanıtlanması için soracağız:

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