Skip to content

DCP ベストプラクティス

学習目標

  • Prompt Caching と Token 節約のトレードオフを理解する
  • 保護戦略(ターン保護、保護ツール、ファイルモード)を選択する
  • コマンドを使用して Token 使用を手動で最適化する
  • プロジェクトの要件に合わせて DCP 設定をカスタマイズする

Prompt Caching のトレードオフ

キャッシュとトリミングのトレードオフを理解する

DCP がツール出力をトリミングするとメッセージ内容が変更され、これにより正確なプレフィックス一致に基づく Prompt Caching がその時点から前方で無効になります。

テストデータの比較

シナリオキャッシュヒット率Token 節約総合利益
DCP なし~85%0%ベースライン
DCP 有効化~65%20-40%✅ 正の利益

いつキャッシュ損失を無視すべきか

DCP の使用が推奨されるシナリオ

  • 長い会話(20 回転を超える):コンテキストの膨張が顕著で、Token 節約がキャッシュ損失を上回る
  • リクエストごとの課金サービス:GitHub Copilot、Google Antigravity などキャッシュ損失に悪影響がない
  • 頻繁なツール呼び出し:頻繁なファイル読み取り、検索実行などのシナリオ
  • コードリファクタリングタスク:同じファイルを繰り返し読み取るシナリオが頻繁

DCP を無効にする必要がある可能性があるシナリオ

  • ⚠️ 短い会話(< 10 回転):トリミングの利益が限定的で、キャッシュ損失がより顕著になる可能性がある
  • ⚠️ キャッシュに敏感なタスク:キャッシュヒット率を最大化する必要があるシナリオ(バッチ処理タスクなど)

柔軟な設定

プロジェクトの要件に応じて DCP 設定を動的に調整でき、プロジェクトレベルの設定で特定の戦略を無効にすることもできます。


設定優先度のベストプラクティス

マルチレベル設定の正しい使用

DCP 設定は以下の優先度でマージされます:

デフォルト値 < グローバル設定 < カスタム設定ディレクトリ < プロジェクト設定

設定ディレクトリの説明

「カスタム設定ディレクトリ」は $OPENCODE_CONFIG_DIR 環境変数を設定して指定するディレクトリです。このディレクトリには dcp.jsonc または dcp.json ファイルを配置する必要があります。

推奨される設定戦略

シナリオ推奨設定場所設定の重点
個人開発環境グローバル設定自動戦略を有効化、デバッグログを無効化
チーム協力プロジェクトプロジェクト設定プロジェクト固有の保護ファイル、戦略スイッチ
CI/CD 環境カスタム設定ディレクトリ通知を無効化、デバッグログを有効化
一時的なデバッグプロジェクト設定debug を有効化、詳細通知モード

例:プロジェクトレベル設定のオーバーライド

jsonc
// ~/.config/opencode/dcp.jsonc(グローバル設定)
{
    "enabled": true,
    "strategies": {
        "deduplication": {
            "enabled": true
        }
    }
}
jsonc
// .opencode/dcp.jsonc(プロジェクト設定)
{
    "strategies": {
        // プロジェクトレベルオーバーライド:重複排除を無効化(プロジェクトが履歴コンテキストを保持する必要がある場合など)
        "deduplication": {
            "enabled": false
        }
    }
}

設定変更後の再起動

設定変更後は OpenCode を再起動する必要があります。


保護戦略の選択

ターン保護の使用シナリオ

ターン保護(Turn Protection)はツールが指定されたターン数以内でトリミングされるのを防ぎ、AI に最近のコンテンツを参照する十分な時間を与えます。

推奨設定

シナリオ推奨値理由
複雑な問題解決4-6 ターンAI がツール出力を複数回反復分析する必要がある
コードリファクタリング2-3 ターンコンテキストの切り替えが速く、保護期間が長すぎると効果に影響
迅速なプロトタイプ開発2-4 ターン保護と Token 節約のバランス
デフォルト設定4 ターンテスト済みのバランスポイント

ターン保護を有効にするタイミング

jsonc
{
    "turnProtection": {
        "enabled": true,   // ターン保護を有効化
        "turns": 6        // 6 ターンを保護(複雑なタスクに適)
    }
}

有効にしないことが推奨される場合

  • 簡単な質問回答シナリオ(AI が直接回答し、ツールを必要としない)
  • 高頻度の短い会話(保護期間が長すぎるとトリミングが遅れる)

保護ツールの設定

デフォルトの保護ツール(追加設定不要):

  • taskwriteeditbatchdiscardextracttodowritetodoreadplan_enterplan_exit

Schema デフォルト値の説明

IDE の自動補完機能を使用する場合、Schema ファイル(dcp.schema.json)のデフォルト保護ツールリストが不完全に表示される可能性があります。実際にはソースコードで定義された DEFAULT_PROTECTED_TOOLS が優先され、すべての 10 個のツールが含まれます。

