【langchain v0.3】ChatOpenAIの使い方メモ(画像添付)
概要
langchain v0.3のChatOpenAIの画像添付のやり方をよく忘れるので自分用にまとめました。
準備
pip install langchain langchain-openai
環境変数OPENAI_API_KEYを指定します。もしくはプロジェクトのルートに.env
を作成しOPENAI_API_KEYを指定します。
コード
基本的には、HumanMessageのcontentに{"type": "image_url", "image_url": "urlまたはbase64でーt"}
と指定すればよいです。(参考)
URL
インターネット上の画像の場合、対応しているモデルであれば、URLの直書きでいけます。
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
model = ChatOpenAI(model="gpt-4o-mini")
message = HumanMessage(
content=[
{"type": "text", "text": "この画像の天気を教えて"},
{"type": "image_url", "image_url": {"url": image_url}},
],
)
response = model.invoke([message])
print(response.content)
申し訳ありませんが、画像から具体的な天気を判断することはできません。ただし、晴れた青空と柔らかな雲が見られるので、穏やかな天気のように見えます。
URLの直書きに対応していないモデルの場合は、URLからコンテンツをダウンロードしてbase64を入力します。
import base64
import httpx
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
model = ChatOpenAI(model="gpt-4o-mini")
message = HumanMessage(
content=[
{"type": "text", "text": "この画像の天気を教えて"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"},
},
],
)
response = model.invoke([message])
print(response.content)
画像を直接分析することはできませんが、青空と緑の草原から、穏やかで晴れた天気のように見えます。もし天気の詳細を知りたい場合は、具体的な地域や日付を教えていただければ、一般的な情報をお伝えできます。
ローカルファイル
ローカルファイルの場合はbase64に変換して入力します。
空の画像を"sample.jpg"という名前で保存して試します。
import base64
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
def get_base64_from_image(image_path: str) -> str:
"""
画像ファイルを読み込み、base64エンコードされた文字列を返す関数
Args:
image_path (str): 画像ファイルのパス
Returns:
str: base64エンコードされた画像データ
"""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
image_data = get_base64_from_image("sample.jpg")
model = ChatOpenAI(model="gpt-4o-mini")
message = HumanMessage(
content=[
{"type": "text", "text": "この画像の天気を教えて"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"},
},
],
)
response = model.invoke([message])
print(response.content)
画像から直接天気を判断することはできませんが、青空と雲が見られることから、晴れているか、少し曇っている可能性があります。具体的な天気情報は、現地の天気予報を確認することをお勧めします。