Spaces:
Sleeping
Sleeping
| # マルチモデル対応設計案 | |
| ## 概要 | |
| 現在の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. **統一性**: すべてのモデルが同じインターフェースを使用 | |