auto-prompt:APE-GrIPS
下面把你引的这段内容里提到的两种技术 APE 与 GrIPS 讲清楚:它们都是“自动搜索/优化指令提示词”的方法,区别在于候选提示词如何生成与如何变异。
一、APE(Automatic Prompt Engineer)是什么?
1)核心目标
给定一组示例(exemplars,通常是“输入→期望输出”),APE 让模型自动生成一个零样本指令 prompt(Zero-shot instruction),使得之后面对新输入时只用“指令 + 新输入”就能完成任务。
2)基本流程(可理解为:生成—打分—改写—循环)
APE 通常是这样的闭环:
- 准备 exemplars:例如 10~50 条任务样例(输入x,标准答案y)
- 生成候选指令 prompts:让 LLM 产出多条不同风格的“任务说明/指令”
- 对每个 prompt 打分(score):
用该 prompt 在一批验证样例上跑一遍,看准确率/F1/ROUGE/解析率等 - 选择表现好的 prompts
- 对“好 prompts”做变体(variations):常见就是同义改写/ paraphrase,或让 LLM “生成若干改进版”
- 重复迭代直到达到指标或预算
3)APE 适合/不适合场景
适合:
- 你能定义明确的自动指标(分类准确率、抽取 F1、JSON 可解析率等)
- 你需要“零样本指令”(把 few-shot 样例压缩成一段指令,便于线上调用)
- 任务相对“指令可表达清楚”,不强依赖长上下文推理链
不适合:
- 很难自动评分的开放式生成(除非有偏好模型或人工打分)
- 训练样例太少/不代表线上分布,容易搜到“投机 prompt”(过拟合)
- 需要复杂工具调用流程(RAG/函数调用),仅靠指令优化可能不够
二、GrIPS(Gradient-free Instructional Prompt Search)是什么?
你引用里说 GrIPS “类似 APE,但操作更复杂”。可以把 GrIPS 看作:把 prompt 当成可编辑对象,用一组“离散编辑算子”在 prompt 空间里搜索,不需要梯度(gradient-free)。
1)与 APE 的关键差异
- APE 的变异主要靠 paraphrase(同义改写) 或“生成新指令”这种较软的方式。
- GrIPS 明确设计了一套变异算子,例如:
- Deletion(删除):删掉某句约束/某个步骤
- Addition(增加):加定义、加规则、加输出格式要求
- Swapping(交换):交换段落顺序(比如先给定义再给任务,或先给格式再给约束)
- Paraphrasing(改写):同义表达替换
这些操作让搜索更像“离散优化/局部搜索”,更系统地探索 prompt 结构。
2)典型流程(从一个起始 prompt 出发做邻域搜索)
- 起始 prompt:可以是人写的 baseline,也可以是 APE 生成的
- 应用编辑算子生成邻居 prompts(一次生成多条)
- 评估打分
- 选择 top-k 进入下一轮
- 重复直到收敛或预算耗尽
3)GrIPS 适合/不适合场景
适合:
- 你已经有一个“还能用但不够好”的 prompt,想做系统性微调
- 任务对 prompt 的结构/顺序/约束很敏感(抽取、合规分类、严格格式输出)
- 你希望优化是“可控的编辑”,而不是让模型随意重写导致风格漂移
不适合:
- prompt 很短、任务很简单:复杂算子搜索未必比直接写一句“请按JSON输出”划算
- 你没有可靠的自动评估器:搜索会迷路
- 极端多目标(既要准确率又要很有文采又要很短):需要更复杂的多目标优化
三、3个中文例子:展示 APE/GrIPS 的“写法”(你可以直接套用)
下面例子重点不是“最终任务 prompt 怎么写”,而是**APE/GrIPS 的元提示词(用来生成/变异 prompts 的 prompt)**怎么写——因为这两种方法的核心就是“用模型来产出候选 prompt”。
例子1:APE 用 exemplars 生成零样本分类指令(情感分类)
任务样例(exemplars,供 APE 使用)
- 输入:这手机续航太差了,一天两充。→ 输出:负面
- 输入:物流很快,包装也很好。→ 输出:正面
- 输入:一般般,没有宣传的那么好。→ 输出:负面
- 输入:性价比很高,值得买。→ 输出:正面
APE:生成候选指令的元提示词
你是一名提示词工程师。请根据以下“输入-输出示例”总结任务规则,并写出一段零样本分类指令,用于让模型对新的中文评论进行情感分类。
要求:
1)标签只能是【正面/负面】二选一;
2)不要输出解释,只输出标签;
3)指令要简洁清晰,避免歧义。
示例:
- {示例1}
- {示例2}
- {示例3}
- {示例4}
请给出 10 个不同风格的候选指令(编号1-10)。
打分方式(APE 外部做):用每条候选指令在验证集算准确率,选 top-2 再进入下一轮“变体生成”。
APE:对最佳指令做 paraphrase 的元提示词
下面是一条表现很好的分类指令:
{best_prompt}
请在不改变标签集合与输出要求的前提下,生成 8 个改进版本。你可以:更明确边界规则、减少歧义、强化输出约束。
只输出改写后的指令列表。
例子2:GrIPS 对“抽取JSON”的起始 prompt 做算子变异
起始 prompt(baseline)
从文本中抽取公司名、金额、轮次、投资方,输出JSON。
GrIPS:用“编辑算子”生成变体的元提示词
你是提示词优化器。给定一个起始提示词,请通过以下操作生成多个变体,以提升信息抽取准确率与 JSON 可解析率:
- Addition:增加字段定义、缺失填null规则、禁止编造规则、输出格式约束
- Deletion:删除不必要或含糊的措辞
- Swapping:调整“任务/定义/格式/约束”的顺序使其更清晰
- Paraphrasing:同义改写使表达更明确
**硬约束:**字段名必须固定为:公司名、融资轮次、融资金额、投资方;输出必须为严格 JSON,不得输出额外文字。
起始提示词:
{baseline_prompt}请生成 12 个变体,并为每个变体标注你使用了哪些操作(Addition/Deletion/Swapping/Paraphrasing),格式:
变体1(操作:…):…
…
外部评估:对每个变体跑训练集,打分后选 top-k 继续迭代。
例子3:APE/GrIPS 用于“纠错式改 prompt”(你有失败案例时最有效)
任务:把用户输入的地址解析成结构化字段(省/市/区/详细地址)。
失败案例:模型经常把“浦东新区”当成“城市”,或 JSON 字段缺失。
提供样例给 APE 生成更好的指令
你是一名提示词工程师。我们要做“中文地址解析→JSON”。
下面给出若干训练样例(输入→期望输出)与失败样例(输入→模型输出→期望输出)。请据此写出一段零样本指令,要求:
1)输出严格 JSON:{"省":...,"市":...,"区":...,"详细地址":...}
2)缺失字段用 null;
3)区县(如“浦东新区”)必须放在“区”字段,不得放在“市”。
4)不要输出任何解释文字。训练样例:
- 输入:上海市浦东新区张江路88号 → 输出:{"省":null,"市":"上海市","区":"浦东新区","详细地址":"张江路88号"}
...(更多)失败样例:
- 输入:上海浦东新区世纪大道1号
模型输出:{"省":null,"市":"浦东新区","区":null,"详细地址":"世纪大道1号"}
期望输出:{"省":null,"市":"上海市","区":"浦东新区","详细地址":"世纪大道1号"}请生成 8 个候选指令。
如果用 GrIPS,则把“区必须放区字段”作为 Addition 规则加入,并尝试 Swapping 把字段定义放在输出格式之前,通常能显著减少字段混淆。
四、你在工程落地时怎么选:APE vs GrIPS(实用建议)
- 从 0 到 1、需要“自动产出指令”:先用 APE(生成大量候选指令 + paraphrase 迭代)。
- 从 1 到 1.2、已有 baseline 但要系统性微调:用 GrIPS(算子编辑更可控,适合修边界、修格式)。
- 两者经常组合:APE 生成起点 → GrIPS 做精修搜索。
如果你愿意,我可以按你的具体任务(分类/抽取/生成)给你:
1)一套可直接运行的 APE/GrIPS “候选生成元提示词”模板;
2)建议的评分函数(accuracy/F1/解析率/鲁棒性);
3)如何避免搜索过拟合与“投机 prompt”(例如加入对抗样例/约束惩罚)。