如何优化 prompt

一个高效的 Prompt 应由 Instruction 和 Question 两部分组成。
Instruction 通常由 context 和 steps 组成,这两者并非缺一不可的,也不存在清晰的界限。

  • Context 的格式是:你是一个用来 xxx 的 xxx,为了达到 xxx 目的,你需要遵循以下步骤:
  • Steps: 就是详述步骤

通常情况下,Instruction 是固定的,然后把用户的输入作为  user  的字段,或者简单拼接在 Instruction 后面传给 GPT。

`作为一款翻译软件,需要做到:  
- 把中文翻译成英文。  
- 直接输出翻译后的结果,不要输出其他无关内容。  
---  
${str}`;

zero-shot

像上文那样 context + steps + question 的组合就叫 “zero-shot”,即无样本提示。

无样本提示的特点有:

  • 适用于不需要其他程序对结果做二次处理的情况
  • 无样本提示通常更具创意

把表述形式反转一下,就是无样本提示的缺点,即:

  • 其他程序很难对结果做处理
  • 输出结果相对而言不太稳定

Few-shot

Few-shot 和 zero-shot 相反,即会给出若干 shot,通常来说,给出一个 shot 就能得到很好的效果了。

Prompt = context + step + shot + question

适用场景:

  1. 需要特定格式或结构的输出
  • 特定格式的文档生成(简历、报告等)
  • 特定格式的代码实现
  • 特定风格的文章写作
  1. 任务规则复杂或含糊
  • 当规则用文字难以准确描述
  • 规则包含多个特殊情况
  • 最好通过例子来展示规则
  1. 需要保持一致性的任务
  • 批量数据处理
  • 标准化命名
  • 统一的文本风格
  1. 涉及主观判断的任务
  • 情感分析
  • 文本分类
  • 风格转换

缺点:
没有推理过程,不适合多个步骤的流程

CoT 思维链

当涉及到数学计算时

似乎 few-shot 非常万能了,能解决很多问题,但是如果涉及到数学计算和逻辑推导,则再多的 shot 也无济于事。

可以在语句中添加让我们一步步思考,这句话就像是钥匙一样,能打开 GPT 逻辑思维能力的开关。

当场景进一步复杂,复杂到这句话无效的时候,笔者建议使用 Langchain

避免用户恶意输入

用户会使用类似忽略我刚刚说过的话等方式绕过我们设定的 Instruction,我们可以使用分隔符包裹,经测试 ``` 是很好的分隔符

`作为一款翻译软件,需要做到:
- 把```内的中文翻译成英文。
- 直接输出翻译后的结果,不要输出其他无关内容。
 
"""${str.replaceAll("```","\`\`\`")}"""`

避免幻觉

gpt 作为随机生成器,经常会胡乱组合生成一段文字,也被我称为胡说八道生成器,所以我们需要在 Steps 中添加一句类似:当该xx不存在或你不了解的时候,回答“不知道”即可,不可胡编乱造。

其他

  1. 思考、评估完全交给模型执行,可以泛化到更多复杂场景(比如:AI公众号文章写作、小红书爆款笔记生成)
  2. 执行算法可以根据场景定制(回溯、贪心、BFS、DFS、IDDFS、A*…)
  3. 可以与其他workflow/agent结合使用:

参考资料