Azure OpenAI pre veľké objemy údajov
Službu Azure OpenAI možno použiť na riešenie veľkého počtu úloh v prirodzenom jazyku s výzvou na dokončenie rozhrania API. Na uľahčenie škálovania spustených pracovných postupov z niekoľkých príkladov na veľké množiny údajov príkladov sme integrovali službu Azure OpenAI s knižnicou synapseML distribuovaného strojového učenia. Táto integrácia uľahčuje použitie architektúry distribuovaného computingu služby Apache Spark na spracovanie miliónov výziev pomocou služby OpenAI. V tomto kurze sa dozviete, ako používať veľké jazykové modely na distribuovanej škále pomocou služieb Azure OpenAI a Azure Synapse Analytics.
Medzi kľúčové predpoklady tohto rýchleho štartu patrí pracovný zdroj Azure OpenAI a klaster Apache Spark s nainštalovanou službou SynapseML.
Získajte predplatné na Microsoft Fabric. Alebo si zaregistrujte bezplatnú skúšobnú verziu služby Microsoft Fabric.
Prihláste sa do služby Microsoft Fabric.
Pomocou prepínača skúseností na ľavej strane domovskej stránky prepnite na prostredie Synapse Data Science.
- Prejdite na skúsenosti z dátovej vedy v službe Microsoft Fabric.
- Vytvorte nový poznámkový blok.
- Prostriedok Azure OpenAI: Vyžiadanie prístupu k službe Azure OpenAI pred vytvorením prostriedku
Ďalším krokom je pridanie tohto kódu do klastra Spark. Môžete buď vytvoriť poznámkový blok vo svojej platforme Spark a skopírovať kód do tohto notebooku a spustiť predvádzaciu verziu. Prípadne stiahnite poznámkový blok a importujte ho do služby Synapse Analytics.
- Stiahnite si túto ukážku ako poznámkový blok (vyberte možnosť Nespracované a uložte súbor).
- Naimportujte poznámkový blok do pracovného priestoru synapse, alebo ak sa pomocou služby Fabric importuje do pracovného priestoru služby Fabric
- Nainštalujte do klastra synapseML. Pozrite si pokyny na inštaláciu služby Synapse v dolnej časti webovej lokality SynapseML. Ak používate službu Fabric, pozrite si Inštalačnú príručku. To si vyžaduje prilepenie dodatočnej bunky do hornej časti notebooku, ktorý ste importovali.
- Pripojte poznámkový blok ku klastru a postupujte podľa úprav a spúšťania buniek.
Potom upravte bunku v poznámkovom bloku tak, aby smerla na vašu službu. Nastavte service_name
najmä premenné , deployment_name
, location
a key
tak, aby sa zhodovali s vašou službou OpenAI:
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
Potom vytvorte údajový rámec pozostávajúci z radu riadkov s jedným riadkom.
Môžete tiež načítať údaje priamo z ADLS alebo iných databáz. Ďalšie informácie o načítavaní a príprave údajových rámcov Spark nájdete v príručke načítania údajov služby Apache Spark.
df = spark.createDataFrame(
[
("Hello my name is",),
("The best code is code thats",),
("SynapseML is ",),
]
).toDF("prompt")
Ak chcete použiť službu dokončovania OpenAI na údajový rámec, ktorý ste vytvorili, vytvorte objekt OpenAICompletion, ktorý slúži ako distribuovaný klient. Parametre služby je možné nastaviť buď jednou hodnotou, alebo stĺpcom údajového rámca s príslušnými nastavovačmi v objekte OpenAICompletion
. Tu nastavujeme maxTokens
na 200. Token je približne štyri znaky a tento limit sa vzťahuje na súčet výzvy a výsledku. Parameter nastavíme aj promptCol
s názvom stĺpca výzvy v údajovom rámci.
from synapse.ml.cognitive import OpenAICompletion
completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setPromptCol("prompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Po dokončení údajového rámca a klienta dokončenia môžete transformovať svoju vstupnú množinu údajov a pridať stĺpec s názvom completions
so všetkými informáciami, ktoré služba pridá. Pre jednoduchosť vyberte len text.
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"),
)
)
Výstup by mal vyzerať približne takto. Text dokončenia sa bude líšiť od vzorky.
okamžitý | chyba | Text |
---|---|---|
Hello my name is | null | Makaveli Som osemnásť rokov a chcem byť rapper, keď vyrastiem milujem písanie a vytváranie hudby som z Los Angeles, CA |
Najlepším kódom je kód, ktorý je | null | zrozumiteľné Toto je subjektívne vyhlásenie a neexistuje žiadna definitívna odpoveď. |
SynapseML je | null | Algoritmus strojového učenia, ktorý je schopný naučiť sa predpovedať budúci výsledok udalostí. |
Okrem dokončenia textu môžeme vložiť aj text na použitie v následných algoritmoch alebo v architektúrach načítania vektorov. Vytvorenie vložení umožňuje vyhľadávať a načítavať dokumenty z veľkých kolekcií a možno ich použiť v prípade, že výzva nie je pre úlohu postačujúca. Ďalšie informácie o používaní OpenAIEmbedding
nájdete v našom sprievodcovi vkladaním.
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))
Modely ako ChatGPT a GPT-4 dokážu porozumieť chatom namiesto jednotlivých výziev. Transformátor OpenAIChatCompletion
sprístupňuje túto funkciu vo väčšom meradle.
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"
)
)
V príklade sa vykoná niekoľko požiadaviek na službu, jedna pre každú výzvu. Ak chcete dokončiť viacero výziev v jednej žiadosti, použite dávkový režim. Najskôr v objekte OpenAICompletion namiesto nastavenia stĺpca Výzva zadajte položku batchPrompt pre stĺpec BatchPrompt. Ak to chcete urobiť, vytvorte údajový rámec so zoznamom výziev na riadok.
V dobe písania tohto textu je v súčasnosti limit 20 výziev v jednej požiadavke a pevný limit 2 048 "tokenov" alebo približne 1 500 slov.
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")
Ďalej vytvoríme objekt OpenAICompletion. Namiesto nastavenia stĺpca príkazu nastavte stĺpec batchPrompt, ak má váš stĺpec typ Array[String]
.
batch_completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setBatchPromptCol("batchPrompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Vo výzve na transformáciu sa vykoná žiadosť pre každý riadok. Keďže v jednom riadku je viacero výziev, každá žiadosť sa odošle so všetkými výzvami v tomto riadku. Výsledky obsahujú riadok pre každý riadok v žiadosti.
completed_batch_df = batch_completion.transform(batch_df).cache()
display(completed_batch_df)
Ak sú vaše údaje vo formáte stĺpca, môžete ich transponovať na formát riadka pomocou knižnice SynapseML.FixedMiniBatcherTransformer
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)
Služba Azure OpenAI dokáže vyriešiť množstvo rôznych úloh v prirodzenom jazyku pomocou rýchleho technického oddelenia. Tu uvádzame príklad výzvy na preklad jazyka:
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))
V tomto príklade vyzveme gpt-3 na zodpovedanie otázky so všeobecnými znalosťami:
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))