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. **統一性**: すべてのモデルが同じインターフェースを使用