반응형

Google DeepMind가 개발한 'Gemini'는 멀티모달을 위해 설계된 AI 모델의 집합체입니다. Vertex AI Gemini API를 통해, 사용자는 Gemini Pro Vision와 Gemini Pro 모델에 접근할 수 있게 되었습니다. 이 두 모델은 각각 다양한 멀티미디어 데이터와 자연어 처리 기능을 지원합니다.

  • Gemini Pro: 자연어 처리 작업, 다중턴 텍스트 및 코드 채팅, 그리고 코드 생성과 같은 작업을 처리하는 데에 최적화되어 있습니다.
  • Gemini Pro Vision: 멀티모달 프롬프트를 지원합니다. 사용자는 텍스트, 이미지, 비디오를 포함한 프롬프트 요청을 할 수 있으며, 텍스트나 코드 형태의 응답을 받을 수 있습니다.

Gemini API의 모델 정보에 대한 자세한 사양은 Model information에서 확인할 수 있습니다.

Gemini API를 사용하기 위해서는 몇 가지 사전 준비가 필요합니다. 이전 글 "Google Gemini API 사용하기 - Python (1): 사전준비"에서 확인하실 수 있습니다. 해당 글은 Python 환경 설정, 필요한 라이브러리 설치, Google Cloud 프로젝트 설정 등 Gemini API 사용을 위한 기본적인 준비 단계를 자세히 설명하고 있습니다. 본 글에 들어가기 전에, 반드시 해당 내용을 숙지하시길 바랍니다.

 

Google Gemini API 사용하기 - Python (1) : 사전준비

2023년 12월 6일, Google은 Gemini(제미나이)라는 Large Multimodal Model을 세상에 공개했습니다. 이 모델은 텍스트, 이미지, 오디오에 이르기까지 광범위하게 다양한 형태의 데이터 처리를 가능하게 합니다

yunwoong.tistory.com


Gemini API 사용하기

신규 고객들을 위해 Google은 Vertex AI 사용을 시작할 때 $300의 무료 크레딧을 제공합니다. 하지만 GPT와 같이, Vertex AI의 호출 건마다 비용이 발생하게 됩니다. 이 비용은 사용량과 이용한 서비스의 특성에 따라 달라질 수 있습니다. 이와 관련된 자세한 가격 정보와 조건은 Google Cloud의 가격 책정 페이지에서 확인하시기 바랍니다.

#1. Import Package

Google Gemini API를 사용하기 위한 필수 패키지와 라이브러리를 임포트 합니다.

import os
import io
import http.client
import typing
import urllib.request
import base64
from PIL import Image as PILImage
import matplotlib.pyplot as plt
import vertexai
from vertexai.preview.generative_models import GenerativeModel, Image
더보기
  • os, io, http.client, typing, urllib.request: 파일 시스템과 HTTP 요청을 다루는 데 필요한 표준 Python 라이브러리입니다.
  • base64: 이미지나 다른 데이터를 base64 형식으로 인코딩하거나 디코딩하는 데 사용됩니다.
  • PILImage (Pillow의 Image): 이미지를 로드하고 처리하는 데 사용되는 라이브러리입니다.
  • matplotlib.pyplot: 데이터를 시각화하는 데 사용되는 라이브러리입니다.
  • vertexai: Google Cloud의 Vertex AI SDK를 사용하기 위한 라이브러리입니다.
  • GenerativeModel, Image: Vertex AI의 generative models 기능을 사용하기 위한 클래스입니다.

#2. 설정 초기화

vertexai와 Google Cloud의 다른 API를 사용하기 위해서는 GOOGLE_APPLICATION_CREDENTIALS 환경변수, project_id, 그리고 location이 필요한데, 이러한 설정들은 사전준비 단계를 통해 이미 완료되었다고 가정하고, 이 글에서는 이 설정들을 바탕으로 Gemini API의 실제 사용 방법을 소개하겠습니다.

GOOGLE_APPLICATION_CREDENTIALS 환경변수: 이 환경변수는 Google Cloud API를 사용하기 위한 인증 정보 파일의 경로를 지정합니다. 서비스 계정 키 파일(JSON 형식)의 경로를 이 환경변수에 설정하여, 애플리케이션이 Google Cloud 서비스에 접근할 수 있도록 합니다.

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/path/to/your/service-account-key.json"

project_id: Google Cloud 프로젝트 ID는 Google Cloud 리소스와 서비스를 식별하는 데 사용됩니다. 이 ID는 Google Cloud Console에서 생성한 프로젝트에 할당되며, API 요청 시 이 프로젝트와 관련된 리소스에 접근하는 데 사용됩니다.

location: Google Cloud 서비스의 지리적 위치 또는 지역을 지정합니다. 이는 데이터 처리 위치나 서비스가 제공되는 지역을 나타내며, 일반적으로 지연 시간 최소화 및 데이터 주권 준수 등의 요구사항에 따라 선택됩니다.

더보기

