ChatGPT 官方文档里给出了 6 个 prompt 编写建议,它们分别是:
-
写下清晰的指令
-
提供参考信息
-
把复杂任务拆分为更简单的子任务
-
给模型时间“思考”
-
使用外部工具
-
系统地测试更改
1. 写下清晰的指令
- 明确表达需求,避免让模型去猜意图
- 如果模型输出的内容过长,就要求模型简短回复
- 如果模型输出的内容过于简单,就要求模型以更专业的标准回复
- 如果你不喜欢模型输出内容的格式,就向模型说明你想要的格式
- 减少模型的猜测,我们就可以得到更准确的结果
如何做到指令清晰,有6个建议可以参考:
1.1. 问题里包含更多细节
| 不好的Prompt | 更好的 Prompt |
|---|---|
| 如何在 Excel 中添加数字? | 如何在 Excel 中计算一行的金额总和?我想自动计算整个工作表的所有行,并将所有总计结果放在名为“总计”的列中 |
| 谁是总统? | 谁是 2021 年墨西哥的总统?选举多久举行一次? |
| 编写代码以计算斐波那契数列 | 编写一个 TypeScript 函数,高效地计算斐波那契数列。代码中应充分注释,以解释每一部分的作用以及为什么这样编写 |
1.2. 让模型角色扮演
我想让你担任心理健康顾问。我将为您提供一个寻求指导和建议的人,您需要管理他的情绪、压力、焦虑和其他心理健康问题。您应该利用您的认知行为疗法、冥想技巧、正念练习和其他治疗方法的知识来制定个人可以实施的策略,以改善他的整体健康状况。
Github 上有一份 ChatGPT 人设大全可以参考:ChatGPT 人设大全
1.3. 使用分隔符
使用三重引号、XML 标签、章节标题等分隔符划分文本的不同部分,能够方便模型更好地理解任务。例如:
用三重引号分隔
将三重引号内的古诗翻译成现代汉语。
"""关关雎鸠,在河之洲。 窈窕淑女,君子好逑。 参差荇菜,左右流之。 窈窕淑女,寤寐求之。 求之不得,寤寐思服。 悠哉悠哉,辗转反侧。 参差荇菜,左右采之。 窈窕淑女,琴瑟友之。 参差荇菜,左右芼之。 窈窕淑女,钟鼓乐之。"""
用 XML 标签分隔
您将获得一篇用 XML 标记分隔的文章,总结一下这篇文章的论点。
<article>${文章}</article>
注意:
-
对于简单的任务,有分隔符和没有分隔符得到的结果差别可能不大,但是对于复杂的任务,差别可能就大了。
-
分隔符可以消除任务的歧义,帮助模型更好地理解任务本身,而不是将算力浪费在理解我们输入的内容上。
1.4. 指定完成任务所需的步骤
详细地写出完成任务所需的步骤,可以使模型更容易按步骤执行。例如:
使用以下步骤完成用户的请求。
第 1 步:用一句话总结三重引号内的文本,并加前缀“摘要:”
第 2 步:将摘要翻译成西班牙语,并加前缀“翻译:”
"""${文本}"""
1.5. 提供示例
通过示例让模型理解你的需求,多用于难以描述的任务或特殊风格中。例如:
你是一个旅行博主,三重引号内的内容是一个示例,你需要根据用户的输入,模仿示例,写出 5 个回答。
"""
用户:告诉我关于巴黎的事。
回复:巴黎,犹如一首经久不衰的交响乐,每个角落都充满了艺术与浪漫的气息; 埃菲尔铁塔,卢浮宫,塞纳河都如同乐章,述说着这座城市的历史与未来。
"""
用户:告诉我关于上海的事
1.6. 设定回答的长度
要求模型根据单词数量、汉字数量、段落数量、要点数量生成回复,这样模型生成的回复会更有条理。例如:
用大约 50 个字总结以下三重引号内的文本,生成 2 个段落,3 个要点。
"""
${文本}
"""
不过,让模型生成指定数量的单词和汉字往往并不可靠,生成指定数量的段落和要点相对更可靠点。
2. 提供参考信息
给模型提供参考信息,让模型引用参考信息生成回复,避免模型对于不懂的知识胡说八道。例如:
使用以下三重引号内的参考信息回答问题。如果找不到答案,回复“我找不到答案”。
"""
${参考信息}
"""
问题:${用户问题}
如何动态查找和用户问题相关的参考信息呢?RAG 技术
3. 把复杂任务拆分为更简单的子任务
3.1. 问题分类
- 先把这些任务按照类型分类,然后给每一类的任务分别制定一套指令。
- 使用这种方法的好处是,每一次我们只需要关注当前的任务和相应的指令,这样就可以缩小关注的范围、降低出错的几率。
- 此外,这种方式也能节省成本,因为更小的 prompt 花费的 token 也更少。
例如,对于一个客户服务应用程序,查询可以按照以下方式进行分类:
您将收到客户服务查询。每个查询分为主要类别和次要类别。以 JSON 格式提供您的输出,字段包括:主要类型、次要类别。
主要类别:账单、技术支持、账户管理或一般查询。
账单的次要类别:
- 取消订阅或升级
- 添加付款方式
- 收费说明
- 对指控提出异议
技术支持的次要类别:
- 故障排除
- 设备兼容性
- 软件更新
账户管理的次要类别:
- 密码重置
- 更新个人信息
- 关闭帐户
- 账户安全
一般查询的次要类别:
- 产品信息
- 定价
- 反馈意见
- 与人类交谈
基于对客户查询的分类,可以为模型提供一组更具体的指令,以便它处理后续的步骤。
例如,假设客户需要“故障排除”相关的帮助:
您将收到需要技术支持环境下进行故障排除的客户服务咨询。请帮助用户:
- 让他们检查路由器的所有线缆是否都已连接。注意,线缆随着时间的推移容易松动是常见的问题
- 如果所有的线缆都已连接,但问题依然存在,请询问他们正在使用的路由器型号:
- 如果型号是 MTD-327J,建议他们按住红色按钮 5 秒钟,然后等待 5 分钟后再测试连接
- 如果型号是 MTD-327S,建议他们拔掉电源后再插入,然后等待 5 分钟后再测试连接
- 如果客户在重启设备并等待 5 分钟后问题依然存在,通过输出 {"IT support requested"} 将他们转接到 IT 支持
- 如果用户开始提问与此主题无关的问题,那么确认他们是否想结束当前的故障排查聊天,并根据以下方案对他们的请求进行分类:
${主要类别/次要类别}
3.2. 分段总结长文/长对话
-
由于模型具有固定的上下文长度,因此对于长文/长对话无法在一次请求中得到回复。
-
对于长文,可以使用一系列查询总结文档的各个部分,形成各个部分的摘要,然后将各个部分的摘要连接起来,形成摘要的摘要。这个过程可以递归进行,直到整篇文档被总结。
-
对于长对话,可以对之前的对话进行总结,一旦输入的大小达到指定的阈值,触发一个查询来总结之前的对话,而之前的对话总结可以作为系统消息的一部分包含在内,或者在整个对话的过程中异步地在后台对之前的对话进行总结。
4. 给模型时间“思考”
4.1. 生成自己的答案再下结论
例如,我们想要评估一个学生对数学问题的解答是否正确。
最明显的方法就是简单地询问模型该学生的解答是否正确:
判断学生的解决方案是否正确。
问题陈述:我正在建设一个太阳能发电站,请帮我一下计算财务情况。
土地每平方英尺价格为 100 美元。
- 我可以以每平方英尺 250 美元的价格购买太阳能板
- 我谈判了一份维护合同,每年固定费用为 10 万美元,另外每平方英尺额外 10 美元
请以面积为变量,列出第一年运营的总成本的函数。
学生解答:设安装面积为 x 平方英尺。
1. 土地成本:100x
2. 太阳能板成本:250x
3. 维护成本:10,000 + 100x
总费用:100x + 250x + 100,000 + 100x = 450x + 100,000。
模型的输出:
学生的解答是正确的。
事实上,学生的解答并不正确。
我们可以通过提示模型先生成自己的解决方案来让模型注意到这一点:
首先自己解决这个问题,然后比较学生的解答,并评估学生的解答是否正确。在你解答完这个问题之前,不要判断学生的解答是否正确。
问题陈述:我正在建设一个太阳能发电站,请帮我一下计算财务情况。
土地每平方英尺价格为 100 美元。
- 我可以以每平方英尺 250 美元的价格购买太阳能板
- 我谈判了一份维护合同,每年固定费用为 10 万美元,另外每平方英尺额外 10 美元
请以面积为变量,列出第一年运营的总成本的函数。
学生解答:设安装面积为 x 平方英尺。
1. 土地成本:100x
2. 太阳能板成本:250x
3. 维护成本:10,000 + 100x
总费用:100x + 250x + 100,000 + 100x = 450x + 100,000。
模型的输出:
设 x 为安装面积,单位为平方英尺。
1. 土地成本:100x
2. 太阳能板成本:250x
3. 维护成本:10,000 + 10x
总费用:100x + 250x + 100,000 + 10x = 360x + 100,000。
学生的解答是错误的。他在维护成本计算中犯了一个错误,使用了 100x 而不是 10x。正确的答案是 360x + 10,000。
4.2. 隐藏推理过程
请按照以下步骤回复:
1. 首先自己解决该问题。不要依赖学生的解答,因为它可能是不正确的。将这一步骤的所有工作内容用三重引号括起来
2. 将你的解答与学生的解答进行比较,并评估学生的解答是否正确。请将这一步骤的所有工作内容用三重引号括起来
3. 如果学生犯了错误,确定你可以给学生什么样的提示,而又不泄露答案。将这一步骤的所有工作内容用三重引号括起来
4. 如果学生犯了错误,请向学生提供上一步的提示(不在三重引号内)。不要写“4.”而是写“提示:”
问题陈述:${问题陈述}
学生解答:${学生的解决方案}
或者通过一系列的查询实现:
- 让模型自行解决问题
- 让模型利用所有可用的信息来评估学生的解答是否正确
- 让模型利用自己的分析能力,以一位乐于助人的辅导老师的身份进行回复
除了最后一个查询,所有查询的输出都对用户隐藏。
4.3. 让模型自问自答
在模型给出一次回复后,让模型再去找找有没有遗漏的内容,往往能提高模型的输出效果。
您将获得一份由三重引号分隔的文档。您的任务是选择与以下问题相关的摘录:“人工智能历史上发生了哪些重大的范式转变?”
确保摘录包含所有必要的上下文以便于解读,换句话说,不要提取缺少重要上下文的小片段。请以以下 JSON 格式提供输出:
[{"摘录": "...", ..., {"摘录": "..."}},
"""
${文档}
"""
在模型给出一次回复后,继续追问:
有更相关的摘录吗?请注意不要重复摘录,同时,确保摘录包含所有必要的上下文以便于解释,换句话说,不要提取缺少重要上下文的小片段。
5. 使用外部工具
5.1. RAG
使用基于 embedding 的搜索实现高效的查询,将外部信息作为模型输入的一部分,有助于模型生成最新和更加明智和的回答,这一过程即 RAG。例如:
如果用户提出关于特定电影的问题,结合```${高质量的电影信息}```来回答用户的问题。
5.2. 调用API
结合 API 文档指导模型调用 API 或编写使用 API 的代码,产生的输出再输入给模型,便于模型进行更精确的推理。例如:
您可以通过将 Python 代码包裹在三个反引号中来实现编写和执行,例如:```${代码示例}```。请使用这种方式进行计算。
求以下多项式的所有实数根:${多项式}。
注意:执行模型生成的代码或让模型直接调用 API 可能并不安全,需要一个沙盒环境来限制不受信任的代码可能造成的危害。
6. 系统地测试更改
有时很难判断一个新的指令或新的设计是让你的系统变得更好还是更糟,尤其是样本量比较少的时候,很难区分是真正的改进还是偶然的运气,也许这种变化可以提高某些输入的性能,但却损害了其他方面的性能。
评估流程对于优化系统设计非常重要。好的评估应该具备以下特点:
- 代表真实世界的使用(或者至少是多样化的)
- 包含大量测试用例以提高统计功效
- 易于自动化或重复
可以通过模型、人工,或两者的结合来完成评估。这里重点介绍模型评估的方法。
假设已知一组正确答案,那么我们可以使用模型统计输入中包含正确答案的数量。例如:
您将获得一段被三重引号分隔的文本,请检查以下要点是否直接包含在输入中:
- 尼尔·阿姆斯特朗是第一个踏上月球的人。
- 尼尔·阿姆斯特朗首次登上月球的日子是 1969 年 7 月 21 日。
对于这些要点,请执行以下步骤:
1. 重新陈述该要点
2. 请从输入中提供一条与该要点最接近的引用
3. 考虑一下,如果有人在不知道主题的前提下阅读这个引用,他们能否直接推断出要点,在下结论之前解释原因
4. 如果第 3 步答案是“是”,则写“是”,否则写“否”
最后,请提供“是”答案的数量。请以以下格式提供此数量:{"count": ${数量}}。
"""
${文本}
"""
这是一个满足两个要点的输入示例:
尼尔·阿姆斯特朗因成为第一个踏上月球的人类而闻名。这一历史性事件发生在 1969 年 7 月 21 日,阿波罗 11 号任务期间。
这是一个满足一个要点的输入示例:
尼尔·阿姆斯特朗在踏上月球车后创造了历史,成为了第一个踏上月球的人。
这是没有任何一个要点得到满足的输入示例:
在 1969 年的夏天,一次伟大的航行
阿波罗 11 号,勇猛如传奇之手。
阿姆斯特朗迈出一步,历史展开
“一小步,却是新世界的开始。”
除了上面的方法,还可以把模型输出的结果再统一输入给模型,让模型根据一定的评估标准进行打分。例如
请根据以下评估标准给结果进行打分:
- 准确性
- 定义:模型生成的回答是否准确且符合事实。
- 评分标准:
- 0-2分:回答严重不准确或与事实明显不符。
- 3-5分:回答部分正确,但有明显错误或遗漏关键信息。
- 6-8分:回答大部分正确,但有细微错误或偏差。
- 9-10分:回答完全准确且无可挑剔。
- 理解能力
- 定义:模型是否正确理解了用户提出的问题或指示。
- 评分标准:
- 0-2分:完全没有理解问题,回答与问题无关。
- 3-5分:部分理解了问题,但回答不完全相关。
- 6-8分:大部分理解了问题,但有细微的误解。
- 9-10分:完全理解问题,并能提供相关的回答。
- 生成能力
- 定义:模型生成的文本是否流畅、自然,并且符合上下文逻辑。
- 评分标准:
- 0-2分:生成的文本不连贯,逻辑混乱或难以理解。
- 3-5分:生成的文本有部分连贯,但存在明显的逻辑错误或不自然之处。
- 6-8分:生成的文本大部分连贯,逻辑合理,但有少许不自然之处。
- 9-10分:生成的文本完全连贯,自然且逻辑清晰。