概要
ShannonはLLMレスポンス用のマルチレイヤーキャッシングシステムを実装しており、繰り返しまたは類似のクエリに対して大幅なコスト削減とレイテンシ削減を提供します。キャッシングシステムはインメモリとRedisの両方のバックエンドをサポートしています。アーキテクチャ
キャッシュバックエンド
インメモリキャッシュ(デフォルト)
デフォルトのキャッシングバックエンドは自動エビクション付きのLRU(Least Recently Used)ディクショナリを使用します。 特徴:- 外部依存関係なし
- 高速ルックアップ(平均O(1))
- 容量到達時に自動エビクション
- ヒット率トラッキング
- インスタンス間で共有されない
- サービス再起動時に消失
Redisキャッシュ
本番環境のデプロイメントでは、Redisが複数インスタンス間で分散キャッシングを提供します。 特徴:- すべてのLLMサービスインスタンス間で分散
- 永続ストレージ
- 自動TTL期限切れ
- Redis Sentinel/Clusterによる高可用性
設定
グローバル設定
config/models.yamlでキャッシングを設定:
| パラメータ | デフォルト | 説明 |
|---|---|---|
enabled | true | キャッシングマスタースイッチ |
ttl_seconds | 3600 | デフォルトのキャッシュエントリ有効期間 |
max_cache_size_mb | 2048 | 最大キャッシュサイズ(MB) |
similarity_threshold | 0.95 | セマンティックマッチング閾値 |
リクエストごとのオーバーライド
個別リクエストでキャッシュ動作をオーバーライド:キャッシュキー生成
キャッシュキーはリクエストパラメータから決定論的に生成されます:含まれるパラメータ
- メッセージコンテンツとロール
- モデルティアと特定モデル
- TemperatureとMax tokens
- 関数定義
- ランダムシード
除外されるパラメータ
- ストリーミングフラグ(ストリーミングはキャッシュされない)
- セッション/タスクID(キャッシュはリクエストベース)
キャッシングルール
レスポンスがキャッシュされる条件
以下の場合にレスポンスがキャッシュされます:- グローバルでキャッシングが有効
- リクエストが非ストリーミング
- レスポンスに非空コンテンツまたはfunction_callがある
- 完了理由が”length”(切り詰め)や”content_filter”でない
- JSONモードの場合:コンテンツが有効なJSONオブジェクト
レスポンスがキャッシュされない条件
キャッシュ検証
キャッシュされたレスポンスを返す前に、Shannonは以下を検証します:- 完了理由チェック:切り詰めまたはフィルタされたレスポンスをスキップ
- JSONモード検証:JSONモードで有効なJSONオブジェクトを確認
- コンテンツ存在確認:非空コンテンツまたはfunction_callを要求
環境変数
| 変数 | デフォルト | 説明 |
|---|---|---|
REDIS_URL | - | 完全なRedis接続URL |
LLM_REDIS_URL | - | 代替Redis URL |
REDIS_HOST | redis | Redisホスト名 |
REDIS_PORT | 6379 | Redisポート |
REDIS_PASSWORD | - | オプションのRedisパスワード |
パフォーマンス影響
レイテンシ削減
| シナリオ | レイテンシ |
|---|---|
| キャッシュヒット | 1-5ms |
| キャッシュミス(小型モデル) | 500-2000ms |
| キャッシュミス(大型モデル) | 2000-10000ms |
コスト削減
キャッシュヒットはLLMプロバイダーコストを完全に排除します:- 典型的なヒット率:多様なワークロードで20-40%
- 高ヒット率:繰り返しクエリで60-80%
- 潜在的なコスト削減:ワークロードに応じて20-80%
モニタリング
キャッシュメトリクス
LLMサービスはキャッシュメトリクスを公開します:APIレスポンスフィールド
ベストプラクティス
キャッシュヒットを最大化
- プロンプトを正規化:一貫したフォーマットでヒット率向上
- 決定論的シードを使用:再現可能な出力のために
seedを設定 - 温度を標準化:一貫した温度値を使用
- システムプロンプトを再利用:システムメッセージを一貫させる
キャッシュキー戦略
Redis設定
本番環境向け:トラブルシューティング
低いヒット率
- プロンプトの正規化を確認
- 温度の一貫性を検証
- キャッシュTTL設定を確認
- キャッシュエビクション率を監視
キャッシュが機能しない
- 設定で
prompt_cache.enabled: trueを確認 - Redis接続を確認(Redis使用時)
- リクエストが非ストリーミングであることを確認
- レスポンスがフィルタされていないことを確認
メモリ問題
max_cache_size_mbを削減- 大規模デプロイメントではRedisを使用
- テナントごとにキャッシュパーティションを実装