Spaces:
Sleeping
Sleeping
File size: 14,329 Bytes
0447f30 2bdf0a5 0447f30 2bdf0a5 0447f30 2bdf0a5 0447f30 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 | # マルチモデル対応設計案
## 概要
現在の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. **統一性**: すべてのモデルが同じインターフェースを使用
|