動的なFew-Shot選択
クエリごとに例を取得します。
「動的なFew-Shot選択」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
静的デモから動的デモへ
静的 few-shot では、すべてのクエリに同じデモを使います。動的 few-shotでは、デモのプールからクエリごとに最も関連性の高いデモを取得し、現在の入力に似た例を使ってモデルを条件付けます。
これは検索拡張 in-context learning です。デモの関連性が高まるため、ICL の品質を向上させる強力な手段の一つであり、特に多様な入力が混在する場合に効果的です。
class DynamicSelector:
def __init__(self, pool, embedder, index):
self.pool = pool # candidate demonstrations
self.embed = embedder
self.index = index # ANN index over pool embeddings
def select(self, query, k):
q = self.embed(query)
ids = self.index.search(q, k)
return [self.pool[i] for i in ids]デモプールの埋め込み
候補となるすべてのデモについてあらかじめ埋め込みを計算し、近似最近傍インデックス(FAISS、HNSW、またはベクトル DB)に保存します。クエリ時には入力を一度だけ埋め込み、上位の一致候補を取得します。
タスクの意味論に合った埋め込みモデルを選んでください。汎用の埋め込みモデルでは、正解ラベルを予測する特徴ではなく、表面的な特徴に基づいてクラスタリングされる場合があります。
import numpy as np
def build_index(pool, embed):
vecs = np.stack([embed(d.input) for d in pool]).astype('float32')
vecs /= np.linalg.norm(vecs, axis=1, keepdims=True) # cosine via dot
index = HNSW(dim=vecs.shape[1])
index.add(vecs)
return indexkNN プロンプティング
標準的な手法(Liu et al., 2022)では、ラベル付きプールからクエリのk 個の最近傍を取得し、デモとして使います。検索に基づく選択はランダム選択を一貫して上回ります。関連性の高いデモによってタスクの位置づけが明確になり、適切なラベル空間が示されるためです。
取得したラベルはソフトな kNN 分類器の事前分布としても機能し、モデルを近傍の回答へと導きます。
def knn_prompt(query, selector, k, build):
demos = selector.select(query, k)
demos = order_by_similarity(embed(query), demos) # most similar last
return build(demos, query)多様性を考慮した検索
単純な top-k では、ほぼ重複するデモが返され、コンテキストを無駄にすることがあります。取得候補に対してMMRやクラスタリングを適用し、関連性を保ちながら、選択したデモがクエリの異なる側面をカバーするようにしてください。
これは、異なる部分ごとに代表的なデモが必要となる構成的な入力で特に重要です。
def diverse_retrieve(query, selector, k, pool_n=30, lam=0.7):
cand = selector.select(query, pool_n)
q = embed(query)
return mmr_against_query(cand, q, k, lam) # relevance + diversityレイテンシと検索予算
動的な選択では、リクエストごとに埋め込みの呼び出しと ANN 検索が追加されます。繰り返し入力に対するクエリ埋め込みをキャッシュし、検索をバッチ化し、インデックスをメモリ上に保持して、これに必要な予算を確保してください。
高 QPS のシステムでは、検索ステップを 1 ミリ秒未満にする必要があります。そうでなければ、関連性の向上が追加されたテールレイテンシによって打ち消されます。
from functools import lru_cache
@lru_cache(maxsize=50_000)
def cached_embed(text):
return embed(text)
# Plus: warm in-RAM HNSW, batched search, async prefetch動的デモとキャッシュの緊張関係
動的デモではリクエストごとにデモブロックが変わるため、プロンプトプレフィックスのキャッシュが利用できなくなります。安定したキャッシュ済みプリアンブル(指示と少数の汎用デモ)を保持し、その後ろに取得したクエリ固有のデモだけを追加して緩和してください。
これにより、後段ではクエリごとの関連性を維持しながら、キャッシュによるコスト削減の大部分を取り戻せます。
prompt = (
STATIC_PREAMBLE # cached: instructions + anchor demos
+ render(diverse_retrieve(query, selector, k)) # dynamic tail
+ format_query(query)
)学習データとテストデータのリーク回避
評価中にクエリ自体がプールに含まれていると(評価時によく起こります)、検索によって正確な答えが返され、指標が過大になります。評価時には、類似度のしきい値を超えるクエリ自身とほぼ同一の近傍を必ず除外してください。
本番環境では、プールの重複を排除し、ユーザー自身の過去の入力をデモとしてそのまま再提示しないように対策してください。
def leak_safe_select(query, selector, k, sim_cap=0.97):
cand = selector.select(query, k + 5)
q = embed(query)
cand = [d for d in cand if cos(q, d.emb) < sim_cap]
return cand[:k]コールドスタートとプールの拡張
初期段階ではプールが小さく、検索で関連性の低い候補が返されることがあります。厳選した静的セットでブートストラップし、その後、検証済みの本番トレースからプールを拡張して、定期的に再埋め込みと再インデックスを行ってください。
デモごとの利用状況と結果を記録し、価値の低い例や古くなった例を削除できるようにして、インデックスを簡潔に保ちます。
def maybe_add_to_pool(trace, verified):
if verified and novelty(trace, index) > THRESH:
emb = embed(trace.input)
index.add(emb)
pool.append(Demo(trace.input, trace.output, trace.meta))類似度を超えた選択
最近傍の関連性は有力なデフォルトですが、常に最適とは限りません。高度な選択器は、情報量(そのデモによってクエリの曖昧さが解消されるか)、多様性、ラベルの網羅性を重視します。生の類似度ではなく、下流の正解率を最大化する選択ポリシーを学習する手法もあります。
選択とは、このクエリに対するモデルの不確実性を最も大きく減らすデモセットを選ぶことだと捉えてください。
def select_by_uncertainty_reduction(query, pool, k):
base = entropy(model_probs(build([], query)))
gains = []
for d in pool:
h = entropy(model_probs(build([d], query)))
gains.append((d, base - h)) # info gain per demo
return [d for d, _ in sorted(gains, key=lambda x: -x[1])[:k]]動的パイプラインの評価
リークを制御したホールドアウトデータで、動的方式を静的方式およびランダム方式のベースラインと比較してください。正解率、検索された類似度の分布、エンドツーエンドのレイテンシ、キャッシュヒット率を報告します。
正解率では勝っていてもキャッシュの再利用を大きく損なう動的システムは、コスト面では全体としてマイナスになる可能性があります。品質だけでなく、目的全体を評価してください。
def eval_pipeline(eval_set):
return {
'acc_dynamic': run(dynamic, eval_set),
'acc_static': run(static, eval_set),
'acc_random': run(random_sel, eval_set),
'p95_latency': latency_p95(),
'cache_hit': cache_hit_rate(),
}リファレンスアーキテクチャ
エンドツーエンドでは、検証済みのデモプール、埋め込みモデル、メモリ上の ANN インデックス、リーク対策・多様性・類似度順序を適用する選択器、安定したキャッシュ済みプリアンブル、そしてプールを拡張・整理するフィードバックループを用意します。
このアーキテクチャにより、few-shot プロンプティングは、それに伴う運用上の規律を備えた検索システムになります。
def answer(query):
demos = leak_safe_select(query, selector, k=4)
demos = mmr_against_query(demos, embed(query), 4)
demos = order_by_similarity(embed(query), demos)
prompt = STATIC_PREAMBLE + render(demos) + format_query(query)
out = llm(prompt)
log_for_pool_growth(query, out)
return outクイックチェック
評価結果が誤って強く見える原因を診断してみましょう。
まとめ
要点:
- 動的 few-shot はクエリごとにデモを取得し、関連性を高めることでランダム方式や静的方式を上回ります。
- プールを ANN インデックスに埋め込みます。kNN プロンプティングを強力なデフォルトとし、類似度の昇順で並べてください。
- 多様性(MMR)を加え、情報量や不確実性の低減を考慮した選択器も検討してください。
- 検索によるリークを防ぎ、レイテンシを管理し、キャッシュ済みの静的プリアンブルと動的な末尾部分を組み合わせてください。
- 検証済みのトレースからプールを拡張・整理し、正解率、レイテンシ、キャッシュヒット率をまとめて評価してください。
よくある質問
「動的なFew-Shot選択」レッスンは無料ですか?
はい。「動的なFew-Shot選択」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「動的なFew-Shot選択」で何を学びますか?
クエリごとに例を取得します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「動的なFew-Shot選択」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Zero-Shot、One-Shot、Few-Shot
- 効果的な例の設計
- 例の順序と新しさ
- 動的なFew-Shot選択