OpenAI

OpenAI

OpenAI 모델 함수는 Flink SQL이 OpenAI API를 호출해 추론 작업을 수행할 수 있게 해줍니다. SQL로 원격 OpenAI 모델 서비스를 호출해 예측/추론 작업을 처리할 수 있도록 지원합니다.

출처: 문서

본문

개요

이 함수는 Flink SQL을 통해 원격 OpenAI 모델 서비스를 예측/추론 작업에 호출하는 것을 지원합니다. 현재 다음 작업을 지원합니다.

  • Chat Completions: 대화를 구성하는 메시지 목록에서 모델 응답을 생성합니다.
  • Embeddings: 주어진 입력의 벡터 표현을 얻습니다. 이 표현은 머신러닝 모델과 알고리즘이 쉽게 사용할 수 있습니다.

사용 예시

다음 예시는 chat completions 모델을 만들고 이를 사용해 영화 리뷰의 감성 라벨을 예측합니다.

먼저 다음 SQL 문으로 chat completions 모델을 생성합니다.

CREATE MODEL ai_analyze_sentiment
INPUT (`input` STRING)
OUTPUT (`content` STRING)
WITH (
    'provider'='openai',
    'endpoint'='https://api.openai.com/v1/chat/completions',
    'api-key' = '<YOUR KEY>',
    'model'='gpt-3.5-turbo',
    'system-prompt' = 'Classify the text below into one of the following labels: [positive, negative, neutral, mixed]. Output only the label.'
);

movie_comment라는 테이블에 다음 데이터가 저장되어 있고, 예측 결과는 print_sink라는 테이블에 저장된다고 가정합니다.

CREATE TEMPORARY VIEW movie_comment(id, movie_name,  user_comment, actual_label)
AS VALUES
  (1, 'Good Stuff', 'The part where children guess the sounds is my favorite. It's a very romantic narrative compared to other movies I've seen. Very gentle and full of love.', 'positive');

CREATE TEMPORARY TABLE print_sink(
  id BIGINT,
  movie_name VARCHAR,
  predicit_label VARCHAR,
  actual_label VARCHAR
) WITH (
  'connector' = 'print'
);

그러면 다음 SQL 문으로 영화 리뷰의 감성 라벨을 예측할 수 있습니다.

INSERT INTO print_sink
SELECT id, movie_name, content as predicit_label, actual_label
FROM ML_PREDICT(
  TABLE movie_comment,
  MODEL ai_analyze_sentiment,
  DESCRIPTOR(user_comment));

모델 옵션

공통

Key Default Type Description
api-key (none) String 인증에 사용하는 OpenAI API 키입니다.
context-overflow-action truncated-tail Enum 컨텍스트 오버플로우를 처리하는 동작입니다. 가능한 값: - "truncated-tail": 컨텍스트 꼬리에서 초과된 토큰을 잘라냅니다. - "truncated-tail-log": 컨텍스트 꼬리에서 초과된 토큰을 잘라내고 잘라냄 로그를 기록합니다. - "truncated-head": 컨텍스트 머리에서 초과된 토큰을 잘라냅니다. - "truncated-head-log": 컨텍스트 머리에서 초과된 토큰을 잘라내고 잘라냄 로그를 기록합니다. - "skipped": 해당 입력 행을 건너뜁니다. - "skipped-log": 해당 입력 행을 건너뛰고 건너뜀 로그를 기록합니다.
endpoint (none) String OpenAI API 엔드포인트의 전체 URL입니다. 예: https://api.openai.com/v1/chat/completions 또는 https://api.openai.com/v1/embeddings
error-handling-strategy RETRY Enum 모델 요청 중 오류를 처리하는 전략입니다. 가능한 값: - "RETRY": 요청 전송을 재시도합니다. - "FAILOVER": 예외를 던져 Flink 작업을 실패시킵니다. - "IGNORE": 오류를 일으킨 입력을 무시하고 계속 진행합니다. 오류 자체는 로그에 기록됩니다.
max-context-size (none) Integer 컨텍스트의 최대 토큰 수입니다. 이 임계값을 초과하면 context-overflow-action이 트리거됩니다.
model (none) String 모델 이름입니다. 예: gpt-3.5-turbo, text-embedding-ada-002
retry-fallback-strategy FAILOVER Enum 재시도 시도가 모두 소진되었을 때 사용할 폴백 전략입니다. error-handling-strategy가 retry로 설정된 경우 적용됩니다. 가능한 값: - "FAILOVER": 예외를 던져 Flink 작업을 실패시킵니다. - "IGNORE": 오류를 일으킨 입력을 무시하고 계속 진행합니다. 오류 자체는 로그에 기록됩니다.
retry-num 100 Integer OpenAI 클라이언트 요청의 재시도 횟수입니다.

Chat Completions

Key Default Type Description
max-tokens (none) Long chat completion에서 생성할 수 있는 최대 토큰 수입니다.
n (none) Long 각 입력 메시지에 대해 생성할 chat completion 선택지 수입니다. 모든 선택지에서 생성된 토큰 수를 기준으로 요금이 부과되므로 비용을 최소화하려면 n을 1로 유지하세요.
presence-penalty (none) Double -2.0과 2.0 사이의 숫자입니다. 양수 값은 지금까지 텍스트에 등장했는지 여부에 따라 새 토큰에 패널티를 주어, 모델이 새로운 주제를 말할 가능성을 높입니다.
response-format (none) Enum 응답의 형식입니다. 예: 'text' 또는 'json_object'. 가능한 값: - "text" - "json_object"
seed (none) Long 지정하면 모델 플랫폼이 결정적으로 샘플링하도록 최선을 다하며, 같은 seed와 매개변수로 반복 요청 시 같은 결과를 반환해야 합니다. 결정성은 보장되지 않습니다.
stop (none) String 모델에 stop 시퀀스로 전달할 문자열의 CSV 목록입니다.
system-prompt "You are a helpful assistant." String 채팅의 시스템 메시지입니다.
temperature (none) Double 출력의 무작위성 또는 "창의성"을 제어합니다. 일반적인 값은 0.0과 1.0 사이입니다.
top-p (none) Double 토큰 선택의 확률 컷오프입니다. 보통 temperature 또는 topP 중 하나만 지정하며 둘 다 지정하지는 않습니다.

Embeddings

Key Default Type Description
dimension (none) Long 임베딩 결과 배열의 크기입니다.

스키마 요구사항

다음 표는 각 작업에 대한 스키마 요구사항을 나열합니다.

Task Input Type Output Type
Chat Completions STRING STRING
Embeddings STRING ARRAY

사용 가능한 메타데이터

error-handling-strategyignore로 설정한 경우, 다음 메타데이터 열을 추가로 지정하여 실패에 대한 정보를 스트림에 노출할 수 있습니다.

  • error-string(STRING): 오류와 관련된 메시지
  • http-status-code(INT): HTTP 상태 코드
  • http-headers-map(MAP<STRING, ARRAY>): 응답과 함께 반환된 헤더

출력 스키마에 이 메타데이터 열을 정의했지만 호출이 실패하지 않았다면, 해당 열은 null 값으로 채워집니다.

더 알아보기 (Learn more)