Skip to content

CH 29 · オブザーバビリティとコンテキスト管理

全文字数約 3,170 字所要時間約 20 分前提CH 04、CH 16難易度理解中心

本章のゴール

Agent が動き出してから、迟早こうした疑問にぶつかります:なぜさっきあの判断をしたのか? このラウンドは何 Token かかった? 長会話が遅く・高くなるのはどうしよう?

dsh のやり方は、Agent の一歩一歩をあなたの前に並べます——何を見たか、何を考えたか、何をしたか、何コストがかかったか、すべて追跡可能にします。前の CH 04 で軌跡画面の基礎を扱い、CH 16 でキャッシュヒット率に触れました。本章でオブザーバビリティとパフォーマンスを完全にはっきりさせます:軌跡の見方、セッションログの保管場所、Token とキャッシュ指標の読み方、コンテキストの管理方法。これらを習得すれば、「使える」から「効率良く、安定して使える」へ進むことができます。

軌跡(Trajectory):Agent の完全なフロー記録

軌跡とは何か

一般的な Agent ツールが表示するのは「チャット履歴」——あなたが言ったこと、Agent が返したこと。しかしその間で何が起きたか? どのファイルを読んだか、どのツールを呼んだか、ツールは何を返したか、なぜこのツールを呼んであのツールでなかったのか——これらはチャットビューには見えません。

軌跡(Trajectory)はこの問題を解決します:Agent の完全な実行過程をタイムラインで記録するもので、「モデル視点のフロー記録」であり、「ユーザー視点のチャット履歴」ではありません。

記録される内容:

カテゴリ記録内容
システムプロンプト各リクエストでモデルに送られた完全な system prompt
ユーザー入力送信したメッセージ、注入されたコンテキスト
モデルリクエストモデルに送られた完全な内容、モデルが返した完全な内容
ツール呼び出しどのツールを呼んだか、パラメータは何、戻り値は何
サブ Agent スケジューリングサブ Agent を何体起動したか、各々が何をしたか、結果がどう集約されたか
承認インタラクションどの操作が承認を求めたか、あなたが許可したか拒否したか

これらすべては単一の追記専用セッションログに書き込まれます——追加のみで改変なし、記録の完全性と監査可能性を保証します。

軌跡の閲覧場所

Web UI のセッション画面の上部に**軌跡(Trajectory)**タブがあるので、クリックして開きます。

軌跡画面:タイムライン + イベント一覧 + 詳細パネル

画面はブラウザの開発者ツールのネットワークパネルのような見た目です:

  • 上部のタイムライン:実際の開始・終了時刻に従い左から右へ描かれ、各ラウンドのリクエストが 1 区間を占める
  • 左のイベント一覧:1 行 1 記録、ターンごとにグループ化され、種類(LLM / TOOL / SUBAGENT / APPROVAL)が表示される
  • 右の詳細パネル:記録をクリックすると展開され、完全な内容が見られる——ツール呼び出しの Schema / Payload / Result、モデルリクエストの完全なプロンプトとレスポンス

軌跡詳細:TOOL 記録を選択、右側に Schema / Payload / Result が展開

軌跡は何に使えるか

  1. トラブルシュート:Agent が想定外の挙動をした? 軌跡を遡って、そのとき何が入力されていたか、なぜその判断をしたかを確認する。「AI が暴走した」の 90% は軌跡から原因を特定できる——大抵はあなたが気づかなかったファイルを読み込んでいた、あるいはツールが異常値を返していた。
  2. レビュー:タスクがうまく進んだ/進まなかった、軌跡を遡ってどのステップが転機だったか、どのステップが Token を浪費したかを確認する。次回はプロンプトや流れを最適化できる。
  3. 実験の再現:Agent 研究を行う際、軌跡は完全な実験記録である——同じ入力、同じツール、同じモデルバージョンで同じ結果を再現できる。
  4. 監査:チーム共有時、軌跡は「いつ・なぜこのファイルを変更したか」に答えられる——git log より粒度が細かく、「なぜ変更したか」まで記録されている。

セッションログ:保管場所と使い方

軌跡データは最終的にメモリだけでなくローカルファイルにも落ちます。

保存場所

すべてのセッションは ~/.dsh/sessions/ ディレクトリ(Windows:C:\Users\<your-username>\.dsh\sessions\)に保存され、ワークスペースディレクトリごとに整理されます。

ワークスペースディレクトリ名はパスをエスケープした形式になっています——-- で囲み、パスの区切り文字は - に置換、特殊文字は URL エンコード。たとえばワークスペース E:\software-workspace\DeepSeek harness demo はディレクトリ名 --E-software-workspace-DeepSeek~0020harness~0020demo-- に対応します。

各セッションはサブディレクトリで、名前は session-<uuid> 形式(Web UI 作成)または純粋な <uuid>(headless 実行)となっており、session.jsonl.zstd(zstd 圧縮の JSONL、1 行 1 イベント)が含まれます。

~/.dsh/sessions/
├── --E-software-workspace-DeepSeek~0020harness~0020demo--/
│   ├── session-05da13b1-c7bf-4f42-843b-.../
│   │   └── session.jsonl.zstd
│   ├── session-06451c43-35fb-4338-bc87-.../
│   │   └── session.jsonl.zstd
│   └── 37e884fa-7c73-40fa-81fc-.../          ← headless で実行されたセッション
│       └── session.jsonl.zstd
└── --E-software-workspace-doubaowork-DeepSeekHarnessGuide--/
    └── session-f417b4dd-3c8f-4098-85.../
        └── session.jsonl.zstd

