Azure AI 서비스

Azure AI 서비스는 개발자와 조직이 즉시 사용 가능하고 사전 빌드되었으며 사용자 지정 가능한 API 및 모델을 사용하여 시장에 출시할 수 있는 지능적이고 최첨단의 책임감 있는 애플리케이션을 신속하게 만들 수 있도록 지원합니다.

SynapseML을 사용하면 다양한 Spark 데이터 원본에서 강력하고 확장성이 뛰어난 예측 및 분석 모델을 빌드할 수 있습니다. Synapse Spark는 synapse.ml.services를 포함한 기본 제공 SynapseML 라이브러리를 제공합니다.

Important

2023년 9월 20일부터 새로운 Anomaly Detector 리소스를 만들 수 없습니다. Anomaly Detector 서비스는 2026년 10월 1일에 사용 중지됩니다.

Azure Synapse Analytics의 필수 구성 요소

Azure Synapse에서 Azure AI 서비스를 사용하기 위한 필수 조건 자습서에서는 Synapse Analytics에서 Azure AI 서비스를 사용하기 전에 수행해야 하는 몇 가지 단계를 안내합니다.

Azure AI 서비스는 개발자가 애플리케이션에 지능형 기능을 추가하는 데 사용할 수 있는 API, SDK 및 서비스 도구 모음입니다. AI 서비스는 개발자가 직접적인 AI 또는 데이터 과학 기술이나 지식이 없더라도 개발자에게 역량을 부여합니다. Azure AI 서비스는 개발자가 보고, 듣고, 말하고, 이해하고, 추론을 시작할 수 있는 애플리케이션을 만드는 데 도움이 됩니다. Azure AI 서비스 내의 서비스 카탈로그는 5가지 주요 핵심 요소인 Vision, Speech, Language, Web Search 및 Decision으로 분류될 수 있습니다.

사용

비전

Computer Vision

  • 설명: 인간이 읽을 수 있는 언어로 이미지 설명을 제공합니다. (Scala, Python)
  • 분석(색, 이미지 형식, 얼굴, 성인/선정적인 콘텐츠): 이미지의 시각적 기능을 분석합니다. (Scala, Python)
  • OCR: 이미지에서 텍스트를 읽습니다. (Scala, Python)
  • 텍스트 인식: 이미지에서 텍스트를 읽습니다. (Scala, Python)
  • 썸네일: 이미지에서 사용자 지정 크기의 썸네일을 생성합니다. (Scala, Python)
  • 도메인별 콘텐츠 인식: 도메인별 콘텐츠(유명인, 랜드마크)를 인식합니다. (Scala, Python)
  • 태그: 입력 이미지와 관련된 단어 목록을 식별합니다. (Scala, Python)

Face

  • 검색: 이미지에서 인간 얼굴을 검색합니다. (Scala, Python)
  • 확인: 두 얼굴이 같은 사람인지 또는 한 사람의 얼굴인지 확인합니다. (Scala, Python)
  • 식별: 사용자 그룹에서 특정 쿼리 사람 얼굴과 가장 근접하게 일치하는 항목을 찾습니다. (Scala, Python)
  • 유사한 얼굴 찾기: 얼굴 목록에서 쿼리 얼굴과 유사한 얼굴을 찾습니다. (Scala, Python)
  • 그룹화: 얼굴 그룹을 유사성에 따라 분리된 그룹으로 나눕니다. (Scala, Python)

음성

Speech Service

  • 음성 텍스트 변환: 오디오 스트림을 텍스트로 변환합니다. (Scala, Python)
  • 대화 기록: 오디오 스트림을 확인된 화자와 함께 라이브 대화 기록으로 대화 기록합니다. (Scala, Python)
  • Text to Speech: 텍스트를 사실적인 오디오로 변환합니다. (Scala, Python)

언어

