0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude API に会話圧縮機能「compaction」がベータ追加された

0
Posted at

はじめに

2026年9月14日、Anthropic は Claude API の Messages API に、会話履歴をオンデマンドで要約・圧縮できる compaction(コンパクション) 機能をベータ追加しました。ベータヘッダー compact-2026-09-04 とトップレベルの compaction パラメータを使うことで、長くなった会話履歴を API 側で要約し、以降のリクエストではその要約(署名付き compaction ブロック)を元のメッセージ群の代わりに送信できるようになります。

長時間の対話やエージェントのループ処理では、会話が進むほどコンテキストが肥大化し、トークン消費やレイテンシ、最終的にはコンテキストウィンドウの上限が課題になります。これまで開発者は独自に要約ロジックを実装してこの問題に対処してきましたが、今回のベータ機能はその役割を API 側に肩代わりさせるものです。エージェント型アプリケーションやチャットボットを開発している方にとっては、実装コストと精度の両面で影響のあるアップデートです。

📌 影響を受ける人

  • 長時間・多ターンの会話を扱うチャットアプリケーションの開発者
  • エージェントループ(ツール呼び出しを繰り返すタイプ)を実装している開発者
  • 自前でコンテキスト圧縮・要約ロジックを実装/運用している開発者

変更の全体像

compaction 機能を使った際のリクエストフローを図示します。ポイントは、圧縮は開発者が任意のタイミングで要求する「オンデマンド」である点と、返却された compaction ブロックを次回以降のリクエストで元メッセージの代わりに使い回す点です。

従来はクライアント側で「古いメッセージをどう要約するか」「どこまで残すか」を独自実装する必要がありましたが、compaction 機能を使うと、この判断と実行を API 側に委譲できます。

変更内容

項目 内容
機能名 Messages API のオンデマンド compaction(ベータ)
有効化方法 ベータヘッダー compact-2026-09-04 を付与
リクエストパラメータ トップレベルの compaction パラメータ
返却物 署名付き compaction ブロック(要約)
圧縮タイミング 開発者が任意に選択可能(オンデマンド)
実行方式 バックグラウンド実行が可能
直近ターンの扱い verbatim(一言一句そのまま)で保持可能
thinking との互換性 preserved thinking 対応モデルでは、残したターン内の thinking も有効なまま維持され得る
ステータス ベータ(正式版で仕様変更の可能性あり)
対象 API Messages API

特に重要なのは「直近のターンは要約せずそのまま残せる」という点です。これにより、直前のやり取りのニュアンスやツール呼び出しの詳細を失うことなく、それより前の古い文脈だけを圧縮する、という運用ができます。

💡 Tips
エージェントのように大量のツール呼び出し・思考過程が蓄積するユースケースでは、「直近 N ターンは verbatim で残しつつ、それ以前を compaction する」という運用が、自前で要約ロジックを書くよりシンプルに実現できる可能性があります。

影響と対応

現時点ではベータ機能であり、action_required は明示されていません(既存の実装が壊れるような破壊的変更ではない)。ただし、長時間会話やエージェントループを扱っているプロジェクトでは、以下を検討する価値があります。

  • 既存の自前要約実装(古いメッセージを LLM に要約させてから会話履歴に差し込む、といった処理)を compaction 機能に置き換えられないか評価する
  • ベータヘッダーが必要なため、まずは開発・検証環境で compact-2026-09-04 を有効化して挙動を確認する
  • 圧縮リクエストをバックグラウンドで実行できる特性を活かし、ユーザー応答をブロックしない形で定期的にコンテキストを圧縮するフローを設計する
  • ベータ機能である以上、正式版でパラメータ名やレスポンス形式が変わる可能性を踏まえ、本番導入は変更容易な形に留める

⚠️ Breaking Change
現時点ではベータのオプトイン機能であり、既存コードへの強制的な影響はありません。ただし正式リリース時に仕様が変更される可能性があるため、ベータ版に強く依存した実装は避けるのが無難です。

コード例

イメージしやすいよう、Before(自前要約)と After(compaction 機能利用)の擬似コードを示します。実際のパラメータ名・レスポンス構造は公式ドキュメントで最新情報を確認してください。

Before: 自前で会話履歴を要約していた場合

# 会話が長くなったら、古いメッセージを別リクエストで要約させて置き換える
old_messages = conversation_history[:-10]
recent_messages = conversation_history[-10:]

summary_response = client.messages.create(
    model="claude-sonnet-5",
    messages=[
        {"role": "user", "content": f"以下の会話を要約してください: {old_messages}"}
    ],
)
summary_text = summary_response.content[0].text

# 要約テキストを先頭に差し込んで会話履歴を作り直す
conversation_history = [
    {"role": "user", "content": f"[過去の会話の要約] {summary_text}"}
] + recent_messages

After: compaction 機能を利用する場合

response = client.beta.messages.create(
    model="claude-sonnet-5",
    betas=["compact-2026-09-04"],
    messages=conversation_history,
    compaction={
        # 圧縮対象の範囲や、直近何ターンを verbatim で残すかなどを指定
        "preserve_recent_turns": 10,
    },
)

# レスポンスに含まれる署名付き compaction ブロックを保存
compaction_block = response.compaction_block

# 以降のリクエストでは、要約対象だったメッセージの代わりに
# compaction ブロックを先頭に置いて送信する
conversation_history = [compaction_block] + recent_turns

自前実装では「要約用の追加リクエスト」「要約結果のフォーマット設計」「差し込み位置の管理」をすべて自分で組む必要がありましたが、compaction 機能ではこれらを API 側の仕組みに委ねられる点が大きな違いです。

まとめ

  • Claude API の Messages API に、会話をオンデマンドで圧縮する compaction 機能がベータ追加された
  • ベータヘッダー compact-2026-09-04compaction パラメータで有効化し、署名付き compaction ブロックを以降のリクエストで再利用する
  • バックグラウンド実行、直近ターンの verbatim 保持、preserved thinking との互換性が特徴
  • 長時間会話やエージェントループのコンテキスト管理において、自前の要約実装を置き換えられる可能性がある
  • ベータ機能のため、本番導入時は正式版での仕様変更に備えた設計が望ましい

長い会話やエージェント処理でコンテキスト管理に課題を感じている場合は、まず開発環境で試してみる価値のあるアップデートです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?