Prompt Enrichment
プロンプトエンリッチメントは、AIモデルにリクエストを送る前に、ユーザーデータ、検索した文書、ツールの結果、例などを追加し、ユーザーに合った回答を生成できるようにします。
プロンプトエンリッチメントとは、AIモデルに届く前に、ユーザーのリクエストへ情報を自動的に追加することです。アプリケーションコードがユーザーとモデルの間に入り、ユーザーが入力しなかった情報、つまりアカウント情報、質問への回答となるドキュメント、ツールから取得したライブデータ、実例、またはリクエスト自体の詳細化した内容を補います。「カメラが検出されなくなったのはなぜですか?」と尋ねる顧客が入力するのは7語ですが、大規模言語モデル(LLM)にはその7語に加えて、顧客のデバイス、ソフトウェアのバージョン、問題に直接関連するヘルプ記事が渡されます。この用語は複数の手法を包括するもので、最もよく知られているのが検索拡張生成(RAG)です。
エンリッチメントで追加される情報#
- ユーザーとセッションのデータ: アプリケーション独自の記録から読み取るプロフィール項目、プラン、言語、場所、現在の日付、またはユーザーが閲覧しているページです。
- 取得したナレッジ: リクエストに関連するテキストをドキュメントコレクションやナレッジグラフから検索して見つかった箇所です。
- ツールの結果: APIから取得した注文状況、データベースの行、別のモデルの出力など、このリクエストのために取得された値です。
- 選択された例: すべてのリクエストに同じ固定セットを使うのではなく、入力に似ているためリクエストごとに選ばれるFew-shot例です。
- 書き換えられたクエリ: モデルが簡潔なリクエストを使用前に展開します。HyDEでは、Luyu GaoらがLLMに仮想的な回答を作成させ、その文書の埋め込みを使って実際の文書を取得します。この手法は、質問だけを与えられた同じ教師なし検索器を上回りました。
次の例では、scikit-learnによるTF-IDF類似度検索で取得したアカウントデータと最も関連性の高いヘルプ記事を使い、サポートに関する質問をエンリッチします。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# Context the user never typed: their account record and the help center's articles
account = {"plan": "Pro", "device": "USB webcam", "app_version": "2.3"}
articles = [
"Version 2.4 fixes USB webcams that are not detected after a system update.",
"Pro plans include ten concurrent video streams per workspace.",
"Invoices are available on the billing page as soon as a payment succeeds.",
]
question = "Why is my camera not detected anymore?"
# Retrieve the article most similar to the question
vectorizer = TfidfVectorizer().fit([*articles, question])
scores = cosine_similarity(vectorizer.transform([question]), vectorizer.transform(articles))[0]
best = articles[scores.argmax()]
# Assemble the enriched prompt the model actually receives
profile = ", ".join(f"{key}: {value}" for key, value in account.items())
prompt = f"Customer profile: {profile}\nRelevant article: {best}\nQuestion: {question}"
print(prompt)次のように出力されます。
Customer profile: plan: Pro, device: USB webcam, app_version: 2.3
Relevant article: Version 2.4 fixes USB webcams that are not detected after a system update.
Question: Why is my camera not detected anymore?ユーザーの質問にウェブカメラ、バージョン、アップデートという語はありませんが、エンリッチされたプロンプトには「2.3から2.4へのアップデート」と回答するために必要な情報がすべて含まれています。本番環境のシステムでは通常、ベクトルデータベースから密な埋め込みを使って検索するか、ハイブリッド検索を使いますが、情報を組み立てる手順は同じです。
実際のエンリッチメント#
2023年、GitHubはCopilotの隣接タブ手法について説明しました。この手法では、開発者が開いているファイルを検索し、カーソル付近のコードに似たスニペットをプロンプトに追加します。その結果、ユーザーがCopilotの提案を採用する頻度が相対的に5%増加しました。カスタマーサポート用のチャットボットは、各ターンでアカウントと注文の記録を追加し、AIエージェントは各ステップで前のツール呼び出しの結果を追加します。
ビジョンパイプラインでは、検出器が見つけた情報でプロンプトをエンリッチします。Ultralytics Platform Agentsでは、LLMブロックが選択したビジョン言語モデルに各画像を送り、その画像より上流にあるブロックの結果(YOLO26の検出結果など)も併せて渡します。そのため、一度作成したプロンプトに、ワークフローが処理するすべての画像について新しい物体検出の結果が追加されます。
エンリッチメントにはコストが伴います。追加する箇所ごとにtokenが消費され、料金と推論レイテンシが増加します。また、関連性のないコンテキストや過剰なコンテキストは精度を下げます。この影響はコンテキスト劣化と呼ばれます。取得したウェブページやドキュメントにはプロンプトインジェクション攻撃が含まれる可能性もあります。また、プロンプトに個人データを追加すると、モデルの運営者にデータが送信されるため、データプライバシー上の懸念が生じます。
プロンプトエンリッチメントと関連用語#
- 検索拡張生成(RAG): 外部のドキュメントコレクションを検索するエンリッチメント手法です。エンリッチメントには、ユーザーのプランや現在の日付など、検索を必要としないデータも含まれます。
- プロンプトエンジニアリング: 人がプロンプトテンプレートを設計します。エンリッチメントでは、実行時にそのテンプレートへリクエスト固有のデータを入力します。
- コンテキストエンジニアリング: アプリケーション内でモデルのコンテキストに含まれるすべてを管理します。各ステップで何を追加、圧縮、削除するかも対象です。エンリッチメントは追加を扱います。
- グラウンディング: モデルの出力を検証可能な情報源に結び付けます。エンリッチメントでは、その情報源をプロンプトに含めます。
- プロンプト圧縮: 情報量の少ないトークンを削除してプロンプトを短縮します。追加したコンテキストが長い場合、エンリッチメントの後に適用されることがよくあります。










