🍕

【サイゼチャレンジ】o1 vs サイゼリヤの間違い探し

に公開

はじめまして
ふっきーと申します。

Langchain x OpenAI APIで複数枚の画像をAPIに渡せることを知って、試しにサイゼリヤの間違い探しをさせてみました。

今回チャレンジするのは、この間違い探しです。

実装

Langchainを使って、実装しました。

import base64
from typing import List
from pydantic import BaseModel, Field

from langchain_core.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)

from llm.models import GPT_o1


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


class Difference(BaseModel):
    differnce: str = Field(description="間違いのある箇所の説明")


class FindDifferenceOutput(BaseModel):
    differences: List[Difference] = Field(description="10箇所ある間違いの箇所のリスト")


class FindDifference:
    def __init__(self):
        self.llm = GPT_o1
        self.system_prompt = """
        画像を2枚入力するので、間違い探しをしてください。
        間違いは10箇所あります。

        人間には不可能なレベルで難しいので、注意深くよく見て、探してください。
        """

    def _make_prompt(self, left_img: str, right_img: str):
        human_message = HumanMessagePromptTemplate.from_template(
            [
                "{input}",
                {"image_url": {"url": f"data:image/png;base64,{left_img}"}},
                {"image_url": {"url": f"data:image/png;base64,{right_img}"}},
            ]
        )
        return ChatPromptTemplate.from_messages(
            [("system", self.system_prompt), human_message]
        )

    def run(self, left_img: str, right_img: str) -> FindDifferenceOutput:
        chain = self._make_prompt(
            right_img=right_img, left_img=left_img
        ) | self.llm.with_structured_output(FindDifferenceOutput)
        output = chain.invoke("間違い探し スタート!")
        return output


if __name__ == "__main__":
    left_img_path = "./left.png"
    right_img_path = "./right.png"

    left_img = encode_image(left_img_path)
    right_img = encode_image(right_img_path)

    find_difference = FindDifference()
    output = find_difference.run(left_img=left_img, right_img=right_img)

    for diff in output.differences:
        print(diff.differnce)

出力結果

左奥の男の子のTシャツにあった渦巻き模様が片方の絵では消えている
中央テーブルの左上の料理にのっている赤い具材の有無が違う
ピンクの服を着ている女性の右耳のピアスが片方の絵では省略されている
奥の年配の男性が着けている蝶ネクタイの色(または有無)が異なる
テーブルに置かれている水差し(ピッチャー)の取っ手の形状が片方で変わっている
給仕している店員が持っているパンの模様や切り込みが一方では異なる
テーブル中央の右下の料理に入っている小さな野菜の色や形が一方では消えている
オレンジ色の服を着た男性が口にしている食べ物の形が片方で異なる
左手前の白いシャツの男性のスプーン(またはフォーク)が片方の絵で消えている
右下に置いてあるワインボトルの本数か配置が両方で異なる

すごいそれっぽいので、期待できますね

結果発表~~!!!

〇:右下に置いてあるワインボトルの本数か配置が両方で異なる
✕:それ以外

正解は、1/10でした…

だが、まだあきらめないっ…!!
次は、左右連結した1枚の画像を渡してみます。

実装Part2

そんなに変わらんけど…

class FindDifference:
    def __init__(self):
        self.llm = GPT_o1
        self.system_prompt = """
        画像を入力するので、左右の画像を見比べて、間違い探しをしてください。
        間違いは10箇所あります。

        人間には不可能なレベルで難しいので、注意深くよく見て、探してください。
        """

    def _make_prompt(self, img: str):
        human_message = HumanMessagePromptTemplate.from_template(
            [
                "{input}",
                {"image_url": {"url": f"data:image/png;base64,{img}"}},
            ]
        )
        return ChatPromptTemplate.from_messages(
            [("system", self.system_prompt), human_message]
        )

    def run(self, img: str) -> FindDifferenceOutput:
        chain = self._make_prompt(img=img) | self.llm.with_structured_output(
            FindDifferenceOutput
        )
        res = chain.invoke("間違い探し スタート!")
        return res


if __name__ == "__main__":
    img_path = "./diff.png"

    img = encode_image(img_path)

    find_difference = FindDifference()
    output = find_difference.run(img=img)

    for diff in output.differences:
        print(diff.differnce)

出力結果 Part2

右上にあるドリンクバー(飲み物サーバー)の色の区切り方が左右で違う
オレンジ色の服を着た男性が持っているパンのかたち(大きさ)が違う
テーブル中央にある大皿のトッピング(スパゲッティソースの具材)が違う
テーブル上段左の小皿に入っているソースの具や色が違う
テーブル上段中央の小皿に入っているソースの具や色が違う
テーブル上段右の小皿に入っているソースの具や色が違う
テーブル下段左の小皿に入っているソースの具や色が違う
テーブル下段中央の小皿に入っているソースの具や色が違う
テーブル下段右の小皿に入っているソースの具や色が違う
右下のビン(ボトル)が左右で本数や色が微妙に違う

やる気ないやろ…

結果発表 Part2

〇:右下のビン(ボトル)が左右で本数や色が微妙に違う
✕:それ以外

おんなじ

※最後の回答は少し甘めに見ました。

結論

サイゼの間違い探しは、人類にもAIにも早かった

最後に

挑戦者求ム!!

なんの工夫もない手段では、10%の正解率でしたが、工夫をすればもっと間違いが見つけられるかもしれないので、ぜひ、チャレンジしてみてください

「次は、君の番だ」

Discussion