セッションの 3 つの機能

このログに基づき、dsh は 3 つの操作をサポートします:

  1. 再開(Resume):dsh を閉じて再度開いても、前回のセッションが残っており、チャットを続けられる——ログが永続化されており、メモリ内ではないため。
  2. 分岐(Fork):履歴メッセージの下にある分岐アイコンをクリックすると、そのメッセージから新しい経路を開始できる。元のセッションには触れない。たとえば Agent がステップ 5 まで進み方向が間違っていると感じたら、ステップ 4 から分岐して別のプロンプトを試せる。元のセッションは保存される。分岐で生まれた新セッションは名前に (1)(2) などの接尾辞が付き、元と区別される。
  3. 再生(Replay):セッションのイベントストリームを再生し、各ステップの入力と出力を確認する。プラグインのデバッグや問題の再現に向く。

分岐の入口:メッセージ下の分岐アイコン + セッション一覧のその他のアクションメニュー

分岐の結果:新セッション名に (1) 接尾辞、独立して実行される

パフォーマンス指標:Token、キャッシュ、コンテキスト

dsh は画面のあちこちに主要なパフォーマンス指標をリアルタイム表示します。これらを読めるようになれば、コストと速度をコントロールできます。

Token 使用量

各ラウンドのリクエスト後、画面下部にそのラウンドの Token 統計が表示されます:

  • Input Token:モデルに送られたトークン総数(システムプロンプト、会話履歴、ツール結果を含む)
  • Output Token:モデルが生成したトークン
  • Cache hit Token:入力のうち DeepSeek のコンテキストキャッシュがヒットした部分

会話下部の Token 統計バー:ホバーで全情報を表示(ターン / ステップ / 時間 / キャッシュヒット率 / 入出力トークン)

累積使用量はセッション統計にあります——セッション全体で何 Token 消費したか、いくらコストがかかったか。

コンテキスト占有率

入力ボックスの右側にリングがあり、現在のコンテキスト占有率パーセンテージを表示します。これは dsh 独自デザインで、「あとどのくらいのコンテキスト余地があるか」をリアルタイムで見える化します。

コンテキスト占有率リング:入力ボックス右にパーセンテージを表示

コンテキストは有限です(モデルによりウィンドウサイズは異なるが、一般的に 128K から)。占有率が 100% に近づくと、dsh は自動でコンテキストを圧縮します——古い履歴を要約にまとめ、複数ターンの会話に置き換えて、ウィンドウ超過で止まらずに会話が続くようにします。

自動圧縮はフォールバック機構です。そのためより推奨されるやり方は:適切なタイミングで自分で圧縮をトリガーする——入力ボックスで /compact コマンドを打てば、dsh は即座に現在の会話を要約に圧縮し、複数ターンの履歴と置き換えます。自分のリズムで圧縮すれば、重要な情報を失わずに済みます。

占有率がほぼ埋まったら、2 つの選択肢:/compact で手動圧縮する、もしくは新しいセッションを開く。

コンテキスト管理:長セッションを落とさずに保つ方法

Agent セッションには自然な問題があります:長くチャットするほど Token を消費し、モデルは前の方を「覚えて」いる割合が減る。dsh はこれを管理するツールをいくつか用意しています。

いつ新しいセッションを開くか

すべてのタスクを 1 つのセッションでやる必要はありません。以下のような状況では新規セッションを開くべきです:

  • タスクの種類が変わった:さっきまでコードを書いていたが次は PPT を作る——新規セッションを開く、コードのコンテキストに PPT タスクを汚させない
  • ワークスペースが変わった:プロジェクトディレクトリを切り替えた——新規セッションを開く、dsh のセッションはワークスペースに紐付くため
  • コンテキスト占有率が 70% 超:このまま進めるとモデルが古い内容を落とし、反応も遅くなる——突然モデルが馬鹿になったと感じることがあるがそれが原因。新規セッションを開くか、/compact で先に圧縮する

コスト抑制の習慣

  1. 1 つのセッションで全部やらない——タスクごとにセッションを分割すれば、各セッションはコンテキストが短く、キャッシュヒット率が高く、コストが低い
  2. 大きなファイルを繰り返し読まない——Agent が 1000 行のファイルを読み込むたびに Token を消費する。一度読んだら、キーとなる情報を要約ファイルに書かせ、以降は要約だけ読む
  3. 適切なモデルを使う——簡単なタスクは flash、複雑な推論は pro、視覚タスクは vision——何にでも最高額モデルを使わない
  4. 累積使用量を定期的に確認——セッション統計に総 Token と推定コストが出る、月末の請求書で驚かないように

この章で学んだこと

以下の項目を自分で達成できれば合格です:

  • [ ] 軌跡とは何か、どこで見るか、軌跡に何が記録されているかを知っている
  • [ ] セッションログが ~/.dsh/sessions/ に保存され、再開・分岐・再生をサポートすることを知っている
  • [ ] Token 統計における Input / Output / Cache hit を理解できる
  • [ ] コンテキスト占有率の表示場所と、ほぼ埋まったときの対処を知っている
  • [ ] /compact コマンドの使い方を理解し、いつ手動圧縮すべきか知っている
  • [ ] コスト抑制の習慣を 3 つ以上挙げられる

Open Source · MIT · Community Driven