OpenAI官方提供了提示词工程指南。在这里将他们总结来指示LLM返回更好的结果。
策略1:撰写清晰的指令
如果输入的内容过于杂乱,模型无法读取你的思想。一般来说可以拥有以下的战术
- 在查询中包含技术细节以获得相关答案;
- 要求模型扮演某种角色;
- 只用定界符清楚地表示输入的不同部分;
- 指定完成任务所需的步骤;
- 提供示例;
- 指定输出的期望长度;
策略2:提供参考文本
语言模型可以自信地虚构答案,特别是在涉及深奥话题、引用和网址时,因为模型更新成本比较高,互联网上的新内容更新太快了,模型不知道就会胡说八道。
- 指示模型使用参考文本回答问题;
- 指示模型使用参考文本中的引用;
策略3:将复杂任务拆分为简单任务
复杂任务的错误率往往比简单任务要高。此外,复杂任务通常可以重新定义为一系列简单任务的工作流程,其中较早任务的输出用于构建后续任务的输入。
- 针对需要非常长的对话应用,总结或过滤之前的对话;
- 递归得对长文档进行逐段摘要和构建完整摘要;
策略3:给模型构建时间⭐️
如果被要求计算17乘以28,你可能不会立刻知道答案,但是可以通过时间算出来。同样地,模型在试图立即回答问题时容易出现更多推理错误,而不是花时间思考出一个答案。在得出答案之前要求进行“思维链”有助于模型更可靠地推理出正确答案。
- 要求模型在做出结论之前自行解决问题;
- 使用内心独白或者一系列查询来隐藏模型的推理过程;
- 询问模型是否在之前的处理中有遗漏任何内容;
策略4:使用外部工具⭐️
通过向模型提供其他工具的输出来弥补模型的缺陷。例如,文本检索系统(有时称为RAG或检索增强生成)可以告诉模型相关文档的信息。像OpenAI的代码解释器这样的代码执行引擎可以帮助模型进行数学和代码运行。
- 使用基于嵌入的搜索来实现高效的知识搜索;
- 使用代码执行来进行更精确的技术或调用外部API;
- 让模型访问特定功能;
策略5:系统地测试变化
我们可以通过调整提示词,观察结果是否满足预期,评估模型的输出效果。
- 用标准答案评估模型输出
提示词实战
大多数的内容其实和我们在之前的内容差不多,在这里我们主要来说明一些和之前提示词工程不一样的内容:
使用外部工具
-
使用基于嵌入的搜索来实现高效的知识检索
模型可以利用外部信息来源,如果作为其输入的一部分提供。这可以帮助模型生成更为明智和更新的回复。例如,如果用户提出关于特定电影的问题,将有关电影的高质量信息(例如演员,导演等)添加到模型的输入中可能是有益的。嵌入可以用于实现高效的知识检索,从而可以在运行时动态地将相关信息添加到模型输入中。文本嵌入是一种可以衡量文本字符串相关性的向量。相似或相关的字符串将比不相关的字符串更接近。这一事实,再加上存在快速向量搜索算法,意味着可以使用嵌入来实现高效的知识检索。特别是,文本语料库可以被分成多个块,然后每个块可以被嵌入和存储。然后,可以对给定的查询进行嵌入并执行向量搜索,以找到与查询最相关的语料库中被嵌入的文本块(即在嵌入空间中最接近的)。
-
使用代码执行进行更精确的计算或调用外部API
语言模型不能单独依赖于执行算术或长时间的计算。在需要进行这种计算的情况下,可以指示模型编写和运行代码,而不是进行自己的计算。特别是,可以指示模型将要运行的代码放入指定格式(例如,三个反引号)。生成输出后,可以提取并运行代码。最后,如果需要,可以将代码执行引擎(即Python解释器)的输出作为下一个查询的模型输入。
// 系统消息您可以通过将其置于三个反引号中来编写和执行Python代码,例如 \`\`\`代码放在此处\`\`\`。使用这种方法执行计算。// 用户消息找出以下多项式的所有实根:3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10。
代码执行的另一个很好的用例是调用外部API。如果指导模型正确使用API,它可以编写使用该API的代码。可以通过提供API的文档和/或代码示例来指导模型如何使用API。
// 系统消息您可以通过将其置于三个反引号中来编写和执行Python代码。还要注意,您可以访问以下模块来帮助用户发送消息给他们的朋友:\`\`\`python
import message
message.write(to="John", message="嘿,下班后想见面吗?")\`\`\`