Zdieľať cez


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 v distribuovanej škále pomocou umelej inteligencie platformy Azure Open a služby Azure Synapse Analytics.

Predpoklady

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.

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

Importovať túto príručku ako poznámkový blok

Ď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.

  1. Stiahnite si túto ukážku ako poznámkový blok (vyberte možnosť Nespracované a uložte súbor).
  2. Naimportujte poznámkový blok do pracovného priestoru synapse, alebo ak sa pomocou služby Fabric importuje do pracovného priestoru služby Fabric
  3. 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.
  4. Pripojenie poznámkový blok do klastra a postupujte podľa úprav a spúšťania buniek.

Vyplnenie informácií o službe

Potom upravte bunku v poznámkovom bloku tak, aby smerla na vašu službu. Nastavte service_namenajmä premenné , deployment_name, locationa 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

Vytvorenie množiny údajov výziev

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

Vytvorenie klienta OpenAICompletion Apache Spark

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

Transformácia údajového rámca pomocou klienta OpenAICompletion

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.

Riadka 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í.

Ďalšie príklady používania

Generovanie vloženia textu

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í OpenAIEmbeddingná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))

Dokončenie chatu

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

Zlepšenie priepustnosť pomocou dávkovania požiadaviek

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)

Použitie automatického minibakovača

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)

Výzva na technické náklady na preklad

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ýzva na zodpovedanie otázok

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