AI 언어

  • 언어 감지: 입력 텍스트의 언어를 감지합니다. (Scala, Python)
  • 핵심 구 추출: 입력 텍스트에서 핵심 논점을 식별합니다. (Scala, Python)
  • 명명된 엔터티 인식: 입력 텍스트에서 알려진 엔터티 및 일반 명명된 엔터티를 식별합니다. (Scala, Python)
  • 감정 분석: 입력 텍스트의 감정을 나타내는 0과 1 사이의 점수를 반환합니다. (Scala, Python)
  • 의료 항목 추출: 텍스트에서 의료 항목 및 관계를 추출합니다. (Scala, Python)

Translation

Translator

  • 번역: 텍스트를 번역합니다. (Scala, Python)
  • 음역: 한 언어로 된 텍스트를 한 스크립트에서 다른 스크립트로 변환합니다. (Scala, Python)
  • 검색: 텍스트 조각의 언어를 식별합니다. (Scala, Python)
  • 문장 나누기: 텍스트에서 문장 경계의 위치를 식별합니다. (Scala, Python)
  • 사전 조회: 단어 및 소수의 관용구에 대한 대체 번역을 제공합니다. (Scala, Python)
  • 사전 예: 사전의 용어가 컨텍스트에서 어떻게 사용되는지 보여 주는 예를 제공합니다. (Scala, Python)
  • 문서 번역: 문서 구조와 데이터 형식을 유지하면서 지원되는 모든 언어와 방언으로 문서를 번역합니다. (Scala, Python)

문서 인텔리전스

문서 인텔리전스

  • 레이아웃 분석: 지정된 문서에서 텍스트 및 레이아웃 정보를 추출합니다. (Scala, Python)
  • 영수증 분석: OCR(광학 인식) 및 영수증 모델을 통해 영수증에서 데이터를 검색하고 추출하므로 가맹점 이름, 가맹점 전화번호, 트랜잭션 날짜, 트랜잭션 합계 등과 같이 영수증에서 구조화된 데이터를 쉽게 추출할 수 있습니다. (Scala, Python)
  • 비즈니스 카드 분석: OCR(광학 인식) 및 비즈니스 카드 모델을 통해 명함에서 데이터를 검색하고 추출하여 연락처 이름, 회사 이름, 전화번호, 이메일 등과 같이 명함에서 구조화된 데이터를 쉽게 추출할 수 있습니다. (Scala, Python)
  • 청구서 분석: OCR(광학 인식) 및 청구서 해석 딥 러닝 모델을 통해 청구서에서 데이터를 검색하고 추출하여 고객, 공급업체, 청구서 ID, 청구서 기한, 합계, 청구서 금액, 세금 금액, 배송지, 청구 주소, 품목 등과 같이 청구서에서 구조화된 데이터를 쉽게 추출할 수 있습니다. (Scala, Python)
  • ID 문서 분석: OCR(광학 인식) 및 ID 문서 모델을 통해 식별 문서에서 데이터를 검색하고 추출하여 이름, 성, 생년월일, 문서 번호 등과 같이 ID 문서에서 구조화된 데이터를 쉽게 추출할 수 있습니다. (Scala, Python)
  • 사용자 지정 양식 분석: 일련의 대표적인 학습 양식에서 만들어진 모델을 기반으로 양식(PDF 및 이미지)에서 구조화된 데이터로 정보를 추출합니다. (Scala, Python)
  • 사용자 지정 모델 가져오기: 사용자 지정 모델에 대한 자세한 정보를 가져옵니다. (Scala, Python)
  • 사용자 지정 모델 나열: 모든 사용자 지정 모델에 대한 정보를 가져옵니다. (Scala, Python)

의사 결정

Anomaly Detector

  • 최신 지점의 변칙 상태: 이전 지점을 사용하여 모델을 생성하고 최신 지점이 변칙인지 판단합니다. (Scala, Python)
  • 변칙 찾기: 전체 시리즈를 사용하여 모델을 생성하고 시리즈에서 변칙을 찾습니다. (Scala, Python)