追加の保護ツールを追加するタイミング

シナリオ設定例理由
重要なビジネスツールprotectedTools: ["critical_tool"]重要な操作が常に可視であることを保証
履歴コンテキストが必要なツールprotectedTools: ["analyze_history"]分析のために完全な履歴を保持
カスタムタスクツールprotectedTools: ["custom_task"]カスタムタスクのワークフローを保護
jsonc
{
    "strategies": {
        "deduplication": {
            "enabled": true,
            "protectedTools": ["custom_analyze"]  // 特定のツールを追加保護
        }
    },
    "tools": {
        "settings": {
            "protectedTools": ["important_check"]  // LLM ツールの追加保護
        }
    }
}

保護ファイルパターンの使用

推奨される保護パターン

ファイルタイプ推奨パターン保護理由
設定ファイル"*.env", ".env*"機密情報がトリミングで失われるのを防ぐ
データベース設定"**/config/database/*"データベース接続設定が常に利用可能であることを保証
シークレットファイル"**/secrets/**"すべてのシークレットと証明書を保護
コアビジネスロジック"src/core/*"重要なコードコンテキストの損失を防ぐ
jsonc
{
    "protectedFilePatterns": [
        "*.env",                // すべての環境変数ファイルを保護
        ".env.*",              // .env.local などを含む
        "**/secrets/**",       // secrets ディレクトリを保護
        "**/config/*.json",    // 設定ファイルを保護
        "src/auth/**"          // 認証関連コードを保護
    ]
}

パターンマッチングルール

protectedFilePatterns はツールパラメータの filePath フィールド(readwriteedit ツールなど)に一致します。


自動戦略の選択

重複排除戦略(Deduplication)

デフォルトで有効、ほとんどのシナリオに適しています。

適用シナリオ

  • 同じファイルを繰り返し読み取る(コードレビュー、複数回のデバッグなど)
  • 同じ検索または分析コマンドを実行する

有効にしないことが推奨される場合

  • 各呼び出しの正確な出力を保持する必要がある(パフォーマンス監視など)
  • ツール出力にタイムスタンプまたはランダム値が含まれる(呼び出しごとに異なる)

上書き書き込み戦略(Supersede Writes)

デフォルトで無効、プロジェクトの要件に応じて有効にするかどうかを決定します。

有効にすることが推奨されるシナリオ

  • ファイル変更後に直ちに読み取って検証する(リファクタリング、バッチ処理)
  • 書き込み操作の出力が大きく、読み取り後にその価値が上書きされる
jsonc
{
    "strategies": {
        "supersedeWrites": {
            "enabled": true  // 上書き書き込み戦略を有効化
        }
    }
}

有効にしないことが推奨される場合

  • ファイル変更履歴を追跡する必要がある(コード監査)
  • 書き込み操作に重要なメタデータが含まれる(変更理由など)

エラー消去戦略(Purge Errors)

デフォルトで有効、有効な状態を維持することが推奨されます。

設定の推奨

シナリオ推奨値理由
デフォルト設定4 ターンテスト済みのバランスポイント
高速失敗シナリオ2 ターンエラー入力を早期にクリアし、コンテキスト汚染を低減
エラー履歴が必要6-8 ターンデバッグのためにより多くのエラー情報を保持する
jsonc
{
    "strategies": {
        "purgeErrors": {
            "enabled": true,
            "turns": 2  // 高速失敗シナリオ:2 ターン後にエラー入力をクリア
        }
    }
}

LLM 駆動ツールのベストプラクティス

ナッジ機能の最適化

DCP はデフォルトで 10 回のツール呼び出しごとに AI にトリミングツールを使用するようリマインドします。

推奨設定

シナリオnudgeFrequency効果の説明
頻繁なツール呼び出し8-12AI に適時にクリアを促す
低頻度のツール呼び出し15-20リマインドの干渉を減らす
ナッジを無効化InfinityAI の自律的判断に完全に依存
jsonc
{
    "tools": {
        "settings": {
            "nudgeEnabled": true,
            "nudgeFrequency": 15  // 低頻度シナリオ:15 回のツール呼び出し後にリマインド
        }
    }
}

Extract ツールの使用

Extract を使用するタイミング

  • ツール出力に重要な発見またはデータが含まれ、要約を保持する必要がある
  • 元の出力が大きいが、抽出された情報が後続の推論を支えるのに十分

設定の推奨

jsonc
{
    "tools": {
        "extract": {
            "enabled": true,
            "showDistillation": false  // デフォルトでは抽出内容を表示しない(干渉を低減)
        }
    }
}

showDistillation を有効にするタイミング

  • AI がどの重要情報を抽出したかを確認する必要がある
  • Extract ツールの動作をデバッグまたは検証する

Discard ツールの使用

Discard を使用するタイミング

  • ツール出力が一時的な状態またはノイズに過ぎない
  • タスク完了後にツール出力を保持する必要がない

