LLMView_multi_model / MULTI_MODEL_DESIGN.md
WatNeru's picture
bugfix
2bdf0a5
# マルチモデル対応設計案
## 概要
現在の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. 統一インターフェース
すべてのモデルアダプターが実装すべきメソッド:
```python
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. モデルタイプの識別
環境変数または設定ファイルでモデルタイプを指定:
```python
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での推奨設定**:
```python
# 環境変数例(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コールが必要
- レート制限とコストが発生
- **実装方針**:
```python
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コールが必要
- **実装方針**:
```python
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コールが必要
- **実装方針**:
```python
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`メソッドを実装:
```python
# 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`または環境変数で管理:
```python
# 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での使用(推奨)
```python
# 環境変数でモデルを指定
# 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での使用
```python
# 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 モデルの動的切り替え
```python
# アプリ起動時に環境変数で指定
# または、設定ファイルで管理
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. **統一性**: すべてのモデルが同じインターフェースを使用