시스템 준비

시작하려면 필수 라이브러리를 가져오고 Spark 세션을 초기화합니다.

from pyspark.sql.functions import udf, col
from synapse.ml.io.http import HTTPTransformer, http_udf
from requests import Request
from pyspark.sql.functions import lit
from pyspark.ml import PipelineModel
from pyspark.sql.functions import col

Azure AI 서비스 라이브러리를 가져오고 다음 코드 조각의 키와 위치를 Azure AI 서비스 키 및 위치로 바꿉니다.

from synapse.ml.services import *
from synapse.ml.core.platform import *

# A general AI services key for AI Language, Computer Vision and Document Intelligence (or use separate keys that belong to each service)
service_key = find_secret(
    secret_name="ai-services-api-key", keyvault="mmlspark-build-keys"
)  # Replace the call to find_secret with your key as a python string. e.g. service_key="27snaiw..."
service_loc = "eastus"

# A Bing Search v7 subscription key
bing_search_key = find_secret(
    secret_name="bing-search-key", keyvault="mmlspark-build-keys"
)  # Replace the call to find_secret with your key as a python string.

# An Anomaly Detector subscription key
anomaly_key = find_secret(
    secret_name="anomaly-api-key", keyvault="mmlspark-build-keys"
)  # Replace the call to find_secret with your key as a python string. If you don't have an anomaly detection resource created before Sep 20th 2023, you won't be able to create one.
anomaly_loc = "westus2"

# A Translator subscription key
translator_key = find_secret(
    secret_name="translator-key", keyvault="mmlspark-build-keys"
)  # Replace the call to find_secret with your key as a python string.
translator_loc = "eastus"

# An Azure search key
search_key = find_secret(
    secret_name="azure-search-key", keyvault="mmlspark-build-keys"
)  # Replace the call to find_secret with your key as a python string.

텍스트에 대한 감정 분석 수행

AI 언어 서비스는 텍스트에서 지능형 인사이트를 추출하기 위한 몇 가지 알고리즘을 제공합니다. 예를 들어 지정된 입력 텍스트의 감정을 찾을 수 있습니다. 이 서비스는 0.0과 1.0 사이의 점수를 반환합니다. 여기서 낮은 점수는 부정적인 감정을 나타내고, 높은 점수는 긍정적인 감정을 나타냅니다. 이 샘플에서는 세 개의 간단한 문장을 사용하고, 각각에 대한 감정을 반환합니다.

# Create a dataframe that's tied to it's column names
df = spark.createDataFrame(
    [
        ("I am so happy today, its sunny!", "en-US"),
        ("I am frustrated by this rush hour traffic", "en-US"),
        ("The AI services on spark aint bad", "en-US"),
    ],
    ["text", "language"],
)

# Run the Text Analytics service with options
sentiment = (
    AnalyzeText()
    .setKind("SentimentAnalysis")
    .setTextCol("text")
    .setLocation(service_loc)
    .setSubscriptionKey(service_key)
    .setOutputCol("sentiment")
    .setErrorCol("error")
    .setLanguageCol("language")
)

# Show the results of your text query in a table format
display(
    sentiment.transform(df).select(
        "text", col("sentiment.documents.sentiment").alias("sentiment")
    )
)

상태 데이터에 대한 텍스트 분석 수행

의료 분야 Text Analytics는 의사의 메모, 퇴원 요약, 임상 문서 및 전자 의료 레코드 같은 비정형 텍스트에서 관련 의료 정보를 추출하고 레이블을 지정합니다.

다음 코드 샘플은 의사 메모의 텍스트를 분석하고 구조화된 데이터로 변환합니다.

df = spark.createDataFrame(
    [
        ("20mg of ibuprofen twice a day",),
        ("1tsp of Tylenol every 4 hours",),
        ("6-drops of Vitamin B-12 every evening",),
    ],
    ["text"],
)

healthcare = (
    AnalyzeHealthText()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setLanguage("en")
    .setOutputCol("response")
)

