如何优化 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
适用场景:
- 需要特定格式或结构的输出
- 特定格式的文档生成(简历、报告等)
- 特定格式的代码实现
- 特定风格的文章写作
- 任务规则复杂或含糊
- 当规则用文字难以准确描述
- 规则包含多个特殊情况
- 最好通过例子来展示规则
- 需要保持一致性的任务
- 批量数据处理
- 标准化命名
- 统一的文本风格
- 涉及主观判断的任务
- 情感分析
- 文本分类
- 风格转换
缺点:
没有推理过程,不适合多个步骤的流程
CoT 思维链
当涉及到数学计算时
似乎 few-shot 非常万能了,能解决很多问题,但是如果涉及到数学计算和逻辑推导,则再多的 shot 也无济于事。
可以在语句中添加让我们一步步思考,这句话就像是钥匙一样,能打开 GPT 逻辑思维能力的开关。
当场景进一步复杂,复杂到这句话无效的时候,笔者建议使用 Langchain,
避免用户恶意输入
用户会使用类似忽略我刚刚说过的话等方式绕过我们设定的 Instruction,我们可以使用分隔符包裹,经测试 ``` 是很好的分隔符
`作为一款翻译软件,需要做到:
- 把```内的中文翻译成英文。
- 直接输出翻译后的结果,不要输出其他无关内容。
"""${str.replaceAll("```","\`\`\`")}"""`避免幻觉
gpt 作为随机生成器,经常会胡乱组合生成一段文字,也被我称为胡说八道生成器,所以我们需要在 Steps 中添加一句类似:当该xx不存在或你不了解的时候,回答“不知道”即可,不可胡编乱造。
其他
- 思考、评估完全交给模型执行,可以泛化到更多复杂场景(比如:AI公众号文章写作、小红书爆款笔记生成)
- 执行算法可以根据场景定制(回溯、贪心、BFS、DFS、IDDFS、A*…)
- 可以与其他workflow/agent结合使用: