LLMView_multi_model / MULTI_MODEL_DESIGN.md
WatNeru's picture
bugfix
2bdf0a5

A newer version of the Gradio SDK is available: 6.10.0

Upgrade

マルチモデル対応設計案

概要

現在のLLMViewはLlama 3.2 3B(transformers)のみ対応していますが、他のTransformersモデル(Qwen、Mistral、Gemma等)にも対応できるように拡張します。

重要: Hugging Face Spacesでの使用を前提とする場合、APIを使う必要はありません。 Transformersライブラリでローカルにモデルをロードする方法(TransformersAI)を使用してください。 これにより、完全なトークン確率情報が取得でき、コストもかかりません。

外部API(OpenAI、Anthropic、Google)のサポートは、ローカル環境やテスト目的でのみ使用することを想定しています。

アーキテクチャ設計

1. アダプターパターンの導入

AI (基底クラス/インターフェース)
├── TransformersAI (現在の実装 - Llama等のローカルモデル)
├── OpenAIAI (ChatGPT API)
├── AnthropicAI (Claude API)
├── GoogleAI (Gemini API)
└── HuggingFaceInferenceAI (Hugging Face Inference API)

2. 統一インターフェース

すべてのモデルアダプターが実装すべきメソッド:

class BaseAI:
    def get_token_probabilities(self, text: str, k: int = 5) -> List[Tuple[str, float]]:
        """
        テキストから次のトークン候補と確率を取得
        
        Returns:
            List[Tuple[str, float]]: (トークン, 確率)のリスト
        """
        raise NotImplementedError
    
    def build_chat_prompt(self, user_content: str, system_content: str = "") -> str:
        """
        モデル固有のチャットプロンプト形式に変換
        """
        raise NotImplementedError

3. モデルタイプの識別

環境変数または設定ファイルでモデルタイプを指定:

MODEL_TYPE = os.getenv("MODEL_TYPE", "transformers")  # transformers, openai, anthropic, google, hf_inference
MODEL_PATH = os.getenv("HF_MODEL_REPO", "meta-llama/Llama-3.2-3B-Instruct")  # モデル識別子(Hugging FaceリポジトリID)

Hugging Face Spacesでの推奨設定:

# 環境変数例(Hugging Face Spaces用)
MODEL_TYPE=transformers
HF_MODEL_REPO=Qwen/Qwen2.5-3B-Instruct  # または他のモデル
HF_TOKEN=your_hf_token  # プライベートモデルの場合

4. 各モデルの特徴と実装方針

4.1 TransformersAI (現在の実装)

  • 特徴: ローカルでモデルをロード、logitsから直接確率を取得可能
  • 利点: 完全なトークン確率情報が利用可能
  • 実装: 現在のAIクラスをTransformersAIにリネーム

4.2 OpenAIAI (ChatGPT)

  • 特徴: API経由、logprobsパラメータでトークン確率を取得可能
  • API: openai.ChatCompletion.create()logprobs=True
  • 制約:
    • トークン確率はlogprobsで取得可能(GPT-4以降)
    • リクエストごとにAPIコールが必要
    • レート制限とコストが発生
  • 実装方針:
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[...],
        logprobs=True,
        top_logprobs=5
    )
    # logprobsから確率を計算
    

4.3 AnthropicAI (Claude)

  • 特徴: API経由、logprobsパラメータでトークン確率を取得可能(Claude 3.5以降)
  • API: anthropic.Anthropic().messages.create()logprobs=True
  • 制約:
    • トークン確率はlogprobsで取得可能
    • リクエストごとにAPIコールが必要
  • 実装方針:
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        messages=[...],
        logprobs=True,
        top_logprobs=5
    )
    

4.4 GoogleAI (Gemini)

  • 特徴: API経由、logprobsパラメータでトークン確率を取得可能
  • API: google.generativeai.GenerativeModel.generate_content()logprobs=True
  • 制約:
    • トークン確率はlogprobsで取得可能
    • リクエストごとにAPIコールが必要
  • 実装方針:
    response = model.generate_content(
        prompt,
        generation_config={"logprobs": True, "top_k": 5}
    )
    

4.5 HuggingFaceInferenceAI

  • 特徴: Hugging Face Inference API経由、一部のモデルでlogits取得可能
  • API: huggingface_hub.InferenceClient.text_generation()details=True
  • 制約:
    • すべてのモデルでlogitsが利用可能とは限らない
    • リクエストごとにAPIコールが必要
    • 無料プランにはレート制限あり

4.6 Hugging Face Spacesで利用可能なモデル(Transformers経由)

Hugging Face Spacesでは、以下のモデルをTransformersライブラリで直接利用可能:

