Κοινή χρήση μέσω


Azure OpenAI για δεδομένα μεγάλου όγκου

Η υπηρεσία Azure OpenAI μπορεί να χρησιμοποιηθεί για την επίλυση ενός μεγάλου αριθμού εργασιών φυσικής γλώσσας, προτρέποντας το API ολοκλήρωσης. Για να κάνουμε ευκολότερη την κλιμάκωση των προτροπών ροών εργασιών σας από μερικά παραδείγματα σε μεγάλα σύνολα δεδομένων παραδειγμάτων, ενσωματώσαμε την υπηρεσία Azure OpenAI με την κατανεμημένη βιβλιοθήκη εκμάθησης μηχανής SynapseML. Αυτή η ενοποίηση διευκολύνει τη χρήση του κατανεμημένου πλαισίου υπολογιστικής Apache Spark για την επεξεργασία εκατομμυρίων προτροπών με την υπηρεσία OpenAI. Αυτή η εκμάθηση δείχνει πώς μπορείτε να εφαρμόσετε μοντέλα μεγάλης γλώσσας σε κατανεμημένη κλίμακα χρησιμοποιώντας το Azure Open AI και το Azure Synapse Analytics.

Προαπαιτούμενα στοιχεία

Οι βασικές προϋποθέσεις για αυτή τη γρήγορη εκκίνηση περιλαμβάνουν έναν λειτουργικό πόρο Azure OpenAI και ένα σύμπλεγμα Apache Spark με εγκατεστημένο το SynapseML.

  • Λάβετε μια συνδρομή Microsoft Fabric. Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση του Microsoft Fabric.

  • Εισέλθετε στο Microsoft Fabric.

  • Χρησιμοποιήστε την εναλλαγή εμπειρίας στην αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε στην εμπειρία Synapse Data Science.

    Screenshot of the experience switcher menu, showing where to select Data Science.

Εισαγωγή αυτού του οδηγού ως σημειωματάριου

Το επόμενο βήμα είναι να προσθέσετε αυτόν τον κώδικα στο σύμπλεγμα Spark. Μπορείτε είτε να δημιουργήσετε ένα σημειωματάριο στην πλατφόρμα Spark σας και να αντιγράψετε τον κώδικα σε αυτό το σημειωματάριο για να εκτελέσετε την επίδειξη. Εναλλακτικά, κάντε λήψη του σημειωματάριου και εισαγάγετέ το στο Synapse Analytics

  1. Λήψη αυτής της επίδειξης ως σημειωματάριου (επιλέξτε Raw και, στη συνέχεια, αποθηκεύστε το αρχείο)
  2. Εισαγάγετε το σημειωματάριο στον χώρο εργασίας Synapse ή εάν χρησιμοποιείτε την εισαγωγή Fabric στον χώρο εργασίας Fabric
  3. Εγκαταστήστε το SynapseML στο σύμπλεγμα. Ανατρέξτε στις οδηγίες εγκατάστασης για το Synapse στο κάτω μέρος της τοποθεσίας Web SynapseML. Εάν χρησιμοποιείτε το Fabric, ανατρέξτε στον Οδηγό εγκατάστασης. Αυτό απαιτεί την επικόλληση ενός επιπλέον κελιού στο επάνω μέρος του σημειωματάριου που εισαγάγατε.
  4. Σύνδεση το σημειωματάριό σας σε ένα σύμπλεγμα και ακολουθήστε τις οδηγίες, τροποποιώντας και εκτελώντας τα κελιά.

Συμπληρώστε τις πληροφορίες υπηρεσίας

Στη συνέχεια, επεξεργαστείτε το κελί στο σημειωματάριο για να κατευθύνετε στην υπηρεσία σας. Συγκεκριμένα, ορίστε τις 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")

Δημιουργία του προγράμματος-πελάτη OpenAICompletion Apache Spark

Για να εφαρμόσετε την υπηρεσία ολοκλήρωσης 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")
)

Μετασχηματισμός του πλαισίου δεδομένων με το πρόγραμμα-πελάτη OpenAICompletion

Αφού ολοκληρώσετε το 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)

Χρήση αυτόματου minibatcher

Εάν τα δεδομένα σας είναι σε μορφή στήλης, μπορείτε να τα αντιμεταθέτετε στη μορφή γραμμών χρησιμοποιώντας το 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))