第3弾（Gemini 2.0 Flash編）：AIは「からあげ」と「とり天」を見分けられるのか【からあげ帝国-2】

この記事は、「[からあげ帝国 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/karaage)」の 24日目の記事です。

## はじめに
今回の記事では、『AIは「からあげ」と「とり天」を見分けられるのか』という先行研究で検証された内容を、それらの先行研究とは異なるモデルで試します。

### 元ネタについて
まずは、元ネタとなる先行研究 2つを掲載します。

- [AIは「からあげ」と「とり天」を見分けられるのか。Gemini、Claude、GPTのVision検証 - Qiita](https://qiita.com/n0bisuke/items/89d42b0131fdc1febcc5)
- [続・AIは「からあげ」と「とり天」を見分けられるのか：2024年12月リリースの正式版の o1 で再検証【からあげ帝国】 - Qiita](https://qiita.com/youtoy/items/d26eb970af60c477257e)

#### 元ネタでやっていた内容
上記2つ目の記事に書かれた内容から、元ネタでやっていた内容を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3ecd986a-c59a-4481-7122-bd07370b2488.png)

今回も利用する画像・プロンプトは、上記の先行研究に合わせて検証します。

> 【プロンプト】
あなたは画像の説明が上手い優秀なアシスタントです。この画像に何が写っているのかを小学生にも分かるように丁寧に説明をしてください。

## 今回の内容
### 今回試すモデル
今回は「Gemini 2.0 Flash」で試します。

●Gemini models  |  Gemini API  |  Google AI for Developers
　https://ai.google.dev/gemini-api/docs/models/gemini

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1b0d8c30-f38d-2d1d-f01d-1e8b5775a2e8.png)

上記の先行研究のうち、1つ目で試されていた「Gemini 1.5 Flash」の後継のモデルになります。

このモデルは、以下の 12/12 あたりにリリースされていました。

https://x.com/youtoy/status/1866904145871138973

●グーグルが次世代AIモデル「Gemini 2.0」発表、実行速度は前世代の2倍に - ケータイ Watch
　https://k-tai.watch.impress.co.jp/docs/news/1647014.html

Google AI Studio の Changelog を見てみると、12/11付でのアップデートのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/18337153-82c0-4923-d972-2ed40d85392b.png)

### ソースコード
今回使うソースコードは、以下の記事で自分が試していた「OpenAI公式のパッケージ ＋ Gemini の API」を使ったものです。

●Gemini の API を OpenAI のパッケージ ＋ Node.js で試す（テキスト・複数の画像の入力）【生成AI−2】  - Qiita
　https://qiita.com/youtoy/items/0a4539ce6b9160d55e60

今回用に実装した内容は以下の通りです。

処理の内容としては、上で用いていたものと同様に画像ファイル 2つを同時に API に渡す形にしています。また、Gemini の APIキーは、環境変数から読みこみます。

```javascript
import OpenAI from "openai";
import fs from "fs";

const apiKey = process.env["GEMINI_API_KEY"];
const baseURL = "https://generativelanguage.googleapis.com/v1beta/openai/";

const openai = new OpenAI({
  apiKey,
  baseURL,
});

async function main() {
  const message = "あなたは画像の説明が上手い優秀なアシスタントです。この画像に何が写っているのかを小学生にも分かるように丁寧に説明をしてください。";
  console.log(message);

  const imagePaths = ["./input1.jpg", "./input2.jpg"];
  const imageBase64List = imagePaths.map((imagePath) => {
    const imageBuffer = fs.readFileSync(imagePath);
    return imageBuffer.toString("base64");
  });

  const response = await openai.chat.completions.create({
    // model: "gemini-1.5-flash",
    model: "gemini-2.0-flash-exp",
    messages: [
      {
        role: "user",
        content: [
          { type: "text", text: message },
          {
            type: "image_url",
            image_url: {
              url: `data:image/jpeg;base64,${imageBase64List[0]}`,
            },
          },
          {
            type: "image_url",
            image_url: {
              url: `data:image/jpeg;base64,${imageBase64List[1]}`,
            },
          },
        ],
      },
    ],
  });
  console.log(response.choices[0].message);
}
main();
```

### 得られた結果
今回得られた結果は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/36f24f9c-7fa1-9756-d082-d847ba9653b7.png)

無事に「からあげ」と「とり天」を見分けられました。

#### シンプルに聞いた結果
また、「これらの画像には何がうつってる？」というシンプルなプロンプトでも試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a50d922f-2901-ed58-0543-5d698326eeae.png)

> これらの画像には、どちらも鶏肉を揚げた料理である唐揚げが写っています。
>
> 1枚目の画像は、天ぷらの衣のような衣で揚げられた鶏肉の唐揚げで、おそらく鶏天です。マスタードソースとパセリのような緑の葉が添えられています。
>
> 2枚目の画像は、より伝統的な唐揚げで、カラッと揚がった衣にレタスとレモンのくし切りが添えられています。

こちらでも無事に「からあげ」と「とり天」を見分けられました。