记忆点:静态示例成本低但容易过时,动态检索更准但有延迟开销。
💡 答案要点
Static Few-Shot(静态)vs Dynamic Few-Shot(动态)核心差异:
| 维度 | Static Few-Shot | Dynamic Few-Shot |
|---|---|---|
| 示例来源 | 硬编码在 Prompt 里 | 运行时从知识库检索 |
| 适用场景 | 固定任务、简单分类 | 开放域任务、领域多样 |
| 维护成本 | 低(改一次即可) | 高(需维护示例库 + 向量索引) |
| 准确率上限 | ~75%(示例不匹配时大幅下降) | ~92%(能选到最佳示例) |
| 延迟影响 | 几乎零额外延迟 | +检索时间(通常 <50ms) |
| Token 消耗 | 固定(最多 5 个示例 × 上下文) | 动态(可能 0~N 个示例) |
何时该用什么(面试高频决策题):
✅ 用 Static Few-Shot:
- 任务类型固定且单一(如情感分类、NER)
- 用户群体和输入分布稳定
- Token 预算紧张 / 延迟敏感
- 快速原型阶段
✅ 用 Dynamic Few-Shot:
- 开放域问答(用户问题跨度大)
- 多领域混合场景(医疗+金融+法律混用)
- 需要持续优化但不想频繁调参
- 示例库足够大(100+ 优质示例)
❌ 两者都不适合:
- 简单规则就能解决的任务
- 实时性要求极高的场景(如 <100ms SLA)Dynamic Few-Shot 实现模式:
python
class DynamicFewShot:
def __init__(self, example_db, embedding_model):
self.db = example_db # 向量数据库存储示例
self.embedder = embedding_model
def retrieve_examples(self, user_query, k=3):
"""根据用户查询语义相似度检索最相关的示例"""
query_emb = self.embedder.encode(user_query)
return self.db.similarity_search(query_emb, k=k)
def build_prompt(self, user_query, retrieved_examples):
"""把检索到的示例动态拼入 Prompt"""
prompt = "请根据以下示例回答问题:\n\n"
for i, ex in enumerate(retrieved_examples, 1):
prompt += f"示例 {i}:\n输入:{ex.input}\n输出:{ex.output}\n\n"
prompt += f"\n问题:{user_query}\n回答:"
return prompt效果数据(行业基准测试):
| 方法 | GSM8K(数学) | OpenQA(开放问答) | Code Translation | 平均延迟 |
|---|---|---|---|---|
| Zero-shot | 52% | 41% | 35% | 基准 |
| Static Few-Shot | 64% | 53% | 48% | +5ms |
| Dynamic Few-Shot | 78% | 68% | 62% | +40ms |
面试话术:
"Static Few-Shot 胜在简单高效,适合任务边界清晰的场景;Dynamic Few-Shot 的核心优势是通过语义检索为每个输入选择最优的 N 个示例,典型提升 15-20 个百分点。但在生产环境要权衡检索延迟——我的做法是预计算好 top-K 示例缓存层,配合异步检索,让用户体验无感知。对于冷启动期(示例库不足),自动降级到 Static 或 Zero-shot。"