미주
* 오리건(us-west1)
* 로스앤젤레스(us-west2)
* 솔트레이크시티(us-west3)
* 라스베이거스(us-west4)
* 아이오와(us-central1)
* 사우스캐롤라이나(us-east1)
* 북 버지니아(us-east4)
* 댈러스(us-south1)
* 몬트리올(northamerica-northeast1)
* 토론토(northamerica-northeast2)
* 상파울루(southamerica-east1)
* 산티아고(southamerica-west1)

유럽
* 런던(europe-west2)
* 벨기에(europe-west1)
* 네덜란드(europe-west4)
* 취리히(europe-west6)
* 프랑크푸르트(europe-west3)
* 핀란드(europe-north1)
* 바르샤바(europe-central2)
* 밀라노(europe-west8)
* 파리(europe-west9)
* 마드리드(europe-southwest1)

아시아-태평양
* 뭄바이(asia-south1)
* 싱가포르(asia-southeast1)
* 자카르타(asia-southeast2)
* 홍콩(asia-east2)
* 타이완(asia-east1)
* 도쿄(asia-northeast1)
* 오사카(asia-northeast2)
* 시드니(australia-southeast1)
* 멜버른(australia-southeast2)
* 서울(asia-northeast3)

중동
* 텔아비브(me-west1)

location = "your-google-cloud-location"
project_id = "your-google-cloud-project-id"

vertexai 라이브러리를 사용하기 위해 필요한 프로젝트 ID와 위치를 초기화합니다. 여기서 "your-google-cloud-project-id"와 "your-google-cloud-location"은 실제 Google Cloud 프로젝트 ID와 위치 정보로 교체해야 합니다. 예를 들어, 위치는 'asia-northeast3', 'europe-west1'과 같은 Google Cloud 지역으로 설정할 수 있습니다.

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

#3. Gemini API를 활용한 멀티모달 프롬프트 처리 함수 선언

Gemini API를 사용하여 텍스트와 이미지를 포함한 프롬프트를 처리하고, 결과를 출력하는 함수들을 정의합니다. load_and_encode_images 함수는 프롬프트를 로드하고 인코딩하며, display_response 함수는 처리된 결과를 시각적으로 표시합니다. chat_gemini 함수는 이러한 과정을 조정하고, 적절한 Gemini 모델을 선택하여 결과를 생성합니다.

def load_and_encode_images(prompts):
    encoded_prompts = []
    prompt_details = []
    image_count = 0  # 이미지 개수 카운터

    for item in prompts:
        prompt_detail = {"prompt": item}

        if item.startswith('http'):  # 이미지 URL인 경우
            response = typing.cast(http.client.HTTPResponse, urllib.request.urlopen(item))
            image_data = response.read()
            pil_image = PILImage.open(io.BytesIO(image_data))
            encoded_image = Image.from_bytes(image_data)
            encoded_prompts.append(encoded_image)
            prompt_detail["type"] = "image"
            prompt_detail["pil_image"] = pil_image
            image_count += 1
        elif item.split('.')[-1].lower() in ['jpg', 'jpeg', 'png']:  # 파일 경로인 경우
            with open(item, "rb") as image_file:
                image_data = image_file.read()
                pil_image = PILImage.open(io.BytesIO(image_data))
                encoded_image = Image.from_bytes(image_data)
                encoded_prompts.append(encoded_image)
                prompt_detail["type"] = "image"
                prompt_detail["pil_image"] = pil_image
                image_count += 1
        else:  # 텍스트인 경우
            encoded_prompts.append(item)
            prompt_detail["type"] = "text"

        prompt_details.append(prompt_detail)

    return encoded_prompts, prompt_details, image_count

def display_response(prompt_details, response_text):
    # 이미지와 텍스트 출력
    for prompt_detail in prompt_details:
        if prompt_detail["type"] == "image":
            plt.imshow(prompt_detail["pil_image"])
            plt.axis('off')
            plt.show()
        print("Prompt: {} (type: {})".format(prompt_detail['prompt'], prompt_detail['type']))

    for candidate in response_text.candidates:
        for part in candidate.content.parts:
            print("Gemini:{}".format(part.text))

def chat_gemini(prompts):
    encoded_prompts, pil_images, image_count = load_and_encode_images(prompts)

    # 이미지 개수에 따라 모델 선택
    if image_count > 0:
        model_name = "gemini-pro-vision"
    else:
        model_name = "gemini-pro"

    # GenerativeModel 객체 생성 및 콘텐츠 생성
    model = GenerativeModel(model_name)
    response = model.generate_content(encoded_prompts)

    print(f"Loaded {image_count} images using the '{model_name}' model.")
    display_response(pil_images, response)

#4. Sample prompts

1) 이미지에서 텍스트 추출하기
Gemini API를 사용하여 이미지 내의 손글씨 텍스트를 디지털 텍스트로 변환하는 방법을 살펴보겠습니다. Gemini Pro Vision 모델은 이미지를 분석하고, 그 안에 포함된 텍스트를 식별하여 읽어낼 수 있습니다. 예를 들어 회의 중에 작성된 메모나 중요한 손글씨 문서의 내용을 효율적으로 텍스트화할 수 있습니다.

