LlamaIndexとGPT4Vによるマルチモーダル検索

技術の進化は止まりません。こちらのページの前半をDatabricksでウォークスルーします。

https://docs.llamaindex.ai/en/stable/examples/multi_modal/gpt4v_multi_modal_retrieval.html

以下のステップを踏みます。

1. 複数の画像を理解するためにマルチモーダルのLLMであるGPT4Vを使います
1. 画像をダウンロードします
1. テキストと画像に対するマルチモーダルインデックスとベクトルストアを作成します
1. ステップ1の画像理由付けに従うマルチモーダルリトリーバを用いて適切なテキストと画像を同時に検索します

# ライブラリのインストール

```py
%pip install llama-index-multi-modal-llms-openai
%pip install llama-index-vector-stores-qdrant
%pip install llama_index ftfy regex tqdm
%pip install git+https://github.com/openai/CLIP.git
%pip install torch torchvision
%pip install matplotlib scikit-image
%pip install -U qdrant_client
dbutils.library.restartPython()
```

# APIキーのセットアップ

Open AI APIキーは[シークレット](https://docs.databricks.com/ja/security/secrets/secrets.html)に格納しています。

```py
# OpenAIのセットアップ
import os
import openai

OPENAI_API_TOKEN = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
os.environ["OPENAI_API_KEY"] = OPENAI_API_TOKEN
```

# GPT4Vによる画像の理由付けのためにTeslaのウェブサイトから画像をダウンロード

```py
from pathlib import Path

input_image_path = Path("input_images")
if not input_image_path.exists():
    Path.mkdir(input_image_path)
```

```sh
!wget "https://docs.google.com/uc?export=download&id=1nUhsBRiSWxcVQv8t8Cvvro8HJZ88LCzj" -O ./input_images/long_range_spec.png
!wget "https://docs.google.com/uc?export=download&id=19pLwx0nVqsop7lo0ubUSYTzQfMtKJJtJ" -O ./input_images/model_y.png
!wget "https://docs.google.com/uc?export=download&id=1utu3iD9XEgR5Sb7PrbtMf1qw8T1WdNmF" -O ./input_images/performance_spec.png
!wget "https://docs.google.com/uc?export=download&id=1dpUakWMqaXR4Jjn1kHuZfB0pAXvjn2-i" -O ./input_images/price.png
!wget "https://docs.google.com/uc?export=download&id=1qNeT201QAesnAP5va1ty0Ky5Q_jKkguV" -O ./input_images/real_wheel_spec.png
```

これらは[ワークスペースファイル](https://docs.databricks.com/ja/files/workspace.html)として保存されます。便利です。
![Screenshot 2024-02-17 at 21.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a8acf7e1-669d-d74b-1b31-c6a4b7faa401.png)

# GPT4VマルチモーダルLLMから画像の理由付けを生成

## 入力画像のプロット

```py
from PIL import Image
import matplotlib.pyplot as plt
import os

image_paths = []
for img_path in os.listdir("./input_images"):
    image_paths.append(str(os.path.join("./input_images", img_path)))


def plot_images(image_paths):
    images_shown = 0
    plt.figure(figsize=(16, 9))
    for img_path in image_paths:
        if os.path.isfile(img_path):
            image = Image.open(img_path)

            plt.subplot(2, 3, images_shown + 1)
            plt.imshow(image)
            plt.xticks([])
            plt.yticks([])

            images_shown += 1
            if images_shown >= 9:
                break


plot_images(image_paths)
```

人が見てもTeslaの画像であることはわかります。
![Screenshot 2024-02-17 at 21.03.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/997c195c-8c3e-fef6-c687-5e4594ab9f83.png)

## これらの画像を理解するためにGPT4Vを活用

```py
from llama_index.multi_modal_llms.openai import OpenAIMultiModal
from llama_index.core import SimpleDirectoryReader

# ローカルディレクトリを指定
image_documents = SimpleDirectoryReader("./input_images").load_data()

openai_mm_llm = OpenAIMultiModal(
    model="gpt-4-vision-preview", api_key=OPENAI_API_TOKEN, max_new_tokens=1500
)

response_1 = openai_mm_llm.complete(
    prompt="代替テキストとして画像を説明して下さい",
    image_documents=image_documents,
)

print(response_1)
```

びっくりです。

```
最初の画像には、テキストで書かれた仕様があり、以下のような情報が含まれています：
- バッテリータイプ：Rear-Wheel Drive / Long Range AWD
- 加速（0-100 km/h）：3.7秒 / 4.8秒
- 航続距離：Range 497 km (EPA est.) / Long Range 539 km (EPA est.)
- 最高速度：Top Speed 250 km/h / 217 km/h
- ドライブタイプ：Dual Motor All-Wheel Drive
- ホイールサイズ：Up to 5 Seating / 19" or 20" Wheels
- ワランティ：Basic Vehicle - 4 years or 80,000 km, whichever comes first / Battery & Drive Unit - 8 years or 192,000 km, whichever comes first

二番目の画像は、電気自動車の透視図で、車体の骨格と内部構造が示されています。画像には「Rigid Structure」と「Impact Protection」というラベルが付いており、車の安全性に関する特徴を強調しています。

三番目の画像は、最初の画像と同様に、車の仕様をリストしたテキストが含まれていますが、異なるモデルの情報が記載されています。

四番目の画像は、車の価格情報と推定納車日、潜在的な節約額、性能の概要を含むテキストが含まれています。また、異なるモデルの価格がリストされており、購入オプションに関する情報が含まれています。

五番目の画像は、再び車の仕様をリストしたテキストが含まれており、異なるモデルの情報が記載されています。

全体として、これらの画像は電気自動車の様々なモデルの詳細な仕様、価格、および構造的特徴を提供しています。
```

```py
response_2 = openai_mm_llm.complete(
    prompt="それぞれのスペックの価格を教えてくれませんか？",
    image_documents=image_documents,
)

print(response_2)
```

どういうことなの…

```
画像には、特定の電気自動車のモデルとそのスペックが表示されていますが、直接的な価格情報は含まれていません。ただし、最後の画像には、モデルYの異なるバリアントの価格が示されています。以下は、その価格の概要です：

- Model Y Rear-Wheel Drive: $57,990
- Model Y Dual Motor All-Wheel Drive: $67,990
- Model Y Performance: $74,990

これらの価格は、推定される潜在的な節約額や、可能な連邦税のインセンティブを考慮していない、基本的な購入価格です。また、価格は地域や国によって異なる場合があり、追加のオプションや税金、手数料が加算される可能性があります。購入を検討している場合は、最新の価格とオファーについては、直接メーカーのウェブサイトを確認するか、最寄りのディーラーに問い合わせることをお勧めします。
```

[Sora](https://openai.com/sora)も出てきて、なおさらマルチモーダルの世界が広がりますね。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)