LLM 設定
Doggy はグラフィカルな LLM 設定管理システムを提供し、マルチベンダー、マルチモデル、マルチロールの柔軟な設定とランタイムでの動的切り替えをサポートし、AI 機能に統一されたモデル基盤を提供します。
概要
LLM 設定システムは src/Service/Platform/Llm/ にあり、Symfony AI Bundle の Platform 設計理念を参考にしています:
- マルチベンダー対応: OpenAI、Azure、Anthropic、Ollama、カスタム OpenAI 互換ゲートウェイ
- グラフィカル管理: YAML ではなく、管理画面で動的に管理
- ロール分離: 設定と用途を分離し、ロールがモデルをバインド
- 鍵の暗号化: API Key を暗号化して保存し、フロントエンドには触れさせない
データモデル
LlmProvider(ベンダー設定)
| フィールド | タイプ | 説明 |
|---|---|---|
| name | string | 表示名("GPT-4o" など) |
| provider | string | ベンダー識別子: openai / anthropic / azure / ollama / custom |
| model | string | モデル名: gpt-4o / claude-3-5-sonnet / ... |
| apiKey | encrypted | API Key(暗号化保存) |
| apiEndpoint | string | エンドポイントURL(任意) |
| options | JSON | 追加パラメータ: temperature, max_tokens, top_p など |
| isEnabled | boolean | 有効かどうか |
| sortOrder | int | ソート順 |
LlmRole(ロール/用途)
| フィールド | タイプ | 説明 |
|---|---|---|
| code | string | ロールコード: view_editor / entity_generation / workflow_analysis / query_assistant / chat / coding |
| label | string | 表示名 |
| providerId | UUID | バインドするモデル設定 |
| systemPrompt | text | このロールのシステムプロンプト |
| options | JSON | ロールレベルのパラメータオーバーライド |
| isEnabled | boolean | 有効かどうか |
ロール用途計画
| ロール code | 用途 | 推奨モデル |
|---|---|---|
| view_editor | ビューデザイナーの AI アシスタント | gpt-4o / claude-3.5-sonnet |
| entity_generation | AI アシストエンティティ生成 | gpt-4o-mini |
| workflow_analysis | ワークフロー分析と提案 | gpt-4o |
| query_assistant | 自然言語 → データクエリ | gpt-4o-mini |
| chat | 汎用 AI 対話アシスタント | gpt-4o-mini |
| coding | コード生成(Twig/JS/PHP) | gpt-4o / claude-3.5-sonnet |
呼び出しチェーン
LlmRouter::chatByRole(roleCode, messages, opts)
├─ 查询 LlmRole(code) → 获取绑定的 LlmProvider
├─ LlmGatewayFactory::create(provider) → 实例化适配器
├─ 解密 API Key(LlmEncryptor)
└─ 调用 LLM API(支持工具调用、流式响应)LlmGatewayFactory
LlmProvider.provider フィールドに基づいてアダプターを自動ルーティングします:
| provider | アダプター | 説明 |
|---|---|---|
| openai | OpenAiGateway | OpenAI 互換インターフェース |
| anthropic | AnthropicGateway | Anthropic Claude API |
| azure | AzureGateway | Azure OpenAI |
| ollama | OllamaGateway | ローカル Ollama |
| custom | CustomGateway | カスタム OpenAI 互換ゲートウェイ |
フェイルオーバー
LlmRouter は chatByRoleWithFallback をサポートし、メインのベンダーが失敗した場合にバックアップモデルへ自動的にダウングレードします。
管理画面
入口: システム設定 → LLM 設定(/admin/platform/llm-config)
一覧ページ
- ベンダーをカード形式で表示し、1 つのベンダーが複数のモデルバリアントに対応可能
- そのモデルをバインドしているロール/用途を直接表示
- スイッチで有効/無効を切り替え
- ドラッグ&ドロップで並び替え
編集フォーム
- 名前、ベンダー、モデル、API Key(暗号化保存)、エンドポイントURL
- ロール管理(LlmRoleType): ロールコード、システムプロンプト、モデルバインド
鍵の暗号化
LlmEncryptor はプラットフォームの暗号化キーで API Key を暗号化/復号します。キーはサーバー側のみに保存され、フロントエンドは元の Key に触れません:
php
// 存储时
$encrypted = $llmEncryptor->encrypt($apiKey);
// 调用时
$apiKey = $llmEncryptor->decrypt($provider->getApiKey());AI アシスタントとの統合
AI アシスタント(AI アシスタント を参照)は LlmRole/LlmProvider 体系を再利用します:
前端 → POST /api/admin/ai/chat
→ LlmRouter.chatByRole(roleCode, messages)
→ 查询 LlmRole → LlmGatewayFactory → LLM API- API Key はサーバー側のみに保存(データベースで暗号化)
- モデル切り替えは管理画面で完了し、コード変更不要
- マルチベンダーは LlmGatewayFactory が自動ルーティング
関連ファイル
| ファイル | 責務 |
|---|---|
src/Service/Platform/Llm/LlmGatewayInterface.php | ゲートウェイインターフェース |
src/Service/Platform/Llm/LlmGatewayFactory.php | アダプターファクトリ |
src/Service/Platform/Llm/LlmRouter.php | ロールルーティング + フェイルオーバー |
src/Service/Platform/Llm/ModelRegistry.php | モデルレジストリ |
src/Service/Platform/LlmEncryptor.php | API Key の暗号化/復号 |
src/Entity/Platform/LlmProvider.php | ベンダー設定エンティティ |
src/Entity/Platform/LlmRole.php | ロール設定エンティティ |
src/Controller/Admin/Platform/LlmConfigController.php | 管理画面コントローラー |