Jaa


Azure OpenAI massadataa varten

Azure OpenAI -palvelun avulla voidaan ratkaista monia luonnollisen kielen tehtäviä, koska se pyytää suoritusten ohjelmointirajapintaa. Jotta kehotustyönkulkujen skaalaaminen muutamasta esimerkistä suuriin esimerkkitietojoukkoihin olisi helpompaa, integroimme Azure OpenAI -palvelun hajautetun koneoppimiskirjaston SynapseML:n kanssa. Tämän integraation avulla on helppo käyttää hajautettua Apache Spark -käsittelykehystä miljoonien kehotteiden käsittelemiseen OpenAI-palvelun avulla. Tässä opetusohjelmassa kerrotaan, miten voit käyttää suuria kielimalleja hajautetun asteikon kautta Azure OpenAI:n ja Azure Synapse Analyticsin avulla.

Edellytykset

Tämän pikaoppaan keskeisiin edellytyksiin kuuluvat toimiva Azure OpenAI -resurssi ja Apache Spark -klusteri, johon on asennettu SynapseML.

Tuo tämä opas muistikirjana

Seuraava vaihe on lisätä tämä koodi Spark-klusteriin. Voit joko luoda muistikirjan Spark-ympäristöön ja kopioida koodin tähän muistikirjaan esittelyn suorittamista varten. Tai lataa muistikirja ja tuo se Synapse Analyticsiin

  1. Lataa tämä esittely muistikirjana (valitse Raaka ja tallenna sitten tiedosto)
  2. Tuo muistikirja Synapse-työtilaan tai jos käytät Fabric-tuontia Fabric-työtilaan
  3. Asenna SynapseML klusteriin. Katso Synapse-asennusohjeet SynapseML-sivuston alareunasta. Jos käytät Fabricia, tutustu asennusoppaaseen. Tämä edellyttää ylimääräisen solun liittämistä tuomiesi muistikirjojen yläreunaan.
  4. Yhdistä muistikirja klusteriin ja seuraa, muokkaa ja suorita soluja.

Täytä palvelun tiedot

Muokkaa sitten muistikirjassa olevaa solua niin, että se osoittaa palveluseesi. Määritä erityisesti -service_name, -, location- ja key -muuttujat vastaamaan Niitä OpenAI-palvelussadeployment_name:

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

Luo kehotteiden tietojoukko

Luo seuraavaksi tietokehys, joka koostuu rivisarjasta, jossa on yksi kehote riviä kohti.

Voit myös ladata tietoja suoraan ADLS:stä tai muista tietokannoista. Lisätietoja Spark-tietokehyksen lataamisesta ja valmistelusta on Apache Spark -tietojen latausoppaassa.

df = spark.createDataFrame(
    [
        ("Hello my name is",),
        ("The best code is code thats",),
        ("SynapseML is ",),
    ]
).toDF("prompt")

OpenAICompletion Apache Spark -asiakasohjelman luominen

Jotta voit käyttää OpenAI-viimeistelypalvelua luomaasi tietokehykseen, luo OpenAICompletion-objekti, joka toimii hajautettuna asiakkaana. Palvelun parametrit voidaan määrittää joko yhdellä arvolla tai tietokehyksen sarakkeella, jossa on tarvittavat arvot objektissa OpenAICompletion . Asetuksena on maxTokens 200. Tunnus on noin neljä merkkiä, ja tämä rajoitus koskee kehotteen ja tuloksen summaa. Määritämme parametrille promptCol myös kehotesarakkeen nimen tietokehyksessä.

from synapse.ml.cognitive import OpenAICompletion

completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setCustomServiceName(service_name)
    .setMaxTokens(200)
    .setPromptCol("prompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

Tietokehyksen muuntaminen OpenAICompletion-asiakasohjelmiston avulla

Kun tietokehys ja täydennysasiakas on valmis, voit muuntaa syötteen tietojoukon ja lisätä sarakkeen nimeltä completions kaikki palvelun lisäämiä tietoja. Yksinkertaisuuden vuoksi valitse vain teksti.

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"),
    )
)

Tulostesi pitäisi näyttää suunnilleen tämänkaltaisilta. Valmistumisteksti eroaa mallista.

ripeä virhe Tekstiviesti
Hei, nimeni on tyhjä Makaveli Olen 18-vuotias ja haluan olla räppäri, kun kasvan, rakastan kirjoittamista ja musiikin tekemistä, olen Los Angelesista, CA: sta
Paras koodi on koodi, joka on tyhjä ymmärrettävää Tämä on subjektiivinen lausunto, eikä lopullista vastausta ole.
SynapseML on tyhjä Koneoppimisen algoritmi, joka oppii ennakoimaan tapahtumien tulevaa tulosta.

Lisää käyttöesimerkkejä

Tekstin upotusten luominen

Tekstin suorittamisen lisäksi voimme myös upottaa tekstiä käytettäväksi jatkoalgoritmien tai vektorin noutoarkkitehtuurien kanssa. Upotusten luomisen avulla voit hakea ja noutaa asiakirjoja suurista kokoelmista. Niitä voidaan käyttää, kun kehotteiden suunnittelu ei riitä tehtävään. Jos haluat lisätietoja -toiminnon käytöstä OpenAIEmbedding, tutustu upotusoppaaseen.

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))

Keskustelun viimeistely

Mallit, kuten ChatGPT ja GPT-4, pystyvät ymmärtämään keskusteluja yksittäisten kehotteiden sijaan. Muuntaja OpenAIChatCompletion näyttää tämän toiminnon mittakaavassa.

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"
    )
)

Siirtomäärän parantaminen pyyntöerän avulla

Esimerkissä palveluun tehdään useita pyyntöjä, yksi kutakin kehotetta kohden. Jos haluat suorittaa useita kehotteita yhdessä pyynnössä, käytä erätilaa. Määritä ensin OpenAICompletion-objektissa Kehote-sarakkeen kehotteen kehotteen sijaan batchprompt-sarake. Voit tehdä tämän luomalla tietokehyksen, jossa on kehotteiden luettelo riviä kohden.

Kirjoittamisten jälkeen yksittäisessä pyynnössä on tällä hetkellä enintään 20 kehotetta ja kiinteä raja 2048 "tunnuksia" tai noin 1500 sanaa.

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")

Seuraavaksi luomme OpenAICompletion-objektin. Sen sijaan, että määrittäsit kehotesarakkeen, määritä batchPrompt-sarake, jos sarakkeen tyyppi Array[String]on .

batch_completion = (
    OpenAICompletion()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name)
    .setCustomServiceName(service_name)
    .setMaxTokens(200)
    .setBatchPromptCol("batchPrompt")
    .setErrorCol("error")
    .setOutputCol("completions")
)

Muunnoskutsussa tehdään pyyntö riviä kohden. Koska yhdellä rivillä on useita kehotteita, kukin pyyntö lähetetään kaikki tämän rivin kehotteet mukanaan. Tulokset sisältävät rivin kullekin pyynnön riville.

completed_batch_df = batch_completion.transform(batch_df).cache()
display(completed_batch_df)

Automaattisen minibatcherin käyttäminen

Jos tiedot ovat sarakemuodossa, voit transponoida ne rivimuotoon SynapseML:n -parametrilla 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)

Kehotesuunnittelu käännöksiä varten

Azure OpenAI -palvelu voi ratkaista monia luonnollisen kielen tehtäviä kehotteesta riippuen. Tässä on esimerkki kielen käännösten kehotuksesta:

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))

Kysy vastauksia kysymyksiltä

Tässä kysymme GPT-3:lta yleisen tietämyksen kysymyksen vastauksen:

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))