Azure OpenAI를 사용한 빅 데이터

Azure OpenAI 서비스를 사용하여 완료 API를 표시하여 많은 자연어 작업을 해결할 수 있습니다. 프롬프트 워크플로를 몇 가지 예제에서 예제의 큰 데이터 세트로 쉽게 확장할 수 있도록 Azure OpenAI 서비스는 분산 기계 학습 라이브러리 SynapseML 통합됩니다. 이 통합을 사용하면 Apache Spark 분산 컴퓨팅 프레임워크를 사용하여 OpenAI 서비스에서 수백만 개의 프롬프트를 처리할 수 있습니다. 이 자습서에서는 Azure OpenAI 및 Microsoft Fabric 사용하여 대규모 언어 모델을 분산된 규모로 적용하는 방법을 보여 줍니다.

필수 조건

이 빠른 시작의 주요 필수 구성 요소에는 작동 중인 Azure OpenAI 리소스 및 SynapseML이 설치된 Apache Spark 클러스터가 포함됩니다.

이 가이드를 Notebook으로 가져오기

다음 단계에서는 이 코드를 Spark 클러스터에 추가합니다. Spark 플랫폼에서 Notebook을 만들고 코드를 이 Notebook에 복사하여 데모를 실행할 수 있습니다.

  1. 이 데모를 노트북으로 다운로드 하세요( Raw를 선택한 후 파일을 저장하세요).
  2. Fabric 작업 공간으로 가져오세요.
  3. 설치 가이드를 사용 해 SynapseML을 클러스터에 설치하세요. 이 단계를 수행하려면 가져온 전자 필기장의 맨 위에 추가 셀을 붙여넣습니다.
  4. Notebook을 클러스터에 연결하고 셀을 편집하고 실행하면서 따라해 봅니다.

서비스 정보 채우기

다음으로, 서비스를 가리키도록 Notebook의 셀을 편집합니다. service_nameOpenAI 서비스와 일치하도록 , deployment_name, locationkey 변수를 설정합니다.

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-4.1-mini"
deployment_name_embeddings = "text-embedding-3-small"

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 DataFrame의 로드 및 준비에 대한 자세한 내용은 Apache Spark 데이터 로딩 가이드를 참조하세요.

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

OpenAIPrompt Apache Spark 클라이언트 만들기

Azure OpenAI 서비스를 DataFrame에 적용하려면, 분산 클라이언트 역할을 하는 객체를 OpenAIPrompt 생성하세요. 객체에 OpenAIPrompt 적절한 세터를 사용하여 단일 값 또는 DataFrame 컬럼으로 서비스 매개변수를 설정할 수 있습니다. 이 예제에서는 200으로 설정합니다 maxTokens . 토큰은 약 4자이며 이 제한은 프롬프트와 결과의 합계에 적용됩니다. DataFrame의 프롬프트 열명으로 매개변수를 promptCol 설정하세요.

from synapse.ml.services.openai import OpenAIPrompt

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

OpenAIPrompt 클라이언트를 사용하여 데이터프레임을 변환하세요

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

출력은 다음과 같이 표시됩니다. 완성 텍스트는 샘플과 다릅니다.

프롬프트 오류 text
안녕하세요, 제 이름은 null Makaveli 나는 18 세이고 나는 로스 앤젤레스, CA에서 음악을 쓰고 만드는 것을 좋아 자랄 때 래퍼가되고 싶습니다.
가장 좋은 코드는 다음과 같은 코드입니다. null understandable 이것은 주관적인 진술이며 명확한 대답은 없습니다.
SynapseML은 null 이벤트의 향후 결과를 예측하는 방법을 배울 수 있는 기계 학습 알고리즘입니다.

추가 사용 예제

텍스트 임베딩 생성

텍스트를 완료하는 것 외에도 다운스트림 알고리즘 또는 벡터 검색 아키텍처에 사용할 텍스트를 포함할 수도 있습니다. 임베딩을 만들면 대규모 컬렉션에서 문서를 검색하고 검색할 수 있습니다. 프롬프트 엔지니어링이 작업에 충분하지 않은 경우 이 방법을 사용합니다. 사용에 OpenAIEmbedding대한 자세한 내용은 포함 가이드를 참조하세요.

from synapse.ml.services.openai import OpenAIEmbedding

embedding = (
    OpenAIEmbedding()
    .setSubscriptionKey(key)
    .setDeploymentName(deployment_name_embeddings)
    .setCustomServiceName(service_name)
    .setTextCol("prompt")
    .setErrorCol("error")
    .setOutputCol("embeddings")
)

display(embedding.transform(df))

채팅 완료

GPT-4o 및 GPT-4.1과 같은 모델은 단일 프롬프트 대신 채팅을 이해합니다. OpenAIChatCompletion 변환기는 이 기능을 대규모로 공개합니다.

from synapse.ml.services.openai 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", "What's 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"
    )
)

요청 일괄 처리를 사용하여 처리량 향상

예제에서는 각 프롬프트에 대해 하나씩 서비스에 대한 여러 요청을 만듭니다. 단일 요청으로 여러 프롬프트를 완료하려면 일괄 처리 모드를 사용합니다. 먼저 개체에서 OpenAIPrompt 프롬프트 열을 "Prompt"로 설정하는 대신 BatchPrompt 열에 대해 "batchPrompt"를 지정합니다. 각 행에 프롬프트 목록을 포함하는 DataFrame을 만드세요.

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

다음으로 개체를 만듭니다 OpenAIPrompt . 프롬프트 열을 설정하는 대신 열이 형식 Array[String]인 경우 batchPrompt 열을 설정합니다.

batch_completion = (
    OpenAIPrompt()
    .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))

질문 답변 프롬프트

이 예제에서는 모델에게 일반 지식 질문에 답변하도록 메시지를 보여줍니다.

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