context-injection について
context-injection は、外部情報や例、ツール出力を AI のプロンプトに組み込むためのスキルです。根拠に基づく応答が必要なタスク向けに、配置、区切り、トークン予算を扱います。
主な機能
- 01必要なコンテキストの特定
- 02注入方法の選択
- 03区切りによる内容整理
- 04トークン予算に合わせた圧縮
- 05指示と注入データの分離
活用シーン
- 01コードレビューにソースファイルを渡す
- 02製品ドキュメントに基づくサポート回答
- 03プロフィール情報を使った返信の個別化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill context-injectionインストール後、Claude Code で/context-injectionを入力して読み込まれたか確認します。
詳細
コンテキスト注入
コンテキスト注入とは、モデルが正確で根拠に基づく回答を生成するために必要な知識を得られるよう、関連情報(文書、データ、例、ツールの出力など)を AI のプロンプトに動的に挿入する手法です。効果的な注入には、単にテキストを貼り付けるだけでなく、注入した情報をモデルが最大限活用できるよう、配置や形式、トークン予算を慎重に決める必要があります。
ワークフロー
-
必要なコンテキストを特定する:タスクを分析して、モデルに必要な外部情報の種類を判断します。コードレビューにはソースファイル、サポートに関する質問には製品ドキュメント、パーソナライズされた返信にはユーザープロフィールが必要です。それぞれの必要情報を、文書による根拠付け、少数例、ツールの出力、メタデータのいずれかに明確に分類します。
-
コンテキストを収集する:データベース、ファイルシステム、API の応答、ベクトルストア、過去の会話など、情報源から必要な情報を取得します。割り当てられたトークン予算に収まるよう、注入する前に必要に応じて圧縮または切り詰めます。
-
注入方法を選択する:コンテキストの種類とモデルの注意の向き方に応じて、適切な注入方法を選びます。
- システムプロンプトへの注入 — 役割の定義、ルール、ユーザーの好みなど、継続的に適用するコンテキストはシステムメッセージに入れます。
- 文書による根拠付け — 取得した文書やファイルをユーザーメッセージに挿入します。通常、質問より前に配置します。
- 少数例 — 望ましい形式を示す入出力ペアを、システムプロンプトとユーザーのクエリの間に配置します。
- ツールの出力の注入 — 関数呼び出しや API 呼び出しの結果を、会話内のアシスタントまたはツールのメッセージとして注入します。
-
コンテキストを整形し、区切る:注入する内容を明確な区切り(XML タグ、Markdown の見出し、トリプルバッククォートのフェンスなど)で囲み、指示、コンテキスト、ユーザーのクエリをモデルが区別できるようにします。各セクションには、
<retrieved_document>、<user_profile>、<code_file>などの明確なラベルを付けます。 -
プロンプトを組み立てる:システムプロンプト、注入したコンテキストのブロック、会話履歴、現在のユーザーのクエリを組み合わせて、最終的なプロンプトを作成します。最も重要なコンテキストはユーザーのクエリに最も近い位置に配置し(新近性バイアス)、最も変化しにくいコンテキスト(ルールやペルソナ)はシステムメッセージに入れます。
-
トークンの割り当てを検証する:期待される生成長に十分な余裕を残したうえで、プロンプト全体がモデルのコンテキストウィンドウに収まることを確認します。予算を超える場合は、優先度の低いコンテキストブロックから圧縮または削除します。
主な概念
- コンテキストの配置:プロンプト内でコンテキストがどこにあるかは重要です。モデルには「中間で見失う」効果が見られ、コンテキストウィンドウの先頭と末尾に最も強く注意を向けます。優先度の高い情報は、コンテキストブロックの先頭か、クエリの直前に配置します。
- トークン予算の割り当て:適切に設計されたプロンプトでは、トークンを意図的に割り当てます。システム指示に約 10~15%、注入するコンテキストに約 50~70%、会話履歴に約 5~10%を使い、モデルの応答用に約 15~25%を確保します。
- 区切りとラベル付け:明確な区切り(XML タグ、Markdown のフェンスなど)は、注入したセクションをモデルが解析するのに役立ちます。区切りがないと、特にプロンプトが長い場合、モデルがコンテキストの内容を指示と混同する可能性があります。
- 少数例:入出力の例を 2~3 個注入すると、形式への準拠とタスクの理解が大幅に向上します。例はシステムプロンプトの後、実際のクエリの前に配置します。
使用方法
AI モデルがタスクを正確に完了するために外部情報を必要とするときは、いつでもこのスキルを使用します。生のコンテキスト、タスクの説明、および必要に応じてプロンプトテンプレートを指定します。このスキルは、コンテキストを最適な位置に注入した、適切に構成されたプロンプトを組み立てます。
例
例 1:コードレビュータスク用のコードファイルの注入
プロンプトテンプレート:
<system>
You are a senior software engineer performing a code review. Identify bugs,
security issues, and style violations. Be specific and cite line numbers.
</system>
<code_file path="src/api/users.py">
import sqlite3
from flask import Flask, request, jsonify
app = Flask(__name__)
def get_db():
return sqlite3.connect("users.db")
@app.route("/users", methods=["GET"])
def list_users():
db = get_db()
query = f"SELECT * FROM users WHERE role = '{request.args.get('role')}'"
results = db.execute(query).fetchall()
return jsonify(results)
@app.route("/users/<int:user_id>", methods=["DELETE"])
def delete_user(user_id):
db = get_db()
db.execute(f"DELETE FROM users WHERE id = {user_id}")
db.commit()
return "", 204
</code_file>
Review the above code file. List all issues found.
モデルの出力:
- SQL インジェクション(重大) — 12~13 行目:
request.args.get('role')からのユーザー入力が、SQL クエリに直接埋め込まれています。プレースホルダーを使ったクエリを使用してください:db.execute("SELECT * FROM users WHERE role = ?", (role,))。- SQL インジェクション — 19 行目:
user_idが DELETE クエリに埋め込まれています。プレースホルダーを使ったクエリを使用してください。- 接続のクリーンアップがありません —
get_db()は接続を開きますが、閉じられていません。コンテキストマネージャーまたは Flask のteardown_appcontextを使用してください。- 認証/認可がありません — DELETE エンドポイントにアクセス制御がありません。誰でも任意のユーザーを削除できます。
例 2:パーソナライズされた応答用のユーザープロフィールデータの注入
プロンプトテンプレート:
<system>
You are a helpful fitness assistant. Use the user's profile to personalize
your recommendations. Be encouraging and specific.
</system>
<user_profile>
Name: Sarah
Age: 34
Fitness level: Intermediate
Goals: Lose 10 lbs, improve 5K time
Injuries: Mild left knee tendinitis
Preferred activities: Running, yoga, swimming
Available equipment: Dumbbells (5-30 lbs), resistance bands, yoga mat
Schedule: Can train 4 days/week, 45 min per session
</user_profile>
Sarah asks: "Can you suggest a weekly workout plan for me?"
モデルの出力:
Sarah さん、左膝をいたわりながら 5K と減量の目標に向けて取り組める、あなたに合わせた 4 日間のプランです:
月曜日 — イージーラン+モビリティ(45 分): 会話できるペースで 25 分間のイージーランを行い、その後、膝をサポートするために股関節屈筋と大腿四頭筋のストレッチに重点を置いたヨガを 20 分行います。
水曜日 — 筋力トレーニング+水泳(45 分): ダンベルサーキットを 20 分(軽い重量でのゴブレットスクワット、ランジ、ローイング、オーバーヘッドプレス)+膝に負担をかけずに有酸素運動ができる、負荷の低い水泳を 25 分行います。
金曜日 — インターバルラン(45 分): 10 分間のウォームアップ、5K の目標ペースで 2 分間のインターバルを 6 回(間に 90 秒のウォーキングで回復)、10 分間のクールダウンを行います。膝に痛みが出た場合は、水泳に切り替えてください。
日曜日 — アクティブリカバリーヨガ(45 分): ハムストリングスの柔軟性と体幹の安定性を重視した、全身を使うヨガのフローを行います。
ベストプラクティス
- 明示的な区切りを使う — 注入する各ブロックを、ラベル付きの XML タグまたは Markdown の見出しで囲みます。これにより、モデルが注入された内容と自身への指示を混同するのを防げます。
- 重要なコンテキストをクエリの近くに配置する — 注意の向け方のパターンから、モデルが最も利用しやすいのは、質問の直前またはプロンプトの冒頭に置かれた情報です。
- 必要なものだけを注入する — 利用可能なものすべてをプロンプトに詰め込むのは避けてください。無関係なコンテキストは注意を分散させ、コストを増加させます。情報を選別してください。
- 指示とコンテンツを分ける — 注入するドキュメント内に、振る舞いに関する指示を埋め込まないでください。ルールにはシステムプロンプトを使い、コンテキストブロックにはデータを入れてください。
- プロンプトテンプレートをバージョン管理する — 注入するコンテキストのソースが変わる場合は、出力品質の低下を検出できるよう、プロンプトテンプレートをバージョン管理してテストしてください。
- コンテキストあり/なしの両方でテストする — 注入したコンテキストが実際に役立っていることを確認するため、注入したコンテキストがある場合のモデルの出力を、コンテキストなしのベースラインと必ず比較してください。
エッジケース
- コンテキストがトークン予算を超える場合:注入するコンテンツが大きすぎる場合は、関連性に基づいて優先順位を付け、優先度の低いセクションを圧縮するか切り詰めます。プロンプトの指示を調整せずに、コンテキストを黙って削除しないでください。
- コンテキストソースが矛盾する場合:注入した 2 つのドキュメントが互いに矛盾する場合(例:ポリシーの異なるバージョンが 2 つある場合)は、どちらのソースを優先するかをモデルに明示するか、矛盾を指摘するよう指示してください。
- コンテキスト内の機密データ:ユーザープロフィール、PII、認証情報が注入するコンテキストに含まれる場合があります。モデルに渡る前に、注入パイプラインで機密フィールドを削除またはマスキングするようにしてください。
- コンテキストが空または存在しない場合:検索ステップで結果が返されない場合は、空のブロックを残すのではなく、「関連するドキュメントは見つかりませんでした」などのフォールバックメッセージを注入してください。空のブロックはモデルが誤解するおそれがあります。
- 信頼できないコンテンツの注入:ユーザーが提供したコンテンツやウェブから取得したコンテンツを注入する場合は、プロンプトインジェクション攻撃に注意してください。信頼できないコンテンツを明確に区切り、それを指示ではなくデータとして扱うようモデルに指示してください。