prompts = ["asset/images/test_1.png", "Read the text in this image."]
chat_gemini(prompts)

2) 몇 가지 예시로 이미지를 JSON으로 변환하기
Gemini API를 활용하여 제한된 수의 예시를 바탕으로 이미지의 내용을 JSON 형식으로 해석하고 질문에 답하는 방법을 찾습니다. 이 과정에서는 제공된 예시들을 참조하여 이미지 속 정보를 분석하고 질문에 답합니다. Gemini Pro Vision 모델은 멀티모달 데이터를 처리할 수 있는 능력을 갖추고 있어, 이미지를 분석하고 그 안의 정보를 구조화된 데이터 형식인 JSON으로 변환하는 것이 가능합니다. 예를 들어, 이미지에 포함된 객체, 사람, 장소 또는 활동에 대한 정보를 추출하고 이를 질문의 맥락에 맞추어 답변할 수 있습니다.

prompts = ["asset/images/test_2.png", "city: Rome, Landmark: the Colosseum",
           "asset/images/test_3.png", "city: Beijing, Landmark: Forbidden City",
           "asset/images/test_4.png",
          ]
chat_gemini(prompts)

3) 이미지 질문 답변
Gemini API의 이미지를 이용한 질문과 답변이 가능합니다. 예를 들어, 브라질너트의 이미지를 모델에 보여주고, 다른 이미지에서 해당 너트의 가격을 찾아낼 수 있습니다.

prompts = ["asset/images/test_5.png", "asset/images/test_6.png", 
           "What is the price of this?",
          ]
chat_gemini(prompts)

4) 이미지 텍스트를 JSON으로 변환하기
Gemini API를 사용하여 특정 이미지에서 텍스트 정보를 추출하고, 이를 JSON 형식으로 변환할 수 있습니다. 구체적으로는, 어시장 사진에서 물건들과 그 가격을 추출하고, 이를 구조화된 JSON 데이터로 출력하는 예시입니다. Gemini Pro Vision 모델은 이미지 속 텍스트를 인식하고 해석이 가능합니다. 어시장의 사진 속에서 다양한 물고기와 해산물의 이름과 가격 표시를 감지하고, 이 정보를 추출하여 JSON 형식으로 정리합니다. 

prompts = ["Extract the items and prices from a fish market photo and output them in JSON.",
           "asset/images/test_7.png",
          ]
chat_gemini(prompts)

5) 이미지에서 이야기 만들기
Gemini API를 활용하여 이미지를 기반으로 창의적인 이야기를 작성하도록 할 수 있습니다. 구체적으로, 눈 속에서 스키 고글을 착용한 개의 이미지를 바탕으로 창의적인 이야기를 만들어냅니다.

prompts = ["asset/images/test_8.png",
           "Write a creative story inspired by this image",
          ]
chat_gemini(prompts)

6) 추가 테스트
이외에도, Vertex AI에서 제공하는 샘플 외에 다양한 실험을 추가로 진행해 보았습니다.

prompts = ["asset/images/test_9.png",
           "Just find the Audi car and tell me the number.",
          ]
chat_gemini(prompts)

prompts = ["asset/images/test_10.png",
           "Look at the picture and infer the size of the toy in cm.",
          ]
chat_gemini(prompts)


Vertex AI Studio

위에 작성한 모든 테스트는 Vertex AI Studio를 통해 별도의 코드 작성 없이 수행할 수 있습니다. Vertex AI Studio는 사용자 친화적인 인터페이스와 강력한 기능을 제공하여, 복잡한 코딩 과정 없이도 다양한 AI 모델을 쉽게 사용할 수 있도록 합니다.

이 플랫폼을 활용하면, 사용자는 손쉽게 Gemini API의 다양한 기능을 실험하고, 실시간으로 결과를 확인할 수 있습니다. 특히, 코드에 익숙하지 않은 사용자나 빠른 프로토타이핑을 원하는 개발자들에게 Vertex AI Studio는 효과적인 도구가 됩니다.


Google의 Vertex AI Gemini API의 다양한 기능과 사용 사례들을 알아보았습니다. 사실 Google이 Gemini를 처음 공개했을 때, 시연 영상의 편집에 대한 논란과 실제 사용자들이 경험한 성능에 관한 불만 등 여러 문제가 제기되었습니다. 하지만 이제 API가 공개되면서, 많은 개발자들이 직접 이 기술을 사용해 보고, Gemini가 어떤 변화와 발전을 가져올지에 대한 기대감이 커지고 있습니다. 제가 직접 경험해 본 바로는, Gemini API는 상당히 인상적인 성능을 보여주었습니다. 비록 초기에 몇 가지 우려가 있었지만, 이제 이 도구를 활용하여 다양한 프로젝트에 적용해 볼 수 있는 기회가 열렸으니, 개발자들의 활발한 사용과 피드백을 통해 Gemini API는 더욱 발전하고, AI 기술의 새로운 장을 열어갈 것으로 기대됩니다.

반응형