watsonxにより、PythonでのマルチモーダルAIクエリーにPixtral 12Bを使用

このチュートリアルでは、watsonx.aiで公開されているMistral AIのPixtral 12Bマルチモーダルモデルを、画像キャプションや視覚的質問応答などのマルチモーダルタスクに適用する方法を紹介します。

Pixtral 12B

2024年9月、Mistral AIはApache 2.0ライセンスのもとでオープンソースの大規模言語モデル(LLM)Pixtral 12Bをリリースしました。

120億のパラメーターを備えたマルチモーダル・モデルは、Mistral AIのNemo 12B LLMに基づいて構築されています。Pixtral 12Bには、画像をトークン化するビジョン・エンコーダーと、一連のテキストと画像が与えられた場合に次のテキスト・トークンを予測するマルチモーダル・トランスフォーマー・デコーダーの2つのコンポーネントがあります。ビジョン・エンコーダーには4億のパラメーターがあり、可変画像サイズをサポートしています。

このモデルは、文書に関する質問への回答、指示の遵守、検索拡張生成(RAG)のタスクなど、高解像度のグラフ、図、チャート、文書の理解を含む複数のユースケースに優れています。さらに、Pixtral 12Bには128,000トークンのコンテキスト・ウィンドウがあり、複数の画像を同時に利用できます。

ベンチマークに関しては、Pixtral 12Bは、Qwen2-VL、Gemini-1.5 Flash 8BおよびClaude-3 Highkuなどのさまざまなモデルを上回るパフォーマンスを発揮します。DocVQA(ANLS)やVQAv2(VQA Match)などの特定のベンチマークでは、モデルはOpenAIのGPT-4oおよびClaude-3.5 Sonnetを上回るパフォーマンスを提供します。

このモデルは、watsonx.ai上でPixtral 12Bを稼働させることができるほか、Hugging Face、Mistralの会話チャットボットであるLe Chat、MistralのLa Plateformeを通じたエンドポイントでも利用できます。

手順

このIBMテクノロジーによるYouTube動画では、ステップ1と2の設定手順を説明しています。

ステップ1. 環境を設定する

いくつかのツールから選択することもできますが、このチュートリアルはJupyter Notebookに最適化されています。Jupyter Notebookは、コードをテキスト、画像、データの可視化などのさまざまなデータ・ソースと組み合わせるためにデータサイエンスの分野で広く使用されています。

このチュートリアルでは、Jupyter Notebookを使用するためのIBMアカウントの設定方法について説明します。

  1. IBM Cloudアカウントを使用して、watsonx.aiにログインします。Pixtral 12Bは現在、IBMヨーロッパのフランクフルトおよびロンドン地域でのみ利用可能であることにご注意ください。

  2. watsonx.aiプロジェクトを作成します。

    プロジェクトIDはプロジェクト内から取得できます。[管理]タブをクリックし、[一般]ページの[詳細]セクションからプロジェクトIDをコピーしてください。このチュートリアルではこのIDが必要になります。

  3. Jupyter Notebookを作成します。

    このステップでは、このチュートリアルからコードをコピーして自分でプロンプト・チューニングを実施できるノートブック環境が開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。このJupyter Notebookと使用されるデータセットはGitHub にあります。

    Pythonパッケージの依存関係の衝突を避けるために、仮想環境をセットアップすることをお勧めします。

ステップ2. watsonx.aiランタイム・サービスとAPIキーを設定する

  1. watsonx.aiランタイム・サービス・インスタンスを作成します(無料インスタンスであるLiteプランを選択します)。
  2. APIキーを生成します。
  3. watsonx.aiのランタイム・サービスを、 watsonx.aiで作成したプロジェクトに関連付けます。

ステップ3. 関連ライブラリーをインストールしてインポートし、認証情報を設定する

このチュートリアルには、いくつかのライブラリーとモジュールが必要です。以下を必ずインポートしてください。それらがインストールされていない場合は、pipをクイックインストールすることで問題が解決されます。

#installations
%pip install image | tail -n 1
%pip install -U "ibm_watsonx_ai>=1.1.14" | tail -n 1

#imports
import requests
import base64
import getpass

from PIL import Image
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference

次のセルを実行するときに、ステップ1と2で作成したWATSONX_EU_APIKEYとWATSONX_EU_PROJECT_IDを入力します。また、APIのエンドポイントとして機能するURLも設定します。

WATSONX_EU_APIKEY = getpass.getpass("Please enter your watsonx.ai Runtime API key (hit enter): ")
WATSONX_EU_PROJECT_ID = getpass.getpass("Please enter your project ID (hit enter): ")
URL = "https://eu-gb.ml.cloud.ibm.com"

Credentialsクラスを使用して、渡した認証情報をカプセル化できます。

credentials = Credentials(
    url=URL,
    api_key=WATSONX_EU_APIKEY
)

ステップ4. 画像をエンコードする

このチュートリアルでは、画像キャプションや物体検出などのマルチモーダルAIアプリケーション用のいくつかの画像を使用します。使用する画像は、次のURLからアクセスできます。これらのURLをリストに保管して、繰り返しエンコードできます。

url_image_1 = 'https://assets.ibm.com/jp-ja/is/image/ibm/img_2803copy?$original$'
url_image_2 = 'https://assets.ibm.com/jp-ja/is/image/ibm/img_2857?$original$'
url_image_3 = 'https://assets.ibm.com/jp-ja/is/image/ibm/1ab001c5-751d-45aa-8a57-d1ce31ea0588?$original$'
url_image_4 = 'https://assets.ibm.com/jp-ja/is/image/ibm/langchain?$original$&fmt=png-alpha'

