OpenAI 라이브러리를 사용하여 Vertex AI 모델 호출

Chat Completions API를 사용하면 Python 및 REST용 OpenAI 라이브러리를 사용하여 Vertex AI 모델에 요청을 보낼 수 있습니다. 이미 OpenAI 라이브러리를 사용하고 있다면 이 API를 사용하여 OpenAI 모델 호출과 Vertex AI 호스팅 모델 간에 전환하여 기존 코드를 변경하지 않고도 출력, 비용, 확장성을 비교할 수 있습니다. 아직 OpenAI 라이브러리를 사용하고 있지 않다면 Gemini API를 직접 호출하는 것이 좋습니다.

지원되는 모델

Chat Completions API는 Gemini 모델과 Model Garden에서 자체 배포한 일부 모델을 모두 지원합니다.

Gemini 모델

다음 표에는 지원되는 Gemini 모델이 나와 있습니다.

모델 버전
Gemini 1.5 Flash google/gemini-1.5-flash
Gemini 1.5 Pro google/gemini-1.5-pro
Gemini 1.0 Pro Vision google/gemini-1.0-pro-vision
google/gemini-1.0-pro-vision-001
Gemini 1.0 Pro google/gemini-1.0-pro-002
google/gemini-1.0-pro-001
google/gemini-1.0-pro

Model Garden에서 직접 배포한 모델

HuggingFace 텍스트 생성 인터페이스(HF TGI)Vertex AI Model Garden 사전 빌드된 vLLM 컨테이너는 Chat Completions API를 지원합니다. 그러나 이러한 컨테이너에 배포된 모든 모델이 Chat Completions API를 지원하는 것은 아닙니다. 다음 표에는 컨테이너별로 가장 많이 지원되는 모델이 나와 있습니다.

HF TGI

vLLM

인증

OpenAI Python 라이브러리를 사용하려면 OpenAI SDK를 설치합니다.

pip install openai

Chat Completions API로 인증하려면 클라이언트 설정을 수정하거나 Google 인증 및 Vertex AI 엔드포인트를 사용하도록 환경 구성을 변경하면 됩니다. 더 쉬운 방법을 선택하고 Gemini 모델을 호출할지 또는 자체 배포된 Model Garden 모델을 호출할지에 따라 설정 단계를 따르세요.

Model Garden의 특정 모델과 지원되는 Hugging Face 모델은 요청을 처리하기 전에 먼저 Vertex AI 엔드포인트에 배포해야 합니다. Chat Completions API에서 이러한 자체 배포 모델을 호출할 때는 엔드포인트 ID를 지정해야 합니다. 기존 Vertex AI 엔드포인트를 나열하려면 gcloud ai endpoints list 명령어를 사용합니다.

클라이언트 설정

Python에서 프로그래매틱 방식으로 Google 사용자 인증 정보를 가져오려면 google-auth Python SDK를 사용하면 됩니다.

pip install google-auth
pip install requests

Vertex AI 채팅 완료 엔드포인트를 가리키도록 OpenAI SDK를 변경합니다.

# Programmatically get an access token
creds, project = google.auth.default()
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
# Note: the credential lives for 1 hour by default (https://cloud.google.com/docs/authentication/token-types#at-lifetime); after expiration, it must be refreshed.

# Pass the Vertex endpoint and authentication to the OpenAI SDK
PROJECT_ID = 'PROJECT_ID'
LOCATION = 'LOCATION'

##############################
# Choose one of the following:
##############################

# If you are calling a Gemini model, set the MODEL_ID variable and set
# your client's base URL to use openapi.
MODEL_ID = 'MODEL_ID'
client = openai.OpenAI(
    base_url = f'https://{LOCATION}-aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/openapi',
    api_key = creds.token)

# If you are calling a self-deployed model from Model Garden, set the
# ENDPOINT_ID variable and set your client's base URL to use your endpoint.
MODEL_ID = 'MODEL_ID'
client = openai.OpenAI(
    base_url = f'https://{LOCATION}-aiplatform.googleapis.com/v1beta1/projects/{PROJECT_ID}/locations/{LOCATION}/endpoints/{ENDPOINT}',
    api_key = creds.token)

기본적으로 액세스 토큰은 1시간 동안 지속됩니다. 액세스 토큰의 수명을 연장하거나 정기적으로 토큰을 새로고침하고 openai.api_key 변수를 업데이트할 수 있습니다.

환경 변수

Google Cloud CLI를 설치합니다. OpenAI 라이브러리는 기본 클라이언트의 인증 및 엔드포인트를 변경하기 위해 OPENAI_API_KEYOPENAI_BASE_URL 환경 변수를 읽을 수 있습니다. 다음 변수를 설정합니다.

$ export PROJECT_ID=PROJECT_ID
$ export LOCATION=LOCATION
$ export OPENAI_API_KEY="$(gcloud auth application-default print-access-token)"

Gemini 모델을 호출하려면 MODEL_ID 변수를 설정하고 openapi 엔드포인트를 사용합니다.

$ export MODEL_ID=MODEL_ID
$ export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi"

Model Garden에서 자체 배포된 모델을 호출하려면 ENDPOINT 변수를 설정하고 URL에 이를 대신 사용합니다.

$ export ENDPOINT=ENDPOINT_ID
$ export OPENAI_BASE_URL="https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/${ENDPOINT}"

다음으로 클라이언트를 초기화합니다.

client = openai.OpenAI()

Gemini Chat Completions API는 OAuth를 사용하여 단기 액세스 토큰으로 인증합니다. 기본적으로 액세스 토큰은 1시간 동안 지속됩니다. 액세스 토큰의 유효 기간을 연장하거나 정기적으로 토큰을 새로고침하고 OPENAI_API_KEY 환경 변수를 업데이트할 수 있습니다.

