동적 퓨 샷 선택
질의마다 예시 검색
동적 퓨 샷 선택은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
정적 예시에서 동적 예시로
정적 퓨샷은 모든 질의에 동일한 예시를 사용합니다. 동적 퓨샷은 풀에서 질의마다 가장 관련성 높은 예시를 검색하여, 현재 입력과 유사한 예시를 바탕으로 모델에 조건을 제공합니다.
이는 검색 증강 인컨텍스트 학습입니다. 특히 트래픽의 유형이 다양한 경우, 퓨샷 품질을 높이는 가장 강력한 방법 중 하나인 예시의 관련성을 높여 줍니다.
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 또는 벡터 데이터베이스)에 저장하십시오. 질의 시점에는 입력을 한 번 embed하고 가장 잘 일치하는 항목을 검색합니다.
과제의 의미와 잘 맞는 임베딩 모델을 선택하십시오. 범용 임베더는 올바른 레이블을 예측하는 차원보다 표면적 특징을 기준으로 항목을 군집화할 수 있습니다.
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)은 레이블이 지정된 풀에서 질의와 가장 가까운 kNN을 검색하여 예시로 사용하는 것입니다. 검색 기반 선택은 관련성 높은 예시가 과제를 더 잘 파악하게 하고 올바른 레이블 공간을 제공하므로 무작위 선택보다 일관되게 우수합니다.
검색된 레이블은 소프트 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)다양성을 고려한 검색
순수한 상위 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 인덱스, 누수 방지·다양성·유사도 순서 배열을 적용하는 선택기, 안정적으로 캐시된 서두, 그리고 풀을 확장하고 정리하는 피드백 순환 과정입니다.
이 아키텍처는 퓨샷 프롬프팅을 그에 필요한 운영 규율을 갖춘 검색 시스템으로 바꿉니다.
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빠른 확인
오해를 불러일으킬 만큼 높은 평가 결과의 원인을 진단해 보십시오.
요약
핵심 요점:
- 동적 퓨샷은 질의마다 예시를 검색하여 관련성을 높이므로 무작위 또는 정적 방식보다 우수합니다.
- 풀을 ANN 인덱스에 임베딩하십시오. kNN 프롬프팅이 강력한 기본값이며, 유사도가 낮은 순서로 배열합니다.
- 다양성(MMR)을 추가하고 정보성 및 불확실성 감소를 고려하는 선택기를 검토하십시오.
- 검색 누수를 방지하고 지연 시간을 관리하며, 동적 후반부와 함께 캐시된 정적 서두를 유지하십시오.
- 검증된 운영 기록을 바탕으로 풀을 확장하고 정리하며, 정확도·지연 시간·캐시 적중률을 함께 평가하십시오.
자주 묻는 질문
“동적 퓨 샷 선택” 강의는 무료인가요?
네 — “동적 퓨 샷 선택” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
“동적 퓨 샷 선택”에서 뭘 배우나요?
질의마다 예시 검색 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“동적 퓨 샷 선택” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 제로 샷, 원 샷, 퓨 샷
- 효과적인 예시 설계
- 예시 순서와 최신성
- 동적 퓨 샷 선택