4.6.1 日本語対応モデル(推奨)
モデル リポジトリID サイズ 特徴 トークン確率取得 HF_TOKEN必要
Llama 3.2 3B Instruct meta-llama/Llama-3.2-3B-Instruct 3B 多言語対応、現在使用中 ✅ 完全対応 ⚠️ 必要(gatedモデル)
Qwen 2.5 Qwen/Qwen2.5-3B-Instruct 3B 日本語に強い、高性能 ✅ 完全対応 ❌ 不要
Mistral 7B Instruct mistralai/Mistral-7B-Instruct-v0.2 7B 高性能、多言語対応 ✅ 完全対応 ❌ 不要
Gemma 2B/7B google/gemma-2b-it, google/gemma-7b-it 2B/7B Google製、軽量 ✅ 完全対応 ❌ 不要
Phi-3 microsoft/Phi-3-mini-4k-instruct 3.8B 軽量、高性能 ✅ 完全対応 ❌ 不要
TinyLlama TinyLlama/TinyLlama-1.1B-Chat-v1.0 1.1B 超軽量 ✅ 完全対応 ❌ 不要
4.6.2 日本語特化モデル
モデル リポジトリID サイズ 特徴 トークン確率取得 HF_TOKEN必要
ELYZA-japanese-Llama-2 elyza/ELYZA-japanese-Llama-2-7b-instruct 7B 日本語特化 ✅ 完全対応 ⚠️ 必要(Llama-2ベースのため)
japanese-stablelm stabilityai/japanese-stablelm-base-gamma-7b 7B 日本語特化 ✅ 完全対応 ❌ 不要
weblab-10b rinna/weblab-10b-instruction-sft 10B 日本語特化、大規模 ✅ 完全対応 ❌ 不要
4.6.3 その他の主要モデル
モデル リポジトリID サイズ 特徴 トークン確率取得 HF_TOKEN必要
Falcon tiiuae/falcon-7b-instruct 7B オープンソース ✅ 完全対応 ❌ 不要
MPT mosaicml/mpt-7b-instruct 7B 商用利用可能 ✅ 完全対応 ❌ 不要
StarCoder bigcode/starcoder2-7b 7B コード生成特化 ✅ 完全対応 ⚠️ 必要(gatedモデルの可能性あり)
4.6.4 Hugging Face Inference APIで利用可能なモデル

注意: Inference APIでは、すべてのモデルでトークン確率(logits)が取得できるわけではありません。 以下のモデルはInference API経由でも利用可能ですが、トークン確率の取得はモデルによって異なります:

  • 無料プラン: 制限あり、一部モデルのみ
  • 有料プラン: より多くのモデルにアクセス可能

推奨アプローチ:

  • Hugging Face Spacesでは、Transformersライブラリで直接モデルをロードする方法を推奨
  • これにより、完全なトークン確率情報が取得可能
  • Inference APIは、モデルをローカルにロードできない場合の代替手段

5. プロンプトフォーマットの統一

各モデルに適したプロンプト形式に変換するbuild_chat_promptメソッドを実装:

# Llama 3.2形式
"<|start_header_id|>system<|end_header_id|>\n{system}\n<|eot_id|>..."

# OpenAI形式
[
    {"role": "system", "content": system},
    {"role": "user", "content": user}
]

# Claude形式
[
    {"role": "user", "content": f"{system}\n\n{user}"}
]

# Gemini形式
f"{system}\n\n{user}"

6. 設定管理の拡張

config.pyまたは環境変数で管理:

# Hugging Face Spaces用(推奨)
MODEL_TYPE=transformers
HF_MODEL_REPO=Qwen/Qwen2.5-3B-Instruct  # または meta-llama/Llama-3.2-3B-Instruct
HF_TOKEN=your_hf_token  # プライベートモデルの場合のみ

# OpenAI API用
MODEL_TYPE=openai
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4

# Anthropic API用
MODEL_TYPE=anthropic
ANTHROPIC_API_KEY=sk-ant-...
ANTHROPIC_MODEL=claude-3-5-sonnet-20241022

# Google API用
MODEL_TYPE=google
GOOGLE_API_KEY=...
GOOGLE_MODEL=gemini-pro

# Hugging Face Inference API用(オプション)
MODEL_TYPE=hf_inference
HF_INFERENCE_API_KEY=hf_...
HF_INFERENCE_MODEL=meta-llama/Llama-3.2-3B-Instruct

