De Azure OpenAI-service kan worden gebruikt om een groot aantal taken in natuurlijke taal op te lossen door de voltooiings-API te vragen. We hebben de Azure OpenAI-service geïntegreerd met de gedistribueerde Machine Learning-bibliotheek SynapseML om het schalen van uw promptwerkstromen eenvoudiger te maken van enkele voorbeelden naar grote gegevenssets met voorbeelden. Met deze integratie kunt u eenvoudig het gedistribueerde Framework voor gedistribueerde Apache Spark-computing gebruiken om miljoenen prompts te verwerken met de OpenAI-service. Deze zelfstudie laat zien hoe u grote taalmodellen toepast op een gedistribueerde schaal met behulp van Azure OpenAI en Azure Synapse Analytics.
Vereisten
De belangrijkste vereisten voor deze quickstart zijn een werkende Azure OpenAI-resource en een Apache Spark-cluster waarop SynapseML is geïnstalleerd.
De volgende stap bestaat uit het toevoegen van deze code aan uw Spark-cluster. U kunt een notebook maken in uw Spark-platform en de code naar dit notebook kopiëren om de demo uit te voeren. Of download het notebook en importeer het in Synapse Analytics
Installeer SynapseML op uw cluster. Zie de installatie-instructies voor Synapse onderaan de SynapseML-website. Als u Fabric gebruikt, raadpleegt u de installatiehandleiding. Hiervoor moet u een extra cel boven aan het notitieblok plakken dat u hebt geïmporteerd.
Verbind uw notebook met een cluster en volg deze, bewerk en voer de cellen uit.
Servicegegevens invullen
Bewerk vervolgens de cel in het notebook om naar uw service te verwijzen. Stel met name de service_namevariabelen , deployment_nameen locationkey variabelen in die overeenkomen met uw OpenAI-service:
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
Een gegevensset met prompts maken
Maak vervolgens een gegevensframe dat bestaat uit een reeks rijen, met één prompt per rij.
U kunt gegevens ook rechtstreeks vanuit ADLS of andere databases laden. Zie de Handleiding voor het laden van Apache Spark-gegevens voor meer informatie over het laden en voorbereiden van Spark-gegevensframes.
df = spark.createDataFrame(
[
("Hello my name is",),
("The best code is code thats",),
("SynapseML is ",),
]
).toDF("prompt")
De OpenAICompletion Apache Spark-client maken
Als u de OpenAI-voltooiingsservice wilt toepassen op uw dataframe dat u hebt gemaakt, maakt u een OpenAICompletion-object dat fungeert als een gedistribueerde client. Parameters van de service kunnen worden ingesteld met één waarde of door een kolom van het dataframe met de juiste setters op het OpenAICompletion object. Hier gaan we 200 instellen maxTokens . Een token is ongeveer vier tekens en deze limiet is van toepassing op de som van de prompt en het resultaat. We stellen de promptCol parameter ook in met de naam van de promptkolom in het dataframe.
Het gegevensframe transformeren met de OpenAICompletion-client
Nadat u het dataframe en de voltooiingsclient hebt voltooid, kunt u uw invoergegevensset transformeren en een kolom toevoegen die wordt aangeroepen completions met alle informatie die de service toevoegt. Selecteer alleen de tekst om het eenvoudig te maken.
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"),
)
)
Uw uitvoer ziet er ongeveer als volgt uit. De voltooiingstekst verschilt van het voorbeeld.
prompt
fout
tekst
Hallo mijn naam is
Nul
Mak oplopend ik ben achttien jaar oud en ik wil een rapster zijn als ik opgroei, ik hou van schrijven en muziek maken uit Los Angeles, CA
De beste code is code die
Nul
begrijpelijk Dit is een subjectieve verklaring en er is geen definitief antwoord.
SynapseML is
Nul
Een machine learning-algoritme dat kan leren hoe u het toekomstige resultaat van gebeurtenissen kunt voorspellen.
Meer gebruiksvoorbeelden
Tekst insluitingen genereren
Naast het voltooien van tekst kunnen we ook tekst insluiten voor gebruik in downstreamalgoritmen of vector ophalen architecturen. Met het maken van insluitingen kunt u documenten zoeken en ophalen uit grote verzamelingen en kunt u deze gebruiken wanneer prompt engineering niet voldoende is voor de taak. Zie onze handleiding voor insluiten voor meer informatie over het gebruikOpenAIEmbedding.
Modellen zoals ChatGPT en GPT-4 kunnen chats begrijpen in plaats van één prompt. De OpenAIChatCompletion transformator maakt deze functionaliteit op schaal beschikbaar.
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"
)
)
Doorvoer verbeteren met batchverwerking aanvragen
In het voorbeeld worden verschillende aanvragen naar de service verzonden, één voor elke prompt. Als u meerdere prompts in één aanvraag wilt voltooien, gebruikt u de batchmodus. Geef eerst in het OpenAICompletion-object in plaats van de kolom Prompt in te stellen op 'Prompt', 'batchPrompt' op voor de kolom BatchPrompt.
Hiervoor maakt u een dataframe met een lijst met prompts per rij.
Vanaf dit schrijven is er momenteel een limiet van 20 prompts in één aanvraag en een vaste limiet van 2048 'tokens' of ongeveer 1500 woorden.
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")
Vervolgens maken we het OpenAICompletion-object. In plaats van de promptkolom in te stellen, stelt u de kolom batchPrompt in als uw kolom van het type Array[String]is.
In de aanroep die moet worden getransformeerd, wordt er per rij een aanvraag gedaan. Omdat er meerdere prompts in één rij staan, wordt elke aanvraag verzonden met alle prompts in die rij. De resultaten bevatten een rij voor elke rij in de aanvraag.
Als uw gegevens een kolomindeling hebben, kunt u deze transponeren naar rijopmaak met behulp van 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)
Vraag engineering voor vertaling
De Azure OpenAI-service kan veel verschillende taken in natuurlijke taal oplossen via prompt-engineering. Hier ziet u een voorbeeld van het vragen om taalomzetting:
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))
Vragen om vragen beantwoorden
Hier vragen we GPT-3 om algemene kennisvragen te beantwoorden:
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))
In deze module leert u hoe prompt-engineering kan helpen bij het maken en verfijnen van prompts voor verwerkingsmodellen voor natuurlijke taal. Prompt engineering omvat het ontwerpen en testen van verschillende prompts om de prestaties van het model te optimaliseren bij het genereren van nauwkeurige en relevante antwoorden.