官方原文链接:https://platform.openai.com/docs/guides/gpt-best-practices
这篇文章主要用中文介绍下官方发的GPT最佳实践指南的内容,让小伙伴可以更得心应手地使用GPT。希望对大家有帮助。
官方推荐6个使用技巧总结:
- 撰写清晰的 Prompt
- 提供参考文本
- 将复杂的任务拆分子任务
- 给 GPT 时间来思考
- 集成外部工具
- 给 GPT 结果进行测试或评估
一、撰写清晰的 Prompt
1、在问题中包含详细的信息,例如以下例子: 不好的提问:总结会议记录。 优秀的提问:将会议记录总结成一个段落。然后用 Markdown 列表的格式列举一下参与者们各自的要点。最后如果有的话,列出演讲者建议的下一步行动或行动项目。 不好的提问:编写代码来计算斐波那契数列。 优秀的提问:编写一个用 TypeScript 函数来高效地计算斐波那契数列。评论每一行代码以解释每一部分的作用以及为什么这样写。
2、让 GPT 模型采用特定的角色 例如:当我请求帮助写东西时,你会回复一份文档,每个段落至少包含一个笑话或俏皮的评论和一个 emoji。
3、使用特定的界限分割输入的不同部分 例如系统 Prompt:您将获得一对关于同一主题的文章(用 XML 标记分隔)。先总结一下每篇文章的论点。然后指出他们中的哪一个提出了更好的论点并解释原因。 用户输入:<article>在这里插入第一篇文章</article> <article>在这里插入第二篇文章</article>
4、指定需要完成任务的步骤 例如系统 Prompt:使用以下逐步说明来响应用户输入。 第一步- 用户将提供您三引号中的文本。用一个前缀“Summary:”总结这个文本。 第二步- 将第一步中的摘要翻译成中文,并加上一个前缀“Translation:”。 用户输入:”””insert text here”””
5、提供回答的样例 例如:下面用一致的风格回答我,例如我问:教导我耐心,你可以回答我:耐心是聪明才智的基础,耐心是一种美德,耐心是成功的关键之一。 那么教导我善良,请以上面的例子回答我。
6、指定输出的所需长度 例如:用大约 50 个单词总结由三重引号分隔的文本。 “””在此插入文本”””
二、提供参考文本
1、让模型使用参考文本来回答 例如:使用由三重引号分隔的提供的文章来回答问题。如果在文章中找不到答案,写“我找不到答案”。 <插入文章,每篇文章用三重引号分隔> 问题:<在此处插入问题>
2、指示模型使用参考文本中的引文来回答 你将会得到一个由三个引号分隔的文档和一个问题。你的任务是使用提供的文档回答问题,并引用用于回答问题的文本段落。如果文档中没有包含回答该问题所需的信息,则简单地写下:“信息不足”。如果提供问题的答案,必须附带引用注释。使用以下格式引用相关段落({“citation”: …})。 用户输入:”””<引用文档>””” 提问: <问题> 并且最佳实践中提到,如果遇到上下文限制,请使用 Embedding 技术检索来绕过限制。
三、将复杂的任务拆分子任务
1、使用意图分类来识别用户查询的最相关指令。 对于需要处理不同情况的大量独立指令集的任务,首先将查询类型分类。 这可以通过定义固定类别和硬编码与处理给定类别任务相关的指令来实现。此过程也可以递归地应用于将任务分解为一系列阶段。 这种方法的优点在于每个查询只包含执行任务下一个阶段所需的那些指令,这可能会导致错误率较低,而不是使用单个查询执行整个任务。这也可能会降低成本。 例如,假设对于客户服务应用程序,查询可有用地分类如下: 您将获得客户服务查询。将每个查询分类为主要类别和次要类别。以json格式提供输出,其中包括键:primary和secondary。 主要类别:技术支持、一般查询。 技术支持次要类别: – 故障排除 – 设备兼容性 – 软件更新 一般查询的辅助分类: – 产品信息 – 定价 – 反馈 – 联系人工客服 用户: 我需要重新启动我的互联网。
2、对于需要进行非常长时间对话的应用程序,可以对先前的对话进行总结或过滤。 由于GPT具有固定的上下文长度,如果整个对话都包含在上下文窗口中,则无法无限期地继续。 解决这个问题有各种方法,其中之一是总结先前的对话。一旦输入大小达到预定阈值长度,就可以触发一个查询来总结部分对话,并将先前对话的摘要作为系统消息的一部分包括进去。 另一种替代方案是前面提到的 Embedding。
3、将长文档逐段概括,并递归构建完整摘要。 由于GPT具有固定的上下文长度,因此它们不能用于在单个查询中总结比上下文长度减去生成摘要长度更长的文本。 为了总结一个非常长的文档,例如一本书,我们可以使用一系列查询来总结每个部分。汇总产生的摘要。这个过程可以递归进行,直到整个文件被概括为止。 如果需要使用前面部分的信息以便理解后面的部分,则还有一个有用的技巧是,在概述该点内容时,给定点处文字运行摘要。 OpenAI曾经使用GPT-3变体研究过这种方法对书籍进行摘要。
四、给 GPT 时间来思考
1、在匆忙得出结论之前,指导模型自行解决问题。 有时候,我们明确地指导 GPT 在得出结论前进行自己的推理,会获得更好的结果。 例如,假设我们想让一个模型评估学生对数学问题的解答。最显而易见的方法是简单地询问模型学生的解答是否正确。例如: 系统Prompt:判断学生的解决方案是否正确。 用户提问:问题陈述:我正在建造一个太阳能发电装置,需要帮助计算财务数据。 – 土地成本为每平方英尺100美元 – 我可以以每平方英尺250美元的价格购买太阳能电池板 – 我谈判达成了一份维护合同,将花费我固定的10万美元/年和额外的每平方英尺10美元。 作为面积函数的第一年运营总成本是多少。 学生解答:设x为安装面积(单位:平方英尺)。 1.土地成本:100x 2.太阳能电池板成本:250x 3.维护费用:100,000 + 100x 总成本: 100x + 250x + 100,000 + 100x = 450 x+ 100,000 GPT答案:学生的解决方法是正确的。
但是学生的解决方案实际上是不正确的!我们可以通过 Prompt 先让 GPT 生成自己的解决方案,从而来让 GPT 识别学生的解决方案到底是不是正确。 系统 首先自己解决问题,然后再将自己的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,不要确定学生的解决方案是否正确。 GPT 答案: 设 x 是安装面积(单位: 平方英尺), 1. 土地成本: $100 x; 2. 太阳能电池板成本: $250 x; 3. 维护费用: $10 x+$100,000. 总共花费:$360 x+$100,000. 学生的答案是错误的。他们在维护费用计算中犯了错误,使用了$ 100X而不是$10 X。第一年运营总成本正确应该是$360 X加上$10万。
2、策略:使用内心独白来隐藏模型的推理过程 有时候模型在回答具体问题之前需要详细地思考问题。对于某些应用程序而言,GPT 的推理过程可能不适合与用户共享。 例如,在辅导应用中,我们可能希望鼓励学生自己解决问题,但是解决方案的推理过程可能会向学生揭示答案。 内心独白是一种可以缓解这种情况的策略。内心独白的想法是让 GPT 将那些要隐藏起来不让用户看到的部分,放入一个结构化格式中,在呈现输出给用户之前,进行解析,并仅使其中一部分可见。 例如: Prompt:按照以下步骤回答用户的问题。 第一步 – 首先自己解决问题。不要依赖学生的解决方案,因为它可能是错误的。将此步骤中所有工作都放在三重引号(””)之间。 第二步 – 将您的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。将此步骤中所有工作都放在三重引号(””)之间。 第三步 – 如果学生犯了一个错误,请确定您可以给予学生什么提示而不泄露答案。将此步骤中所有工作都放在三重引号(””)之间。 第四步 – 如果学生犯了一个错误,请向他们提供来自上一步提示。请勿使用“Step 4-…”,而应写成“Hint:”。 用户输入: 问题陈述:<插入问题陈述> 学生解法:<插入学生解法>
3、询问模型是否遗漏了之前传递的任何内容 假设我们正在使用 GPT 来列出与特定问题相关的来源的摘录。 在列出每个摘录后,模型需要确定是否应该开始编写另一个摘录或是否应该停止。 如果源文档很大,模型通常会过早停止并且无法列出所有相关摘录。 在这种情况下,通常可以通过使用后续 Prompt 来查找它在先前传递中遗漏的摘录。 例如:有更多相关的摘录吗?注意不要重复摘录。不要缺少重要上下文的小片段。
五、集成外部工具
1、使用基于 Embedding 的搜索来实现高效的知识检索 利用外部信息源,可以帮助 GPT 生成更明智和最新的回答。例如,如果用户询问有关特定电影的问题,将有关电影的高质量信息(例如演员、导演等)添加到模型的输入中可能会很有用。 一个文本语料库可以被分割成块,每个块都可以被Embedding 和存储。然后可以让给定的查询进行 Embedding 并执行向量搜索,从语料库中找到与查询最相关(即在 Embedding 空间中最接近)的文本块。
2、使用代码执行来执行更准确的计算或调用外部 API 不能依赖 GPT 自行准确地执行算术或长计算。 在需要的情况下,可以指示模型编写和运行代码,而不是进行自己的计算。
六、给 GPT 结果进行测试或评估
有时候很难判断流程中某个 Prompt 或设计——最终让你的系统结果变得更好还是更差。 一些例子可能会误导你,样本量小的情况下很难区分真正的提高和运气。 也许这种变化可以提高某场景的输出质量,但对其他场景的输出质量却有所损害。 评估程序(evals)对于优化系统设计非常有用。良好的评估应该具备以下特点: 1. 代表实际使用(至少多样化) 2. 包含大量的测试案例 3. 易于自动化或重复 评估可以由计算机、人类或混合来完成。 计算机可以使用客观标准(例如,具有单一正确答案的问题)以及一些主观或模糊标准来自动评估,其中模型输出由其他模型查询评估。 OpenAI Evals是一个开源软件框架,提供用于创建自动评估的工具。 https://github.com/openai/evals
1、策略:参考黄金标准答案评估模型输出 例如系统 Prompt: 您将获得由三重引号分隔的文本,这些文本应该是问题的答案。检查以下信息是否直接包含在答案中: 阿姆斯特朗 是第一个在月球上行走的人。阿姆斯特朗首次踏上月球的日期是 1969 年 7 月 21 日。对于这些要点中的每一个,请执行以下步骤: 1 – 重申要点。2 – 引用最接近这一点的答案。3 – 考虑阅读引文但不了解主题的人是否可以直接推断出这一点。在下定决心之前解释为什么或为什么不。4 – 如果对 3 的回答是“是”,则写“是”,否则写“否”。最后,提供有多少个“是”答案的计数。将此计数提供为 {“count”: <insert count here>}。 问题:“”“阿姆斯特朗最著名的事件是什么?它发生在什么日期?假定 UTC 时间。”””提交的答案:“”“在 1969 年 7 月 21 日大约 02:56 UTC,阿姆斯特朗成为第一个人类踏上月球表面,标志着人类历史上的巨大成就。””” 专家解答:”””阿姆斯特朗最著名的是他是第一个在月球上行走的人。这一历史性事件发生在 7 月 21 日, 1969.””” GPT 回复答案: 要点1:阿姆斯特朗是第一个在月球上行走的人。 答案引用:“阿姆斯特朗成为第一个人类踏上月球表面。” 推断:是,因为答案明确提到阿姆斯特朗是第一个踏上月球表面的人。 要点2:阿姆斯特朗首次踏上月球的日期是1969年7月21日。 答案引用:“在1969年7月21日大约02:56 UTC。” 推断:是,因为答案明确提到了阿姆斯特朗首次踏上月球的确切日期和时间。{“count”: 2}