設定の推奨

jsonc
{
    "tools": {
        "discard": {
            "enabled": true
        }
    }
}

コマンド使用のヒント

/dcp context を使用するタイミング

推奨される使用シナリオ

  • Token 使用量が異常であると疑う場合
  • 現在のセッションのコンテキスト分布を知る必要がある
  • DCP のトリミング効果を評価する

ベストプラクティス

  • 長い会話の途中で一度チェックし、コンテキストの構成を理解する
  • 会話の終了時にチェックし、総 Token 消費量を確認する

/dcp stats を使用するタイミング

推奨される使用シナリオ

  • 長期的な Token 節約効果を知る必要がある
  • DCP の全体的な価値を評価する
  • 異なる設定の節約効果を比較する

ベストプラクティス

  • 毎週一度、累積統計データを確認する
  • 設定最適化後に前後の効果を比較する

/dcp sweep を使用するタイミング

推奨される使用シナリオ

  • コンテキストが大きすぎて応答が遅くなる
  • Token 消費を直ちに減らす必要がある
  • 自動戦略がトリミングをトリガーしない

使用のヒント

コマンド用途
/dcp sweep直前のユーザーメッセージ以降のすべてのツールをトリミング
/dcp sweep 10最後の 10 個のツールのみトリミング
/dcp sweep 5最後の 5 個のツールのみトリミング

推奨されるワークフロー

  1. まず /dcp context を使用して現在の状態を確認
  2. 状況に応じてトリミング数を決定
  3. /dcp sweep N を使用してトリミングを実行
  4. 再度 /dcp context を使用して効果を確認

通知モードの選択

3 つの通知モードの比較

モード表示内容適用シナリオ
off通知を表示しない干渉を必要としない作業環境
minimalトリミング数と Token 節約のみ表示効果を知りたいが詳細は不要
detailedトリミングされた各ツールと理由を表示(デフォルト)デバッグまたは詳細な監視が必要なシナリオ

推奨設定

シナリオ推奨モード理由
日常開発minimal効果に注目、干渉を低減
問題のデバッグdetailed各トリミング操作の理由を確認
デモまたはデモ録画off通知によるデモフローの干渉を回避
jsonc
{
    "pruneNotification": "minimal"  // 日常開発に推奨
}

サブエージェントシナリオの処理

サブエージェントの制限を理解する

DCP はサブエージェントセッションで完全に無効化されます

理由

  • サブエージェントの目標は簡潔な発見の要約を返すこと
  • DCP のトリミングはサブエージェントの要約動作を干渉する可能性がある
  • サブエージェントは通常実行時間が短く、コンテキストの膨張が限定的

サブエージェントセッションかどうかを判断する方法

  1. デバッグログを有効化

    jsonc
    {
        "debug": true
    }
  2. ログを確認: ログに isSubAgent: true マークが表示されます

サブエージェントの Token 最適化の提案

DCP はサブエージェントで無効化されますが、以下のことが可能です:

  • サブエージェントのプロンプトを最適化し、出力長を減らす
  • サブエージェントのツール呼び出し範囲を制限する
  • task ツールの max_length パラメータを使用して出力を制御する

まとめ

ベストプラクティス領域コア提案
Prompt Caching長い会話では Token 節約が通常キャッシュ損失を上回る
設定優先度グローバル設定は汎用設定に、プロジェクト設定は特定の要件に
ターン保護複雑なタスクは 4-6 ターン、高速タスクは 2-3 ターン
保護ツールデフォルト保護で十分、必要に応じて重要なビジネスツールを追加
保護ファイル設定、シークレット、コアビジネスロジックファイルを保護
自動戦略重複排除とエラー消去はデフォルトで有効、上書き書き込みは必要に応じて有効化
LLM ツールナッジ頻度 10-15 回、Extract はデバッグ時に抽出内容を表示
コマンド使用定期的にコンテキストを確認し、必要に応じて手動トリミング
通知モード日常開発は minimal、デバッグは detailed

付録:ソースコード参照

クリックしてソースコードの場所を表示

更新日時:2026-01-23

機能ファイルパス行号
設定ママージlib/config.ts691-794
設定検証lib/config.ts147-375
デフォルト設定lib/config.ts68-134
ターン保護lib/config.ts432-437
保護ツールlib/config.ts68-79
保護ファイルパターンprotected-file-patterns.ts1-60
サブエージェント検出lib/state/utils.ts1-8
ナッジ機能lib/config.ts438-441

重要な定数

  • MAX_TOOL_CACHE_SIZE = 1000:ツールキャッシュの最大エントリ数
  • turnProtection.turns:デフォルト 4 ターン保護

重要な関数

  • getConfig():マルチレベル設定を読み込み、マージする
  • validateConfigTypes():設定項目の型を検証する
  • mergeConfig():優先度で設定をマージする
  • isSubAgentSession():サブエージェントセッションを検出する