Azure OpenAI για δεδομένα μεγάλου όγκου
Η υπηρεσία Azure OpenAI μπορεί να χρησιμοποιηθεί για την επίλυση ενός μεγάλου αριθμού εργασιών φυσικής γλώσσας, προτρέποντας το API ολοκλήρωσης. Για να κάνουμε ευκολότερη την κλιμάκωση των προτροπών ροών εργασιών σας από μερικά παραδείγματα σε μεγάλα σύνολα δεδομένων παραδειγμάτων, ενσωματώσαμε την υπηρεσία Azure OpenAI με την κατανεμημένη βιβλιοθήκη εκμάθησης μηχανής SynapseML. Αυτή η ενοποίηση διευκολύνει τη χρήση του κατανεμημένου πλαισίου υπολογιστικής Apache Spark για την επεξεργασία εκατομμυρίων προτροπών με την υπηρεσία OpenAI. Αυτή η εκμάθηση δείχνει πώς μπορείτε να εφαρμόσετε μοντέλα μεγάλης γλώσσας σε κατανεμημένη κλίμακα χρησιμοποιώντας το Azure OpenAI και το Azure Synapse Analytics.
Οι βασικές προϋποθέσεις για αυτή τη γρήγορη εκκίνηση περιλαμβάνουν έναν λειτουργικό πόρο Azure OpenAI και ένα σύμπλεγμα Apache Spark με εγκατεστημένο το SynapseML.
Λάβετε μια συνδρομή Microsoft Fabric. Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση του Microsoft Fabric.
Εισέλθετε στο Microsoft Fabric.
Χρησιμοποιήστε την εναλλαγή εμπειρίας στην αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε στην εμπειρία Synapse Data Science.
- Μεταβείτε στην εμπειρία επιστήμης δεδομένων στο Microsoft Fabric.
- Δημιουργήστε ένα νέο σημειωματάριο.
- Ένας πόρος Azure OpenAI: Αίτηση πρόσβασης στην υπηρεσία Azure OpenAI πριν από τη δημιουργία ενός πόρου
Το επόμενο βήμα είναι να προσθέσετε αυτόν τον κώδικα στο σύμπλεγμα Spark. Μπορείτε είτε να δημιουργήσετε ένα σημειωματάριο στην πλατφόρμα Spark σας και να αντιγράψετε τον κώδικα σε αυτό το σημειωματάριο για να εκτελέσετε την επίδειξη. Εναλλακτικά, κάντε λήψη του σημειωματάριου και εισαγάγετέ το στο Synapse Analytics
- Λήψη αυτής της επίδειξης ως σημειωματάριου (επιλέξτε Raw και, στη συνέχεια, αποθηκεύστε το αρχείο)
- Εισαγάγετε το σημειωματάριο στον χώρο εργασίας Synapse ή εάν χρησιμοποιείτε την εισαγωγή Fabric στον χώρο εργασίας Fabric
- Εγκαταστήστε το SynapseML στο σύμπλεγμα. Ανατρέξτε στις οδηγίες εγκατάστασης για το Synapse στο κάτω μέρος της τοποθεσίας Web SynapseML. Εάν χρησιμοποιείτε το Fabric, ανατρέξτε στον Οδηγό εγκατάστασης. Αυτό απαιτεί την επικόλληση ενός επιπλέον κελιού στο επάνω μέρος του σημειωματάριου που εισαγάγατε.
- Συνδέστε το σημειωματάριό σας σε ένα σύμπλεγμα και ακολουθήστε τις οδηγίες, με επεξεργασία και εκτέλεση των κελιών.
Στη συνέχεια, επεξεργαστείτε το κελί στο σημειωματάριο για να κατευθύνετε στην υπηρεσία σας. Συγκεκριμένα, ορίστε τις service_name
μεταβλητές , deployment_name
, location
και key
ώστε να συμφωνούν με την υπηρεσία 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
Στη συνέχεια, δημιουργήστε ένα πλαίσιο δεδομένων που αποτελείται από μια σειρά γραμμών, με μία προτροπή ανά γραμμή.
Μπορείτε επίσης να φορτώσετε δεδομένα απευθείας από το ADLS ή άλλες βάσεις δεδομένων. Για περισσότερες πληροφορίες σχετικά με τη φόρτωση και την προετοιμασία πλαισίων δεδομένων Spark, ανατρέξτε στον Οδηγό φόρτωσης δεδομένων Apache Spark.
df = spark.createDataFrame(
[
("Hello my name is",),
("The best code is code thats",),
("SynapseML is ",),
]
).toDF("prompt")
Για να εφαρμόσετε την υπηρεσία ολοκλήρωσης OpenAI στο πλαίσιο δεδομένων που δημιουργήσατε, δημιουργήστε ένα αντικείμενο OpenAICompletion, το οποίο χρησιμεύει ως κατανεμημένο πρόγραμμα-πελάτης. Οι παράμετροι της υπηρεσίας μπορούν να οριστούν είτε με μία τιμή είτε με μια στήλη του πλαισίου δεδομένων με τους κατάλληλους ρυθμιστές στο OpenAICompletion
αντικείμενο. Εδώ ορίζουμε την τιμή maxTokens
200. Ένα διακριτικό είναι περίπου τέσσερις χαρακτήρες και αυτό το όριο ισχύει για το άθροισμα της προτροπής και το αποτέλεσμα. Ορίζουμε επίσης την promptCol
παράμετρο με το όνομα της στήλης προτροπής στο πλαίσιο δεδομένων.
from synapse.ml.cognitive import OpenAICompletion
completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setPromptCol("prompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Αφού ολοκληρώσετε το dataframe και το πρόγραμμα-πελάτη ολοκλήρωσης, μπορείτε να μετασχηματίσετε το σύνολο δεδομένων εισόδου σας και να προσθέσετε μια στήλη που καλείται completions
με όλες τις πληροφορίες που προσθέτει η υπηρεσία. Επιλέξτε μόνο το κείμενο για λόγους ευκολίας.
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"),
)
)
Η έξοδος θα πρέπει να μοιάζει κάπως έτσι. Το κείμενο ολοκλήρωσης θα είναι διαφορετικό από το δείγμα.
προτροπή | λάθος | Κείμενο |
---|---|---|
Γεια σας, το όνομά μου είναι | null | Makaveli είμαι δεκαοκτώ ετών και θέλω να γίνω ράπερ όταν μεγαλώσω μου αρέσει να γράφω και να κάνω μουσική είμαι από το Λος Άντζελες της Καλιφόρνια |
Ο καλύτερος κωδικός είναι ο κώδικας που | null | κατανοητό Αυτή είναι μια υποκειμενική δήλωση και δεν υπάρχει οριστική απάντηση. |
Το SynapseML είναι | null | Ένας αλγόριθμος εκμάθησης μηχανής που μπορεί να μάθει πώς να προβλέπει το μελλοντικό αποτέλεσμα των συμβάντων. |
Εκτός από την ολοκλήρωση κειμένου, μπορούμε επίσης να ενσωματώσουμε κείμενο για χρήση σε κατάντη αλγόριθμους ή διανυσματικές αρχιτεκτονικές ανάκτησης. Η δημιουργία ενσωματώσεων σάς επιτρέπει να αναζητήσετε και να ανακτήσετε έγγραφα από μεγάλες συλλογές και μπορεί να χρησιμοποιηθεί όταν η μηχανική προτροπών δεν επαρκεί για την εργασία. Για περισσότερες πληροφορίες σχετικά με τη χρήση OpenAIEmbedding
του , ανατρέξτε στον οδηγό ενσωμάτωσης.
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 και το GPT-4 μπορούν να κατανοήσουν τις συνομιλίες αντί για μεμονωμένες προτροπές. Ο OpenAIChatCompletion
μετασχηματιστής εκθέτει αυτήν τη λειτουργικότητα σε κλίμακα.
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"
)
)
Το παράδειγμα πραγματοποιεί πολλές αιτήσεις στην υπηρεσία, μία για κάθε ερώτηση. Για να ολοκληρώσετε πολλές προτροπές σε μία μόνο αίτηση, χρησιμοποιήστε τη λειτουργία δέσμης. Πρώτα, στο αντικείμενο OpenAICompletion, αντί να ορίσετε τη στήλη Προτροπή σε "Προτροπή", καθορίστε "batchPrompt" για τη στήλη BatchPrompt. Για να το κάνετε αυτό, δημιουργήστε ένα πλαίσιο δεδομένων με μια λίστα των προτροπών ανά γραμμή.
Αυτή τη στιγμή υπάρχει ένα όριο 20 προτροπών σε μία μόνο αίτηση και ένα αυστηρό όριο 2048 "διακριτικών" ή περίπου 1500 λέξεων.
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")
Στη συνέχεια, δημιουργούμε το αντικείμενο OpenAICompletion. Αντί να ορίσετε τη στήλη προτροπής, ορίστε τη στήλη batchPrompt εάν η στήλη σας είναι τύπου Array[String]
.
batch_completion = (
OpenAICompletion()
.setSubscriptionKey(key)
.setDeploymentName(deployment_name)
.setCustomServiceName(service_name)
.setMaxTokens(200)
.setBatchPromptCol("batchPrompt")
.setErrorCol("error")
.setOutputCol("completions")
)
Στην κλήση για μετασχηματισμό, θα πραγματοποιείται μια αίτηση ανά γραμμή. Δεδομένου ότι υπάρχουν πολλά μηνύματα σε μία γραμμή, κάθε αίτηση αποστέλλεται με όλα τα μηνύματα σε αυτήν τη γραμμή. Τα αποτελέσματα περιέχουν μια γραμμή για κάθε γραμμή της αίτησης.
completed_batch_df = batch_completion.transform(batch_df).cache()
display(completed_batch_df)
Εάν τα δεδομένα σας είναι σε μορφή στήλης, μπορείτε να τα αντιμεταθέτετε στη μορφή γραμμών χρησιμοποιώντας το 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)
Η υπηρεσία Azure OpenAI μπορεί να επιλύσει πολλές διαφορετικές εργασίες φυσικής γλώσσας μέσω της μηχανικής προτροπών. Εδώ, παρουσιάζουμε ένα παράδειγμα προτροπής για μετάφραση στη γλώσσα:
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))
Εδώ, ζητάμε από την GPT-3 απαντήσεις σε ερωτήσεις γενικής γνώσης:
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))