Active Prompting — это подход, при котором примеры для few-shot выбирают не вручную и не случайно, а по сигналу неуверенности модели. Идея простая: не тратьте limited prompt budget на лёгкие случаи, если модель и так с ними справляется. Вместо этого дайте ей эталон там, где она чаще ошибается или даёт нестабильные ответы.
Обычный few-shot спрашивает: «какие примеры красиво выглядят?». Active Prompting спрашивает: «на каких примерах модель реально ломается?».
В реальном продукте hard cases появляются не из теории, а из production traffic:
route систематически путает boundary labels;
пользователи пишут кривые edge-case inputs;
модель нестабильна на похожих, но не идентичных сценариях.
Active Prompting полезен тем, что превращает эти failure cases в материал для улучшения few-shot слоя. Это делает его хорошим мостом между evals, logs и prompt maintenance.
Плюсы
Лучше использует ограниченный few-shot budget
Подтягивает performance на edge-case
Хорошо сочетается с evals и retrieval-based example selection
Переводит prompt engineering в data-centric режим
Минусы
Нужен дополнительный eval layer
Плохо определённая uncertainty-метрика может выбрать не те кейсы
если examples быстро устаревают и не поддерживаются.
Это особенно важно: без стабильного eval и owner-а для example pool техника быстро деградирует в набор старых кейсов, которые уже не отражают текущий traffic.
Плохая версия Active Prompting — выбирать cases только по "сложности", игнорируя business impact. Не каждый сложный пример реально полезен для production prompt.
def uncertainty_score(outputs: list[str]) -> float:
"""
Чем больше расхождение между несколькими прогонами,
тем выше кандидат на active-prompt example.
"""
unique = len(set(outputs))
return unique / len(outputs)
def select_active_examples(dataset, llm, n=8):
scored = []
for item in dataset:
outputs = [llm(item["input"]) for _ in range(5)]
scored.append((uncertainty_score(outputs), item))
scored.sort(reverse=True, key=lambda x: x[0])
return [item for _, item in scored[:n]]