display(healthcare.transform(df))

다른 언어로 텍스트 번역

번역기는 클라우드 기반 기계 번역 서비스이며 지능형 앱을 빌드하는 데 사용되는 Azure AI 서비스 AI API 제품군의 일부입니다. Translator는 애플리케이션, 웹 사이트, 도구 및 솔루션에 쉽게 통합할 수 있습니다. 90개 언어 및 방언으로 다국어 사용자 환경을 추가할 수 있으며 자체 알고리즘을 호스팅하지 않고도 텍스트를 번역하는 데 사용할 수 있습니다.

다음 코드 샘플은 번역하려는 문장과 이를 번역하려는 대상 언어를 제공하여 간단한 텍스트 번역을 수행합니다.

from pyspark.sql.functions import col, flatten

# Create a dataframe including sentences you want to translate
df = spark.createDataFrame(
    [(["Hello, what is your name?", "Bye"],)],
    [
        "text",
    ],
)

# Run the Translator service with options
translate = (
    Translate()
    .setSubscriptionKey(translator_key)
    .setLocation(translator_loc)
    .setTextCol("text")
    .setToLanguage(["zh-Hans"])
    .setOutputCol("translation")
)

# Show the results of the translation.
display(
    translate.transform(df)
    .withColumn("translation", flatten(col("translation.translations")))
    .withColumn("translation", col("translation.text"))
    .select("translation")
)

문서의 정보를 구조화된 데이터로 추출

Azure AI 문서 인텔리전스는 기계 학습 기술을 사용하여 자동화된 데이터 처리 소프트웨어를 빌드할 수 있는 Azure Applied AI Services의 일부입니다. Azure AI 문서 인텔리전스를 사용하면 문서에서 텍스트, 키/값 쌍, 선택 표시, 테이블 및 구조를 식별하고 추출할 수 있습니다. 이 서비스는 원본 파일의 관계, 경계 상자, 신뢰도 등이 포함된 정형 데이터를 출력합니다.

다음 코드 샘플은 명함 이미지를 분석하고 해당 정보를 구조화된 데이터로 추출합니다.

from pyspark.sql.functions import col, explode

# Create a dataframe containing the source files
imageDf = spark.createDataFrame(
    [
        (
            "https://mmlspark.blob.core.windows.net/datasets/FormRecognizer/business_card.jpg",
        )
    ],
    [
        "source",
    ],
)

# Run the Form Recognizer service
analyzeBusinessCards = (
    AnalyzeBusinessCards()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setImageUrlCol("source")
    .setOutputCol("businessCards")
)

# Show the results of recognition.
display(
    analyzeBusinessCards.transform(imageDf)
    .withColumn(
        "documents", explode(col("businessCards.analyzeResult.documentResults.fields"))
    )
    .select("source", "documents")
)

Computer Vision 샘플

Azure AI 비전은 이미지를 분석하여 얼굴, 개체 및 자연어 설명과 같은 구조를 식별합니다.

다음 코드 샘플은 이미지를 분석하고 태그로 레이블을 지정합니다. 태그는 인식할 수 있는 개체, 사람, 풍경, 작업 등 이미지의 대상에 대한 한 단어 설명입니다.

# Create a dataframe with the image URLs
base_url = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/"
df = spark.createDataFrame(
    [
        (base_url + "objects.jpg",),
        (base_url + "dog.jpg",),
        (base_url + "house.jpg",),
    ],
    [
        "image",
    ],
)

# Run the Computer Vision service. Analyze Image extracts information from/about the images.
analysis = (
    AnalyzeImage()
    .setLocation(service_loc)
    .setSubscriptionKey(service_key)
    .setVisualFeatures(
        ["Categories", "Color", "Description", "Faces", "Objects", "Tags"]
    )
    .setOutputCol("analysis_results")
    .setImageUrlCol("image")
    .setErrorCol("error")
)