image_urls = [url_image_1, url_image_2, url_image_3, url_image_4]

データインプットをより深く理解するために、画像を表示してみましょう。

for idx, url in enumerate(image_urls):
    print(f'url_image_{idx}')
    display(Image.open(requests.get(url, stream=True).raw))

アウトプット

url_image_0

ピンクの花畑

url_image_1

ノートに書く女性

url_image_2

雪の上の女性と車

url_image_3

図

LLMで理解しやすい方法でこれらの画像をエンコードするには、画像をバイトにエンコードしてからUTF-8形式にデコードします。

encoded_images = []

for url in image_urls:
    encoded_images.append(base64.b64encode(requests.get(url).content).decode("utf-8"))

ステップ5. APIリクエストとLLMを設定する

画像をLLMに渡すことができるようになったので、watsonx API呼び出し用の関数を設定しましょう。augment_api_Request_body関数は、ユーザーのクエリーと画像をパラメーターとして受け取り、APIリクエストの本文を追加します。この関数は各イテレーションで使用されます。

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": 'You are a helpful assistant. Answer the following user query in 1 or 2 sentences: ' + user_query
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{image}",
                }
            }]
        }
    ]

return messages

ModelInferenceクラスを使用してモデル・インターフェイスをインスタンス化しましょう。このチュートリアルでは、mistralai/pixtral-12bモデルを使用します。

model = ModelInference(
    model_id="mistralai/pixtral-12b",
    credentials=credentials,
    project_id=WATSONX_EU_PROJECT_ID,
    params={
        "max_tokens": 200
        }
    )

ステップ6. 画像にキャプションを付ける

これで、画像をループして、「この画像では何が起こっていますか?」というクエリーに応じてモデルが生成したテキストの説明を確認できるようになりました。

for i in range(len(encoded_images)):
        image = encoded_images[i]
        user_query = "What is happening in this image?"
        messages = augment_api_request_body(user_query, image)
        response = model.chat(messages=messages)
        print(response['choices'][0]['message']['content'])

アウトプット: 

この画像は、澄んだ青空の下で太陽が明るく輝く、鮮やかな満開の花畑を描いたもので、穏やかで絵画のように美しい情景を作り出しています。

画像では、一人の人物がテーブルに座ってクレジットカードを持ちながらノートPCを使用しています。ノートPCの隣のテーブルの上にあるボウルにはいくつかのリンゴが入っています。

一人の人物が雪が積もった車の横に立ち、降る雪を避けるために赤い傘をさしています。

この画像は、機械学習やデータ分析向けである可能性が高いデータの処理と保存のワークフローを示しています。まず、ソース・データ(HTMLやXMLドキュメントなど)をロードし、データを適切なフォーマットに変換し、埋め込みを実行し、データをベクトル・ストアに保存し、最終的に必要に応じてデータを取得します。

Pixtral 12Bモデルは、各画像に詳細なキャプションを付けることに成功しました。

ステップ7. 物体を検知する

モデルが画像キャプションを実行する機能を紹介したので、物体検知を必要とするいくつかの質問をモデルに尋ねてみましょう。オンライン・ショッピングをしている女性を表す2番目の画像については、モデルに「女性は手に何を持っていますか?」と尋ねます。

image = encoded_images[1]
user_query = "What does the woman have in her hand?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプット:女性は手にクレジットカードを持っています。

モデルは女性の手元にあるオブジェクトを正しく識別しました。それでは、雪に覆われた車の画像の問題について質問してみましょう。

image = encoded_images[2]
user_query = "What is likely the issue with this car?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプット車が深い雪の中で立ち往生している可能性があり、移動が困難または不可能になっています。

この回答は、保険のような分野におけるマルチモーダルAIの価値を浮き彫りにしています。このモデルは雪の中で立ち往生している車の問題を検知することができました。これは、保険請求の処理時間を短縮するための強力なツールとなる可能性があります。

次に、フローチャートの画像のステップについてモデルに質問します。

image = encoded_images[3]
user_query = "Name the steps in this diagram"
request_body = augment_api_request_body(user_query, image)
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプット:この図は、いくつかのステップを含むプロセスを示しています:「読み込み」「変換」「埋め込み」「保管」「検索」。このシーケンスは、データの処理と保管のワークフローを表し、効率的な保管と検索のためにデータを埋め込みベクターに変換します。

成功です。このモデルは、ユーザーのクエリーに従って、画像内のオブジェクトを識別することができました。モデルの性能をさらに実証するために、より多くのクエリーを試すことをお勧めします。

まとめ

このチュートリアルでは、Pixtral 12Bモデルを使用して、画像のキャプションや視覚的な質問応答などのオペレーションを実行しました。

他のマルチモーダルモデルを試すには、watsonx.aiのMetaのマルチモーダルモデルLlama 3.2のチュートリアルをご覧ください。

関連ソリューション
IBM watsonx.ai

AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。

watsonx.aiをご覧ください。
人工知能ソリューション

業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。

AIソリューションはこちら
AIサービス

AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。

AIサービスはこちら
次のステップ

AI開発ライフサイクル全体にわたる機能にワンストップでアクセスできます。使いやすいインターフェース、ワークフロー、業界標準のAPIやSDKを利用して、強力なAIソリューションを構築できます。

watsonx.aiの詳細はこちら デモを予約