Hugging Face Spacesでの推奨設定:

  • MODEL_TYPE=transformersを使用(ローカルでモデルをロード)
  • HF_MODEL_REPOでモデルを指定(デフォルト: meta-llama/Llama-3.2-3B-Instruct
  • 他のモデルに切り替える場合は、HF_MODEL_REPOを変更するだけ

7. 実装の優先順位

Phase 1: 基盤整備(最優先)

  • BaseAIインターフェースの定義
  • 現在のAIクラスをTransformersAIにリファクタリング
  • モデルタイプの識別とファクトリーパターンの実装
  • Hugging Face Spacesでの複数モデル対応(Llama 3.2以外のモデル選択可能に)

Phase 2: Hugging Faceモデルの拡張対応

  • Qwen 2.5対応: 日本語に強い、高性能
  • Mistral 7B対応: 多言語対応、高性能
  • Gemma対応: Google製、軽量
  • 各モデルのプロンプトフォーマット対応

Phase 3: OpenAI対応

  • OpenAIAIクラスの実装
  • logprobsパラメータの活用
  • プロンプトフォーマット変換

Phase 4: Anthropic対応

  • AnthropicAIクラスの実装
  • Claude固有のプロンプト形式対応

Phase 5: Google/Gemini対応

  • GoogleAIクラスの実装

Phase 6: その他

  • Hugging Face Inference API対応(オプション)
  • カスタムモデルエンドポイント対応

8. 課題と解決策

課題1: APIコストとレート制限

  • 解決策:
    • キャッシュ機能の実装
    • リクエスト間隔の制御
    • ローカルモデルとの併用推奨

課題2: トークン確率の取得方法の違い

  • 解決策:
    • 各APIのlogprobsパラメータを活用
    • 確率の正規化処理を統一

課題3: プロンプト形式の違い

  • 解決策:
    • 各モデル用のbuild_chat_promptメソッドを実装
    • 統一された入力インターフェースを提供

課題4: エラーハンドリング

  • 解決策:
    • 各APIのエラーレスポンスを統一形式で処理
    • フォールバック機能の実装

9. ファイル構成

package/
├── ai/
│   ├── __init__.py          # ファクトリー関数
│   ├── base.py              # BaseAIインターフェース
│   ├── transformers_ai.py   # TransformersAI (現在のAIクラス)
│   ├── openai_ai.py         # OpenAIAI
│   ├── anthropic_ai.py      # AnthropicAI
│   ├── google_ai.py         # GoogleAI
│   └── hf_inference_ai.py   # HuggingFaceInferenceAI
├── config.py                # 設定管理(拡張)
└── ...

10. 使用例

10.1 Hugging Face Spacesでの使用(推奨)

# 環境変数でモデルを指定
# HF_MODEL_REPO=Qwen/Qwen2.5-3B-Instruct python app.py
# HF_MODEL_REPO=mistralai/Mistral-7B-Instruct-v0.2 python app.py

from package.ai import get_ai_model

# ファクトリー関数で適切なモデルを取得
ai_model = get_ai_model()  # MODEL_TYPE=transformers(デフォルト)

# 統一されたインターフェースで使用
tokens = ai_model.get_token_probabilities("こんにちは", k=5)

10.2 OpenAI APIでの使用

# MODEL_TYPE=openai OPENAI_API_KEY=sk-... python app.py

from package.ai import get_ai_model

ai_model = get_ai_model()  # MODEL_TYPE=openai
tokens = ai_model.get_token_probabilities("こんにちは", k=5)

10.3 モデルの動的切り替え

# アプリ起動時に環境変数で指定
# または、設定ファイルで管理

import os
os.environ["HF_MODEL_REPO"] = "Qwen/Qwen2.5-3B-Instruct"

from package.ai import get_ai_model
ai_model = get_ai_model()

11. Hugging Face Spacesでのモデル選択ガイド

11.1 モデル選択の基準

  1. 日本語対応: 日本語処理が必要な場合

    • 推奨: Qwen/Qwen2.5-3B-Instruct, meta-llama/Llama-3.2-3B-Instruct
  2. 軽量性: リソース制約がある場合

    • 推奨: TinyLlama/TinyLlama-1.1B-Chat-v1.0, google/gemma-2b-it
  3. 高性能: 品質を重視する場合

    • 推奨: mistralai/Mistral-7B-Instruct-v0.2, Qwen/Qwen2.5-3B-Instruct
  4. 日本語特化: 日本語タスクに特化

    • 推奨: elyza/ELYZA-japanese-Llama-2-7b-instruct, rinna/weblab-10b-instruction-sft

11.2 モデル切り替え手順

  1. Hugging Face Spacesの環境変数でHF_MODEL_REPOを設定
  2. アプリを再起動
  3. モデルが自動的にロードされる(初回はダウンロード時間がかかる場合あり)

11.3 注意事項

  • ストレージ制約: Hugging Face Spacesのストレージ制限に注意
  • モデルサイズ: 大きなモデル(7B以上)はメモリとロード時間がかかる
  • トークン確率: すべてのTransformersモデルで完全なトークン確率が取得可能
  • APIコスト: Transformersモデルは無料(ローカルロード)、APIモデルは有料

まとめ

この設計により、以下のメリットが得られます:

  1. 拡張性: 新しいモデルを簡単に追加可能
  2. 互換性: 既存のコードを最小限の変更で維持
  3. 柔軟性: ユーザーが好みのモデルを選択可能
  4. 統一性: すべてのモデルが同じインターフェースを使用