gpt-4o, gpt-4o-mini, gpt-4-turbo에는 Vision 기능이 있어 모델이 이미지를 입력 받고 이에 대한 질문에 답할 수 있습니다. 최근 gpt-4o-mini 모델이 등장하면서 가격은 매우 저렴하고 답변 속도와 퀄리티는 높아 이것저것 찾아보던 중, 이미지 인식도 가능하다는 소식을 들어서 사용법을 부랴부랴 찾아봤습니다.
OpenAI에서 운영하고 있는 ChatGPT 사이트에서는 클립 모양의 아이콘을 눌러서 파일을 업로드하고 프롬프트를 함께 보낼 수 있습니다. 간단하게 질문을 하나 던져보면
이미지안의 정보를 나름 정확하게 캐치하는 모습을 볼 수 있었습니다. (물론 플레이어 이름을 Mycin.T.님이라고 했는데 아티스트 이름입니다 ㅌㅌ)
Vision 기능을 활용할 만한 요소는 떠올리진 못했지만, 제가 개인적으로 운영하고 있는 디스코드 봇의 ChatGPT 명령어에 Vision 기능도 넣어보겠습니다.
사실 사용법에 대해서는 OpenAI의 Docs에 명시되어 있습니다. 다만, 그 위치가 조금 찾기가 힘들어서 많이 헤맸습니다. 먼저 이미지 분석 기능을 Vision
이라고 부르는 지도 모르던 상태여서 구글링으로 찾기가 어려웠고 Docs에서도 API 레퍼런스 쪽에는 관련 설명이 없어서 아직 API로는 지원을 안하는건가? 싶었습니다.
우선 공식가이드 링크는 아래에 있습니다.
https://platform.openai.com/docs/guides/vision
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What’s in this image?"},
{
"type": "image_url",
"image_url": {
"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",
},
},
],
}
],
max_tokens=300,
)
print(response.choices[0])
우선, Vision
기능을 활용하는 건 매우 쉽습니다. 기존에 사용자의 질문이 담긴 메시지부분에 image_url
을 담아서 함께 보내기만 하면 됩니다.
이제 저는 디스코드 봇으로 해당 기능을 활용해보겠습니다.
전부 작성하진 않고, 생략해서 작성하겠습니다. 이번 코드는 discord.py Slash Command
문법입니다.
# cog 방식의 class 내부 메소드입니다.
@app_commands.command(description='ChatGPT를 활용하여 질문을 합니다.')
@app_commands.describe(message="질문할 내용을 입력합니다.", file="파일도 함께 첨부하여 질문할 수 있습니다.")
async def 마이나야(self, interaction: Interaction[MynaBot], message: str, file: discord.Attachment = None):
await interaction.response.defer()
model = "gpt-4o-mini"
request_msg = {"role": "user", "content": [{"type": "text", "text": f"{message}"},]}
# file이 존재할 경우
if file:
# 이미지 확장자만 처리함. (*.txt나 엑셀파일은 따로 직접 처리해야합니다)
if file.content_type.startswith("image"):
if file.content_type.split("/")[1] not in ["png", "jpeg", "webp", "gif"]:
await interaction.followup.send(f"현재 마이나는 {', '.join(self.support_image)} 확장자만 지원해요.")
return
request_msg["content"].append({"type": "image_url", "image_url": {"url": f"{file.url}"}})
else:
await interaction.followup.send("현재 마이나는 이미지 파일 분석만 지원해요.")
return
prompt = self.system_msg + [request_msg]
msg = await interaction.followup.send("네, 잠시만 기다려주세요...")
# Call ChatGPT API (ChatGPT API 처리 부분은 생략)
res = await self.call_chatgpt(
interaction=interaction, msg=msg, user_message=message, prompt=prompt,
model=model, content_type=file.content_type if file else None, content=file if file else None
)
코드를 매우 간략화하긴 했습니다. 자세한 코드를 확인하고 싶다면 https://github.com/westreed/MynaBot/blob/main/core/ChatGPT.py 링크를 참고해주세요.
여담으로, Langchain을 활용해서 ChatGPT 관련 코드의 길이를 좀 줄여야하겠다는 생각이 드네요.