AzureからGPTを使ってみる | promptに画像を入力する

GPT4oは、マルチモーダルLLMなので、画像をプロンプトとして渡すことができます。今回は、画像をBase64エンコードしてGPT4oへ渡し、その画像についてGPTに尋ねてみたいと思います。


・画像入力


試しにこの画像を入力してみます。

 #openai =1.35.12  
from openai import AzureOpenAI
import base64
from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_TYPE = os.getenv('OPENAI_API_TYPE')
OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

client = AzureOpenAI(
    api_key=OPENAI_API_KEY,  
    api_version=OPENAI_API_VERSION,
    azure_endpoint=OPENAI_API_BASE
)

def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

base64_image = encode_image("hana.jpg")

response = client.chat.completions.create(
  model="gpt4o",# "deployment_name"
  messages=[
    {
      "role": "system",
      "content": "あなたは花に詳しい優秀なAIです。質問に対して丁寧に回答してください。"
    },
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "提供された画像について説明してください。"},
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}"
          }
        }
      ]
    }
  ],
  max_tokens=300
)
print(response.choices[0].message.content)
この画像には美しいアサガオ(朝顔)の花が写っています。アサガオはつる性の植物であり、支柱や他の植物に絡みつきながら成長します。鮮やかなピンク色の花がいくつか咲いており、中心部が白くなっています。アサガオの花びらは特徴的な漏斗型をしており、夏の朝に開花し、昼過ぎにはしぼんでしまうことが多いです。葉は心形で、緑色をしています。この植物は庭やベランダで育てるのに人気があり、夏の景観を美しく彩ります。

しっかり認識できていますね。

・複数画像を入力

上で使用した画像に加えて、以下の画像を加えて複数の画像を渡してみます。

画像をエンコードする関数以下を、↓のように変更します。

base64_image = encode_image("hana.jpg")
base64_image_1 = encode_image("hana1.jpg")

response = client.chat.completions.create(
  model="gpt4o",# "deployment_name"
  messages=[
    {
      "role": "system",
      "content": "あなたは花に詳しい優秀なAIです。質問に対して丁寧に回答してください。"
    },
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "提供された画像について説明してください。"},
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}"
          }
        },
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image_1}"
          }
        },
      ]
    }
  ],
  max_tokens=300
)
print(response.choices[0].message.content)
これらの画像には、異なる種類の花が写っています。

1枚目の画像は、朝顔(アサガオ)と思われる花です。朝顔は、日本で古くから愛されているつる性植物で、鮮やかなピンク色と白のコントラストが美しい花が特徴的です。葉はハート形で、つるが他の構造物に絡まって成長します。

2枚目の画像は、ヒマワリ(ひまわり)です。ヒマワリは大きな黄色い花弁と、中央の茶色い花の部分が特徴です。夏の象徴として広く知られており、背が高く伸びる植物で、太陽に向かって花が回る性質があります。

どちらの花も、鮮やかな色合いと独特の形状が美しく、人々に親しまれている植物です。

2枚ともしっかり認識していますね。

・Langchainを使用して画像を渡す

 #langchain =0.2.7   #langchain -core=0.2.12   #langchain -openai=0.1.14   

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts.chat import HumanMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import AzureChatOpenAI

import base64
from dotenv import load_dotenv
import os

# OpenAI APIキーの設定
dotenv_path = ".env"
load_dotenv(dotenv_path)

OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

os.environ["AZURE_OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["AZURE_OPENAI_ENDPOINT"] = OPENAI_API_BASE

client = AzureChatOpenAI(
    api_version=OPENAI_API_VERSION, 
    azure_deployment="gpt4o" # model = "deployment_name"
    )

def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

base64_image = encode_image("hana.jpg")

image_template = {
              "type": "image_url",
              "image_url": {
                "url": f"data:image/jpeg;base64,{base64_image}"
              }
            }

system_prompt = "あなたは花に詳しい優秀なAIす。質問に対して丁寧に回答してください。"
human_prompt = "{question}"

human_message_template = HumanMessagePromptTemplate.from_template([human_prompt, image_template])
prompt = ChatPromptTemplate.from_messages([("system", system_prompt), human_message_template])

chain = (
prompt
| client
| StrOutputParser() 
)

result = chain.invoke({"question": "提供された画像について説明してください。"})

print(result)
この画像には、アサガオ(朝顔)の花が写っています。アサガオはつる性の植物で、夏の朝に花を咲かせることで知られています。画像に写っている花は、鮮やかなピンク色で、中心部が白くなっています。葉は心形(ハート形)で、緑色をしています。アサガオは日本の夏の風物詩として親しまれており、特に学校の理科の授業や家庭での栽培に利用されることが多いです。画像の背景には、支柱が見え、つるがそれに巻き付いて成長している様子が見受けられます。

・おまけ

以下の画像内にあるリンゴの数がわかるか質問してみましたが、回答は12個で間違い。
画像内の物体が何かは理解していましたが、数までは理解できないようです。
(ちなみにこの画像も、”10個のリンゴの画像を生成して”とDALL-E3にお願いしたものです。数の認識はまだまだのようです。)


この記事が気に入ったらサポートをしてみませんか?