# Show the results of what you wanted to pull out of the images.
display(analysis.transform(df).select("image", "analysis_results.description.tags"))

Bing Image Search는 웹을 검색하여 사용자의 자연어 쿼리와 관련된 이미지를 검색합니다.

다음 코드 샘플은 따옴표가 있는 이미지를 찾는 텍스트 쿼리를 사용합니다. 코드의 출력은 쿼리와 관련된 사진이 포함된 이미지 URL 목록입니다.

# Number of images Bing will return per query
imgsPerBatch = 10
# A list of offsets, used to page into the search results
offsets = [(i * imgsPerBatch,) for i in range(100)]
# Since web content is our data, we create a dataframe with options on that data: offsets
bingParameters = spark.createDataFrame(offsets, ["offset"])

# Run the Bing Image Search service with our text query
bingSearch = (
    BingImageSearch()
    .setSubscriptionKey(bing_search_key)
    .setOffsetCol("offset")
    .setQuery("Martin Luther King Jr. quotes")
    .setCount(imgsPerBatch)
    .setOutputCol("images")
)

# Transformer that extracts and flattens the richly structured output of Bing Image Search into a simple URL column
getUrls = BingImageSearch.getUrlTransformer("images", "url")

# This displays the full results returned, uncomment to use
# display(bingSearch.transform(bingParameters))

# Since we have two services, they are put into a pipeline
pipeline = PipelineModel(stages=[bingSearch, getUrls])

# Show the results of your search: image URLs
display(pipeline.transform(bingParameters))

음성을 텍스트로 변환

음성 텍스트 변환 서비스는 음성 오디오의 스트림 또는 파일을 텍스트로 변환합니다. 다음 코드 샘플은 하나의 오디오 파일을 텍스트로 변환합니다.

# Create a dataframe with our audio URLs, tied to the column called "url"
df = spark.createDataFrame(
    [("https://mmlspark.blob.core.windows.net/datasets/Speech/audio2.wav",)], ["url"]
)

# Run the Speech-to-text service to translate the audio into text
speech_to_text = (
    SpeechToTextSDK()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setOutputCol("text")
    .setAudioDataCol("url")
    .setLanguage("en-US")
    .setProfanity("Masked")
)

# Show the results of the translation
display(speech_to_text.transform(df).select("url", "text.DisplayText"))

텍스트를 음성으로 변환

텍스트 음성 변환은 119개 언어 및 변형에 걸쳐 270개 이상의 신경망 음성 중에서 선택하여 자연스럽게 말하는 앱과 서비스를 빌드할 수 있는 서비스입니다.

다음 코드 샘플은 텍스트를 텍스트 콘텐츠가 포함된 오디오 파일로 변환합니다.

from synapse.ml.services.speech import TextToSpeech

fs = ""
if running_on_databricks():
    fs = "dbfs:"
elif running_on_synapse_internal():
    fs = "Files"

# Create a dataframe with text and an output file location
df = spark.createDataFrame(
    [
        (
            "Reading out loud is fun! Check out aka.ms/spark for more information",
            fs + "/output.mp3",
        )
    ],
    ["text", "output_file"],
)

tts = (
    TextToSpeech()
    .setSubscriptionKey(service_key)
    .setTextCol("text")
    .setLocation(service_loc)
    .setVoiceName("en-US-JennyNeural")
    .setOutputFileCol("output_file")
)

# Check to make sure there were no errors during audio creation
display(tts.transform(df))

시계열 데이터의 변칙 징후 검색

2023년 9월 20일 이전에 만들어진 이상 탐지 리소스가 없으면 만들 수 없습니다. 이 부분은 건너뛰려고 할 수도 있습니다.

Anomaly Detector는 시계열 데이터의 변칙을 감지하는 데 유용합니다. 다음 코드 샘플은 Anomaly Detector 서비스를 사용하여 시계열에서 변칙을 찾습니다.

