Azure OpenAI big data-hoz
Az Azure OpenAI szolgáltatás számos természetes nyelvi feladat megoldására használható a befejezési API kérésével. Annak érdekében, hogy megkönnyítsük a kérvényezési munkafolyamatok skálázását néhány példából a nagy méretű adathalmazokra, az Azure OpenAI szolgáltatást integráltuk az elosztott gépi tanulási könyvtárral , a SynapseML-vel. Ez az integráció megkönnyíti az Apache Spark elosztott számítástechnikai keretrendszer használatát több millió kérés feldolgozásához az OpenAI szolgáltatással. Ez az oktatóanyag bemutatja, hogyan alkalmazhat nagy nyelvi modelleket elosztott méretekben az Azure OpenAI és az Azure Synapse Analytics használatával.
Előfeltételek
A rövid útmutató fő előfeltételei közé tartozik egy működő Azure OpenAI-erőforrás és egy Telepített SynapseML-et tartalmazó Apache Spark-fürt.
Microsoft Fabric-előfizetés lekérése. Vagy regisztráljon egy ingyenes Microsoft Fabric-próbaverzióra.
A kezdőlap bal alsó részén található élménykapcsolóval válthat Fabricre.
- Lépjen a Microsoft Fabric Adattudomány felületére.
- Hozzon létre egy új jegyzetfüzetet.
- Azure OpenAI-erőforrás: Hozzáférés kérése az Azure OpenAI szolgáltatáshoz erőforrás létrehozása előtt
Útmutató importálása jegyzetfüzetként
A következő lépés a kód hozzáadása a Spark-fürthöz. Létrehozhat egy jegyzetfüzetet a Spark platformon, és a bemutató futtatásához másolja a kódot ebbe a jegyzetfüzetbe. Vagy töltse le a jegyzetfüzetet, és importálja a Synapse Analyticsbe
- Töltse le ezt a bemutatót jegyzetfüzetként (válassza a Nyers lehetőséget, majd mentse a fájlt)
- Importálja a jegyzetfüzetet a Synapse-munkaterületre , vagy ha hálóimportálást használ a Háló munkaterületre
- Telepítse a SynapseML-t a fürtre. Tekintse meg a Synapse telepítési utasításait a SynapseML webhely alján. Ha Hálót használ, ellenőrizze a telepítési útmutatót. Ehhez be kell illeszteni egy további cellát az importált jegyzetfüzet tetején.
- Csatlakoztassa a jegyzetfüzetet egy fürthöz, és kövesse, szerkessze és futtassa a cellákat.
Szolgáltatásadatok megadása
Ezután szerkessze a jegyzetfüzet celláját, hogy a szolgáltatásra mutasson. A , , service_name
deployment_name
és location
változókat különösen úgy állítsa bekey
, hogy megfeleljenek az OpenAI szolgáltatásnak:
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
Kérések adatkészletének létrehozása
Ezután hozzon létre egy sorsorból álló adatkeretet, amely soronként egy parancssort tartalmaz.
Az adatokat közvetlenül az ADLS-ből vagy más adatbázisokból is betöltheti. A Spark-adatkeretek betöltéséről és előkészítéséről további információt az Apache Spark adatbetöltési útmutatójában talál.
df = spark.createDataFrame(
[
("Hello my name is",),
("The best code is code thats",),
("SynapseML is ",),
]
).toDF("prompt")
Az OpenAICompletion Apache Spark-ügyfél létrehozása
Ha az OpenAI-befejezési szolgáltatást a létrehozott adatkeretre szeretné alkalmazni, hozzon létre egy OpenAICompletion objektumot, amely elosztott ügyfélként szolgál. A szolgáltatás paraméterei beállíthatók egyetlen értékkel, vagy az adatkeret egy oszlopával az objektum megfelelő beállítóival OpenAICompletion
. Itt 200-ra állítunk maxTokens
. Egy jogkivonat körülbelül négy karakterből áll, és ez a korlát a parancssor és az eredmény összegére vonatkozik. A paramétert az promptCol
adatkeret parancssori oszlopának nevével is beállítjuk.
from synapse.ml.cognitive import OpenAICompletion
completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setPromptCol("prompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Az adatkeret átalakítása az OpenAICompletion-ügyféllel
Az adatkeret és a befejező ügyfél befejezése után átalakíthatja a bemeneti adatkészletet, és hozzáadhat egy oszlopot completions
, amely a szolgáltatás által hozzáadott összes információval együtt van meghívva. Az egyszerűség kedvéért csak a szöveget jelölje ki.
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 kimenetnek így kell kinéznie. A befejezési szöveg eltér a mintától.
haladéktalan | hiba | text |
---|---|---|
Hello my name is | null | Makaveli Vagyok tizennyolc éves, és azt akarom, hogy a rapper, amikor felnövekszik szeretek írni és zenét vagyok Los Angeles, CA |
A legjobb kód a kód, amely | null | érthető Ez egy szubjektív állítás, és nincs végleges válasz. |
A SynapseML | null | Egy gépi tanulási algoritmus, amely képes megtanulni, hogyan lehet előrejelezni az események jövőbeli kimenetelét. |
További használati példák
Szövegbeágyazások létrehozása
A szöveg kitöltése mellett beágyazott szöveget is beágyazhatunk alsóbb rétegbeli algoritmusokban vagy vektorlekérési architektúrákban való használatra. A beágyazások létrehozása lehetővé teszi a dokumentumok keresését és lekérését nagy gyűjteményekből, és akkor is használható, ha a parancssori tervezés nem elegendő a feladathoz. A használatról OpenAIEmbedding
további információt a beágyazási útmutatónkban talál.
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))
Csevegés befejezése
Az olyan modellek, mint a ChatGPT és a GPT-4, képesek megérteni a csevegéseket egyetlen üzenet helyett. A OpenAIChatCompletion
transzformátor nagy léptékben teszi elérhetővé ezt a funkciót.
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"
)
)
Az átviteli sebesség javítása a kérések kötegelésével
A példa több kérést küld a szolgáltatásnak, egy-egy kérést minden egyes kérdéshez. Ha több kérést szeretne végrehajtani egyetlen kérelemben, használjon kötegelt módot. Először az OpenAICompletion objektumban a Parancssor oszlop "Prompt" értékre állítása helyett adja meg a BatchPrompt oszlophoz tartozó "batchPrompt" értéket. Ehhez hozzon létre egy adatkeretet, amely soronként tartalmazza a parancssorok listáját.
Ebben az írásban jelenleg 20 kérés van egy kérelemben, és a 2048-as "jogkivonatok" szigorú korlátja, azaz körülbelül 1500 szó.
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")
Ezután létrehozzuk az OpenAICompletion objektumot. A parancssori oszlop beállítása helyett állítsa be a batchPrompt oszlopot, ha az oszlop típusa Array[String]
.
batch_completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setBatchPromptCol("batchPrompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Az átalakításra irányuló hívásban soronként egy kérést küld a rendszer. Mivel egyetlen sorban több kérés is található, a rendszer minden kérést az adott sorban lévő összes kéréssel együtt küld el. Az eredmények a kérelem minden sorához tartalmaznak egy sort.
completed_batch_df = batch_completion.transform(batch_df).cache()
display(completed_batch_df)
Automatikus minibatcher használata
Ha az adatok oszlopformátumban találhatóak, a SynapseML FixedMiniBatcherTransformer
használatával sorformátumba transzponálást végezhet.
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)
Fordítási kérés
Az Azure OpenAI szolgáltatás számos különböző természetes nyelvi feladatot képes megoldani gyors tervezéssel. Itt egy példát mutatunk be a nyelvi fordítás kérésére:
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))
Kérdés megválaszolásának kérése
Itt a GPT-3-at kérdezzük meg az általános ismeretekkel kapcsolatos kérdések megválaszolására:
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))