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.
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.
Microsoft Fabric aboneliği alın. Alternatif olarak, ücretsiz bir Microsoft Fabric deneme sürümüne kaydolun.
Synapse Veri Bilimi deneyimine geçmek için giriş sayfanızın sol tarafındaki deneyim değiştiriciyi kullanın.
- Microsoft Fabric'te Veri Bilimi deneyimine gidin.
- Yeni bir not defteri oluşturun.
- Azure OpenAI kaynağı: Kaynak oluşturmadan önce Azure OpenAI Hizmetine Erişim İsteme
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
- Bu tanıtımı not defteri olarak indirin (Ham'ı seçin ve dosyayı kaydedin)
- Not defterini Synapse Çalışma Alanı'na veya Doku içeri aktarmayı doku çalışma alanına kullanıyorsanız içeri aktarma
- 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.
- Not defterinizi bir kümeye bağlayın ve hücreleri düzenleyip çalıştırarak izleyin.
Ardından, not defterindeki hücreyi hizmetinize işaret eden şekilde düzenleyin. Özellikle , deployment_name
, location
ve 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
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")
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")
)
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ı. |
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 OpenAIEmbedding
hakkı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))
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"
)
)
Ö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)
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)
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))
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))