Spaces:
Sleeping
A newer version of the Gradio SDK is available: 6.10.0
マルチモデル対応設計案
概要
現在の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パラメータを活用 - 確率の正規化処理を統一
- 各APIの
課題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 モデル選択の基準
日本語対応: 日本語処理が必要な場合
- 推奨:
Qwen/Qwen2.5-3B-Instruct,meta-llama/Llama-3.2-3B-Instruct
- 推奨:
軽量性: リソース制約がある場合
- 推奨:
TinyLlama/TinyLlama-1.1B-Chat-v1.0,google/gemma-2b-it
- 推奨:
高性能: 品質を重視する場合
- 推奨:
mistralai/Mistral-7B-Instruct-v0.2,Qwen/Qwen2.5-3B-Instruct
- 推奨:
日本語特化: 日本語タスクに特化
- 推奨:
elyza/ELYZA-japanese-Llama-2-7b-instruct,rinna/weblab-10b-instruction-sft
- 推奨:
11.2 モデル切り替え手順
- Hugging Face Spacesの環境変数で
HF_MODEL_REPOを設定 - アプリを再起動
- モデルが自動的にロードされる(初回はダウンロード時間がかかる場合あり)
11.3 注意事項
- ストレージ制約: Hugging Face Spacesのストレージ制限に注意
- モデルサイズ: 大きなモデル(7B以上)はメモリとロード時間がかかる
- トークン確率: すべてのTransformersモデルで完全なトークン確率が取得可能
- APIコスト: Transformersモデルは無料(ローカルロード)、APIモデルは有料
まとめ
この設計により、以下のメリットが得られます:
- 拡張性: 新しいモデルを簡単に追加可能
- 互換性: 既存のコードを最小限の変更で維持
- 柔軟性: ユーザーが好みのモデルを選択可能
- 統一性: すべてのモデルが同じインターフェースを使用