# Create a dataframe with the point data that Anomaly Detector requires
df = spark.createDataFrame(
    [
        ("1972-01-01T00:00:00Z", 826.0),
        ("1972-02-01T00:00:00Z", 799.0),
        ("1972-03-01T00:00:00Z", 890.0),
        ("1972-04-01T00:00:00Z", 900.0),
        ("1972-05-01T00:00:00Z", 766.0),
        ("1972-06-01T00:00:00Z", 805.0),
        ("1972-07-01T00:00:00Z", 821.0),
        ("1972-08-01T00:00:00Z", 20000.0),
        ("1972-09-01T00:00:00Z", 883.0),
        ("1972-10-01T00:00:00Z", 898.0),
        ("1972-11-01T00:00:00Z", 957.0),
        ("1972-12-01T00:00:00Z", 924.0),
        ("1973-01-01T00:00:00Z", 881.0),
        ("1973-02-01T00:00:00Z", 837.0),
        ("1973-03-01T00:00:00Z", 9000.0),
    ],
    ["timestamp", "value"],
).withColumn("group", lit("series1"))

# Run the Anomaly Detector service to look for irregular data
anamoly_detector = (
    SimpleDetectAnomalies()
    .setSubscriptionKey(anomaly_key)
    .setLocation(anomaly_loc)
    .setTimestampCol("timestamp")
    .setValueCol("value")
    .setOutputCol("anomalies")
    .setGroupbyCol("group")
    .setGranularity("monthly")
)

# Show the full results of the analysis with the anomalies marked as "True"
display(
    anamoly_detector.transform(df).select("timestamp", "value", "anomalies.isAnomaly")
)

임의의 웹 API에서 정보 가져오기

HTTP on Spark를 사용하면 빅 데이터 파이프라인에서 웹 서비스를 사용할 수 있습니다. 다음 예제에서는 세계 은행 API를 사용하여 다양한 전 세계 국가에 대한 정보를 가져옵니다.

# Use any requests from the python requests library

def world_bank_request(country):
    return Request(
        "GET", "http://api.worldbank.org/v2/country/{}?format=json".format(country)
    )

# Create a dataframe with specifies which countries we want data on
df = spark.createDataFrame([("br",), ("usa",)], ["country"]).withColumn(
    "request", http_udf(world_bank_request)(col("country"))
)

# Much faster for big data because of the concurrency :)
client = (
    HTTPTransformer().setConcurrency(3).setInputCol("request").setOutputCol("response")
)

# Get the body of the response

def get_response_body(resp):
    return resp.entity.content.decode()

# Show the details of the country data returned
display(
    client.transform(df).select(
        "country", udf(get_response_body)(col("response")).alias("response")
    )
)

Azure AI 검색 샘플

이 예에서는 인식 기술을 사용하여 데이터를 보강하고 SynapseML을 사용하여 Azure Search 인덱스에 쓰는 방법을 보여 줍니다.

search_service = "mmlspark-azure-search"
search_index = "test-33467690"

df = spark.createDataFrame(
    [
        (
            "upload",
            "0",
            "https://mmlspark.blob.core.windows.net/datasets/DSIR/test1.jpg",
        ),
        (
            "upload",
            "1",
            "https://mmlspark.blob.core.windows.net/datasets/DSIR/test2.jpg",
        ),
    ],
    ["searchAction", "id", "url"],
)

tdf = (
    AnalyzeImage()
    .setSubscriptionKey(service_key)
    .setLocation(service_loc)
    .setImageUrlCol("url")
    .setOutputCol("analyzed")
    .setErrorCol("errors")
    .setVisualFeatures(
        ["Categories", "Tags", "Description", "Faces", "ImageType", "Color", "Adult"]
    )
    .transform(df)
    .select("*", "analyzed.*")
    .drop("errors", "analyzed")
)

tdf.writeToAzureSearch(
    subscriptionKey=search_key,
    actionCol="searchAction",
    serviceName=search_service,
    indexName=search_index,
    keyCol="id",
)