LlamaIndex でマルチモーダル対応が始まったので読み込んだ画像に OpenAI で質問してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、アノテーション の中野です。

LlamaIndex に関するツイートを追いかけていたところ、以下の様な投稿を目にしました。

LlamaIndex がマルチモーダルに対応したとのことです。
このツイートは、某ハンバーガーショップのレシートの画像を LlamaIndex に食わせて、「直近某ハンバーガーショップに行ったのはいつ?合計いくら使った?」といった画像に対する質問に答えられるようにアップデートを加えたという内容です。

これはすごいと思い、筆者も試してみることにしました。

マルチモーダルとは

マルチモーダルという言葉自体、筆者に馴染みがなかったので、まずは Web 版 ChatGPT に答えてもらいました。

近年、自然言語処理技術やコンピュータビジョン技術の進歩により、テキスト、音声、画像、動画など異なる形式の情報を組み合わせて、より豊かな情報を得ることができるようになりました。例えば、ビデオ内の音声と映像を同時に処理して、映像の内容から話者の表情や感情を推定するなど、マルチモーダルな情報処理が活用されるようになっています。

要するに、AI がインプットできる情報はテキストだけではなく、画像・音声・動画などの人間が認識できる形式で学習・処理してコミュニケーションできるようにする技術のことのようです。
これまでテキスト情報でしかコミュニケーションできなかったものが、より柔軟な情報で認識できるようになるのは、とても画期的ですね。

やってみた

レシートの情報を読み取って会話できるのはわかったので、筆者の場合は Twitter の TOP 画像を使った会話をやってみます。

環境情報

  • macOS Ventura 13.2.1 (Intel)
  • Python 3.8.12
  • pip 23.0.1
  • llama-index 0.4.28
  • Jupyter Notebook 6.5.3
  • Jupyter Lab 3.6.1

インストール

$ pip install jupyter
$ pip install jupyterlab

コード

基本的には、公開されているコードと同じですが筆者の手元で動かしたコードを GitHub に保存しました。

画像は、以下の筆者の Twitter の TOP 画像を利用することにします。

また、OpenAIへの質問として Twitter のアカウント名、開始日、アイコンのカラーを答えてもらいます。

llamaindex_multimodal.ipynb

from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader
from llama_index.indices.query.query_transform.base import (
    ImageOutputQueryTransform,
)
from llama_index.response.notebook_utils import (
    display_response,
    display_image,
)

imageReader = SimpleDirectoryReader(
    input_dir='data/',
    file_extractor=file_extractor,
    file_metadata=filename_fn,
)

documents = imageReader.load_data()

index = GPTSimpleVectorIndex(documents)

question = "Tell me the account name written in the image and what year and month you started Twitter. What color is the icon? "

answer = index.query(question, query_transform=ImageOutputQueryTransform(width=400))
display_response(answer)

なお、コードの ImageOutputQueryTransform は Jupyter Notebook 上で画像を表示する指示を与えるためのメソッドです。
準備ができたら、以下コマンドで Jupyter Lab のローカルサーバーを起動させます。

$ jupyter lab

ブラウザにて、http://localhost:8888/lab が起動します。

起動した画面でソースコードを選択して、三角のボタンを押して実行します。

出力結果

しばらくすると、画像とテキストが出力されました。

2023-03-17 17:32:23.285110: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Could not find image processor class in the image processor config or the model config. Loading based on pattern matching with the model's feature extractor configuration.
INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens
INFO:root:> [build_index_from_documents] Total embedding token usage: 219 tokens
INFO:root:> [query] Total LLM token usage: 357 tokens
INFO:root:> [query] Total embedding token usage: 25 tokens


Final Response: The account name written in the image is @engin_yo and the year and month they started Twitter is 2020. The icon color is blue.

DeepLの翻訳結果:
画像に書かれているアカウント名は「@engin_yo」、Twitterを始めた年月は「2020」です。アイコンカラーは青です。

アカウント名、Twitter の開始日、アイコンのカラーが全て一致しています。
驚くことに、アイコンのカラーが Blue(青) であることも認識されていました。

躓きポイント

Jupyter Notebook のローカルサーバーを起動させる際に、以下のようなエラーがでました。

ValidationError: 1 validation error for OpenAI
__root__
  Did not find openai_api_key, please add an environment variable `OPENAI_API_KEY` which contains it, or pass  `openai_api_key` as a named parameter. (type=value_error)

OPENAI_API_KEY が設定されていないとのことで、コンソールを開いて環境変数にて設定することでエラーは解消されます。

さいごに

こちらのツイートにも書いてあるとおり、このアップデートは始まりでしかなく、マルチモーダル LLM のリリースも近日中に発表されるみたいです。
また、マルチモーダルの推論と合成が改善しており、テキスト以外の形式でも対応していくことが期待されます。

LlamaIndex のマルチモーダル対応によりオリジナルのデータを使って画像や動画を学習することが可能になる未来も近いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社 WEB サイトをご覧ください。