Chat Completions API로 Gemini 호출

다음 샘플은 스트리밍이 아닌 요청을 보내는 방법을 보여줍니다.

curl

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi/chat/completions \
  -d '{
    "model": "google/${MODEL_ID}",
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'
  

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

import vertexai
import openai

from google.auth import default, transport

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

vertexai.init(project=project_id, location=location)

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
auth_request = transport.requests.Request()
credentials.refresh(auth_request)

# # OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1beta1/projects/{project_id}/locations/{location}/endpoints/openapi",
    api_key=credentials.token,
)

response = client.chat.completions.create(
    model="google/gemini-1.5-flash-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)

다음 샘플은 Chat Completions API를 사용하여 Gemini 모델에 스트리밍 요청을 보내는 방법을 보여줍니다.

curl

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/openapi/chat/completions \
  -d '{
    "model": "google/${MODEL_ID}",
    "stream": true,
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'
  

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

import vertexai
import openai

from google.auth import default, transport

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

vertexai.init(project=project_id, location=location)

# Programmatically get an access token
credentials, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
auth_request = transport.requests.Request()
credentials.refresh(auth_request)

# OpenAI Client
client = openai.OpenAI(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1beta1/projects/{project_id}/locations/{location}/endpoints/openapi",
    api_key=credentials.token,
)

response = client.chat.completions.create(
    model="google/gemini-1.5-flash-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
    stream=True,
)
for chunk in response:
    print(chunk)

Chat Completions API로 자체 배포된 모델 호출

다음 샘플은 스트리밍이 아닌 요청을 보내는 방법을 보여줍니다.

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT}/chat/completions \
  -d '{
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'

다음 샘플은 Chat Completions API를 사용하여 자체 배포된 모델에 스트리밍 요청을 보내는 방법을 보여줍니다.

  curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT}/chat/completions \
  -d '{
    "stream": true,
    "messages": [{
      "role": "user",
      "content": "Write a story about a magic backpack."
    }]
  }'

지원되는 매개변수

Google 모델의 경우 Chat Completions API는 다음 OpenAI 매개변수를 지원합니다. 각 매개변수에 대한 설명은 OpenAI의 채팅 완성 생성 문서를 참고하세요. 서드 파티 모델의 매개변수 지원은 모델마다 다릅니다. 지원되는 매개변수를 확인하려면 모델의 문서를 참조하세요.

messages
  • System message
  • User message: textimage_url 유형이 지원됩니다. image_url 유형은 Cloud Storage URI에 저장된 이미지 또는 "data:<MIME-TYPE>;base64,<BASE64-ENCODED-BYTES>" 형식의 base64 인코딩을 지원합니다. Cloud Storage 버킷을 만들고 여기에 파일을 업로드하는 방법을 알아보려면 객체 스토리지 살펴보기를 참고하세요. detail 옵션은 지원되지 않습니다.
  • Assistant message
  • Tool message
  • Function message: 이 필드는 지원 중단되었지만 이전 버전과의 호환성을 위해 지원됩니다.
model
max_tokens
n
frequency_penalty
presence_penalty
response_format
  • json_object: 'application/json'을 Gemini API에 전달하는 것으로 해석됩니다.
  • text: Gemini API에 'text/plain'을 전달하는 것으로 해석됩니다.
  • 다른 모든 MIME 유형은 'application/json'을 직접 전달하는 것처럼 모델에 있는 그대로 전달됩니다.
stop
stream
temperature
top_p
tools
  • type
  • function
    • name
    • description
    • parameters: OpenAPI 사양을 사용하여 매개변수를 지정합니다. 이는 JSON 스키마 객체로 설명되는 OpenAI 매개변수 필드와 다릅니다. OpenAPI와 JSON 스키마 간의 키워드 차이점에 관한 자세한 내용은 OpenAPI 가이드를 참고하세요.
tool_choice
  • none
  • auto
  • required: FunctionCallingConfigANY 모드에 해당합니다.
function_call 이 필드는 지원 중단되었지만 이전 버전과의 호환성을 위해 지원됩니다.
functions 이 필드는 지원 중단되었지만 이전 버전과의 호환성을 위해 지원됩니다.

지원되지 않는 매개변수를 전달하면 무시됩니다.

사용자 인증 정보 새로고침

다음 예는 필요에 따라 사용자 인증 정보를 자동으로 새로고침하는 방법을 보여줍니다.

Python

from typing import Any

import google.auth
import google.auth.transport.requests
import openai


class OpenAICredentialsRefresher:
    def __init__(self, **kwargs: Any) -> None:
        # Set a dummy key here
        self.client = openai.OpenAI(**kwargs, api_key="DUMMY")
        self.creds, self.project = google.auth.default(
            scopes=["https://www.googleapis.com/auth/cloud-platform"]
        )

    def __getattr__(self, name: str) -> Any:
        if not self.creds.valid:
            auth_req = google.auth.transport.requests.Request()
            self.creds.refresh(auth_req)

            if not self.creds.valid:
                raise RuntimeError("Unable to refresh auth")

            self.client.api_key = self.creds.token
        return getattr(self.client, name)


# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"
# location = "us-central1"

client = OpenAICredentialsRefresher(
    base_url=f"https://{location}-aiplatform.googleapis.com/v1beta1/projects/{project_id}/locations/{location}/endpoints/openapi",
)

response = client.chat.completions.create(
    model="google/gemini-1.5-flash-002",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)

print(response)

다음 단계