LLMプロバイダーアーキテクチャ設計
このドキュメントでは、LLMプロバイダーの実装アーキテクチャについて説明します。システムは抽象クラスを使用した継承ベースの設計と、ファクトリーパターンを組み合わせて実装されています。
クラス図
classDiagram class ILLMProvider { <<abstract>> #characterLimit: CharacterLimitOptions +sendMessage(message: string, faqData?: Array)*$ Promise~string~ +verifyResponse(response: string, userMessage: string, faqData: Array)*$ Promise~boolean~ +generateEmbedding(text: string)*$ Promise~number[]~ +getConfig()*$ object +setUserId(userId: string)*$ void #summarizeResponse(response: string)*$ Promise~string~ #processResponse(response: string)$ Promise~string~ #checkResponseLength(response: string)$ object #truncateText(text: string)$ string } class OpenAIProvider { -model: string -temperature: number -maxTokens: number -client: OpenAI -promptHistoryService?: IPromptHistoryService -currentUserId?: string +constructor(config: OpenAIConfig) +sendMessage()$ Promise~string~ +verifyResponse()$ Promise~boolean~ +generateEmbedding()$ Promise~number[]~ +getConfig()$ object +setUserId(userId: string)$ void #summarizeResponse()$ Promise~string~ -isO3MiniModel()$ boolean -getTokenLimitParamName()$ string -buildRequestParameters()$ object -preprocessUserMessage()$ string -logLLMInteraction()$ void -handleOpenAIError()$ Error } class GeminiProvider { -model: string -temperature: number -maxTokens: number -client: GenerativeModel -promptHistoryService?: IPromptHistoryService -currentUserId?: string +constructor(config: GeminiConfig) +sendMessage()$ Promise~string~ +verifyResponse()$ Promise~boolean~ +generateEmbedding()$ Promise~number[]~ +getConfig()$ object +setUserId(userId: string)$ void #summarizeResponse()$ Promise~string~ -preprocessUserMessage()$ string -logLLMInteraction()$ void -handleGeminiError()$ Error } class LLMFactory { -instance: LLMFactory -config: LLMConfig -activeProvider: string -fallbackProvider: string -providers: Map~string, ILLMProvider~ -promptHistoryService: PromptHistoryService -initialized: boolean -constructor() +getInstance()$ LLMFactory +initialize()$ Promise~void~ +createProvider(providerName?: string)$ ILLMProvider +createFallbackProvider()$ ILLMProvider +setActiveProvider(provider: string)$ void +setFallbackProvider(provider: string)$ void +getActiveProvider()$ string +getFallbackProvider()$ string +getAvailableProviders()$ string[] +clearCache()$ void } ILLMProvider <|-- OpenAIProvider ILLMProvider <|-- GeminiProvider LLMFactory ..> ILLMProvider LLMFactory ..> OpenAIProvider LLMFactory ..> GeminiProvider
シーケンス図(ファクトリーパターン)
sequenceDiagram participant Client participant LLMFactory participant OpenAIProvider participant GeminiProvider Client->>LLMFactory: getInstance() activate LLMFactory alt インスタンスが未作成の場合 LLMFactory->>LLMFactory: new LLMFactory() end LLMFactory-->>Client: factoryインスタンス deactivate LLMFactory Client->>LLMFactory: initialize() activate LLMFactory LLMFactory->>LLMFactory: 初期化処理 LLMFactory-->>Client: deactivate LLMFactory Client->>LLMFactory: createProvider("openai") activate LLMFactory alt キャッシュにインスタンスが存在する場合 LLMFactory-->>Client: キャッシュされたインスタンス else キャッシュにインスタンスが存在しない場合 LLMFactory->>LLMFactory: config.getProviderConfig() alt provider == "openai" LLMFactory->>OpenAIProvider: new OpenAIProvider(config) OpenAIProvider-->>LLMFactory: providerインスタンス else provider == "gemini" LLMFactory->>GeminiProvider: new GeminiProvider(config) GeminiProvider-->>LLMFactory: providerインスタンス end LLMFactory->>LLMFactory: providers.set(provider, instance) LLMFactory-->>Client: 新しいproviderインスタンス end deactivate LLMFactory
実装の詳細
ILLMProvider(抽象クラス)
LLMプロバイダーの基底クラスとして機能し、以下の主要な機能を定義します:
- メッセージの送受信(sendMessage)
- 応答の検証(verifyResponse)
- テキストのエンベディング生成(generateEmbedding)
- 設定の取得(getConfig)
- ユーザーIDの設定(setUserId)
- レスポンスの要約(summarizeResponse)
また、以下のユーティリティメソッドを提供します:
- レスポンスの処理(processResponse)
- レスポンス長のチェック(checkResponseLength)
- テキストの切り詰め(truncateText)
具象クラス(OpenAIProvider, GeminiProvider)
ILLMProviderを継承し、それぞれのAPIに特化した実装を提供します:
OpenAIProvider
- OpenAI APIを使用したLLM機能の実装
- o3-miniモデル対応の特殊処理
- OpenAI特有のエラーハンドリング
GeminiProvider
- Google Gemini APIを使用したLLM機能の実装
- Gemini特有のリクエスト形式対応
- Gemini特有のエラーハンドリング
LLMFactory(ファクトリークラス)
シングルトンパターンとファクトリーパターンを組み合わせた実装で、以下の機能を提供します:
- プロバイダーインスタンスの生成と管理
- アクティブプロバイダーとフォールバックプロバイダーの切り替え
- プロバイダーインスタンスのキャッシュ管理
- 設定の一元管理
使用例
// ファクトリーインスタンスの取得
const factory = LLMFactory.getInstance();
// ファクトリーの初期化
await factory.initialize();
// OpenAIプロバイダーの取得
const openaiProvider = factory.createProvider("openai");
// Geminiプロバイダーの取得
const geminiProvider = factory.createProvider("gemini");
// メッセージの送信
const response = await openaiProvider.sendMessage("こんにちは");
この設計により、以下のメリットが得られます:
- 新しいLLMプロバイダーの追加が容易
- プロバイダー間の切り替えが簡単
- 共通機能の重複を防止
- プロバイダー固有の実装を隠蔽
- テスト容易性の向上