ストーリー
田
田中VPoE
マルチモーダルAIの全体像を掴んだところで、今最も注目されているVision Language Models(VLM)を深掘りしよう
あなた
GPT-4VやClaude Visionですよね。画像を見て質問に答えられるモデルですか?
あ
田
田中VPoE
そうだ。ただ「画像を見る」だけではない。テキストの指示と組み合わせて、画像の分析、比較、文字読み取り、さらにはコード生成まで行える。NetShop社の商品画像管理や品質検査に直結する技術だ
あなた
具体的にどうやって画像を「理解」しているんですか?
あ
田
田中VPoE
その仕組みを理解することで、プロンプト設計やモデル選定が適切にできるようになる。見ていこう
VLMのアーキテクチャ
基本構造
VLMは大きく3つのコンポーネントで構成されます。
┌─────────────────────────────────────────┐
│ Vision Language Model │
│ │
│ ┌─────────┐ ┌──────────┐ ┌────────┐ │
│ │ Visual │ │Projection│ │ LLM │ │
│ │ Encoder │→│ Layer │→│ (言語 │ │
│ │(ViT等) │ │ │ │ モデル) │ │
│ └─────────┘ └──────────┘ └────────┘ │
│ ↑ ↑ │
│ [画像入力] [テキスト入力] │
└─────────────────────────────────────────┘
| コンポーネント | 役割 | 具体例 |
|---|
| Visual Encoder | 画像をベクトル表現に変換 | ViT, CLIP Vision |
| Projection Layer | 画像ベクトルをLLMの入力空間にマッピング | Linear層, Q-Former |
| LLM | テキストと統合して推論・生成 | GPT-4, Claude, Gemini |
処理フロー
1. 画像を受け取る
2. Visual Encoderでパッチ分割 → 特徴量抽出
(例: 224x224画像 → 16x16パッチ × 196個 → 各パッチのベクトル)
3. Projection Layerで画像トークンに変換
4. テキストトークンと結合してLLMに入力
5. LLMが統合的に推論し、テキストを生成
主要VLMの比較
GPT-4V / GPT-4o (OpenAI)
from openai import OpenAI
import base64
client = OpenAI()
# 画像をBase64エンコードして送信
with open("product_image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "この商品画像を分析し、商品説明文を生成してください"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}",
"detail": "high" # low / high / auto
}
}
]
}
],
max_tokens=1000
)
Claude Vision (Anthropic)
import anthropic
import base64
client = anthropic.Anthropic()
with open("invoice.pdf", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data
}
},
{
"type": "text",
"text": "この請求書から、発行日、金額、宛先を抽出してJSON形式で返してください"
}
]
}
]
)
Gemini (Google)
import google.generativeai as genai
from PIL import Image
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-pro-vision")
image = Image.open("product.jpg")
response = model.generate_content(
["この画像に含まれる全てのテキストを読み取ってください", image]
)
VLMの能力と限界
得意なタスク
| タスク | 説明 | 精度目安 |
|---|
| 画像キャプション | 画像の内容を自然言語で説明 | 高 |
| VQA(視覚質問応答) | 画像に関する質問に回答 | 高 |
| OCR(文字認識) | 画像内のテキスト読み取り | 中〜高 |
| 画像比較 | 2枚の画像の差分を分析 | 中〜高 |
| チャート・グラフ解析 | グラフのデータを読み取り分析 | 中 |
| レイアウト理解 | 文書の構造を理解 | 中〜高 |
注意すべき限界
1. ハルシネーション: 画像に存在しない情報を「見た」と報告する
2. 空間推論の弱さ: 正確な位置関係や距離の把握が苦手
3. 小さい文字の読み取り: 低解像度の画像では精度が落ちる
4. 数値の正確性: 数字の読み取りで誤りが生じることがある
5. 複数画像の比較: 細かい差分の検出は不得意
プロンプト設計のコツ
効果的なプロンプトパターン
【具体的な指示】
悪い例: "この画像を見てください"
良い例: "この商品画像から、商品名、色、サイズ、素材を抽出してJSON形式で出力してください"
【段階的な分析指示】
"この画像を以下の手順で分析してください:
1. 画像全体の概要を説明する
2. 商品の特徴を列挙する
3. 品質上の問題点があれば指摘する
4. 最終的な評価をA/B/Cで判定する"
【出力形式の指定】
"以下のJSON形式で出力してください:
{
\"product_name\": \"商品名\",
\"category\": \"カテゴリ\",
\"defects\": [\"問題点のリスト\"],
\"quality_score\": \"A/B/C\"
}"
画像解像度の設定
| 設定 | トークン消費 | 用途 |
|---|
| low | 少ない | 全体的な画像理解、分類 |
| high | 多い | OCR、詳細な分析、品質検査 |
| auto | 自動判断 | 汎用(推奨) |
モデル選定ガイド
| 要件 | 推奨モデル | 理由 |
|---|
| 汎用的な画像理解 | GPT-4o | バランスが良い |
| 詳細な文書分析 | Claude Vision | 長文コンテキストに強い |
| 大量バッチ処理 | Gemini | コストパフォーマンスが良い |
| オンプレ要件 | LLaVA / InternVL | ローカル実行可能 |
| リアルタイム処理 | GPT-4o mini | 低レイテンシ |
まとめ
| 項目 | 内容 |
|---|
| VLMの構造 | Visual Encoder + Projection Layer + LLM |
| 主要モデル | GPT-4V/4o, Claude Vision, Gemini |
| 得意分野 | キャプション、VQA、OCR、レイアウト理解 |
| 注意点 | ハルシネーション、空間推論の弱さ、数値精度 |
| プロンプト設計 | 具体的指示、段階的分析、出力形式指定 |
チェックリスト
推定所要時間: 30分