Megosztás a következőn keresztül:


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.

  • Jelentkezzen be a Microsoft Fabricbe.

  • A kezdőlap bal alsó részén található élménykapcsolóval válthat Fabricre.

    Képernyőkép a felületváltó menüjéről, amelyen látható, hogy hol válassza ki a Adattudomány.

Ú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

  1. Töltse le ezt a bemutatót jegyzetfüzetként (válassza a Nyers lehetőséget, majd mentse a fájlt)
  2. Importálja a jegyzetfüzetet a Synapse-munkaterületre , vagy ha hálóimportálást használ a Háló munkaterületre
  3. 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.
  4. 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_namedeployment_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 OpenAIEmbeddingtová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 FixedMiniBatcherTransformerhaszná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))