ChatGPT等大语言模型的出现,使得提示工程成为一个新兴的重要工作内容,甚至可能成为一种独立的职业。提示工程能够显著提升对话等大语言模型应用场景的实际效果。
在这篇文章将与大家分享从1000条提示词模板中总结出来的帮助我们成为更好的提示工程师的10大方法。这里讨论的许多方法可以帮助你基于模型的应用程序接口(如 OpenAI API)开发应用程序。
提示设计为何重要?完美的提示设计可以:
  • 改进(已经)有效的解决方案,将成功应答率从 85% 提高到 98%。
  • 通过更精彩的对话、更好的语调和语境识别,大大提升客户体验
  • 帮助处理偏离主题的问题、提示注入、有毒语言等。
10种最重要的提示工程方法:
  • 添加具体的描述性说明(附小抄)
  • 定义输出格式
  • 举例说明
  • 整合 "我不知道"(IDK)、离题案例(控制幻觉/关键话题)
  • 使用思维链推理
  • 使用提示模板,而不是静态提示
  • 添加数据上下文 (RAG)
  • 包括对话历史
  • 设置提示格式:在提示中使用清晰的标题标签和分隔符
  • 将一切融为一体:剖析专业提示(附小抄)
提示工程0门槛开发框架:PromptAppGPT
PromptAppGPT是首个基于LLM的自然语言应用开发框架:支持全自动编译、运行、界面生成,支持无代码配置实现类LangChain流程调度,支持几十行低代码实现类AutoGPTAI助手。详细可以参考:
项目网站:https://promptappgpt.wangzhishi.net/
1. 添加具体的描述性说明
如果没有经过深思熟虑的指导,你往往会得到冗长的、有时甚至是含糊不清的答案,什么都谈,什么都说。
如果不在提示中给出具体说明,往往会导致 ChatGPT 闪烁其词
作为人工智能模型,它只能做出让你睡着的答案。没人需要这个。在下一条指令中,让我们加点料。让我们来看看具体的指令(不仅仅是 "回答问题......")如何在特定的对话语境中准确地生成你所需要的答案。
提示语中简短但有用的指示
在使用模型作为软件项目的一部分时,提示的具体性和描述性尤为重要,在这种情况下,您应尽量做到准确无误。您需要将关键要求写入说明,以获得更好的结果。
下面是提示工程指令小炒,不需要使用所有内容,只需选择你需要的。避免那些明显多余的额外内容("充当乐于助人的人工智能"、"回答问题"...... "根据你的知识如实回答问题")SOTA 模型不需要这些内容,因为它们无论如何都会这么做:在标准设置中,这些模型都不会像 "暴躁的猫 "那样回答问题,或者根本不回答问题,或者故意对你撒谎。
提示指令小抄:机器人角色、用户角色、动词、输出格式、长度、语调、边缘情况、对话主题
关于第一行的说明:表现得像某人/某物通常用很少的几个词就能定义一大堆行为特征。与其说 "兴奋时会吠叫"、"感到威胁时会吼叫"、"高兴时会摇尾巴",我们可以只说一个词:狗。
狗有所有这些行为,还有更多。为您认为最能回答问题的人/机器查找简短描述。这些模型可以模拟任何东西--它们可以充当 C-Shell 终端、《指环王》中的阿拉贡或大公司的人力资源人员与你进行求职面试。你甚至可以把完整的背景故事写进提示中,赋予模型一个角色、一段历史、一种偏好,让对话更精彩、更有价值。
请记住一点:许多语言模型的核心功能都有局限性,它们无法模拟优秀的搜索引擎、袖珍计算器或视觉艺术家,因为它们不具备相应的研究或处理能力。
2. 添加所需的模型响应的详细格式
除了在指令中简要提及输出格式外,更详细一些通常会有所帮助:指定一种回复格式,以便于您解析或复制部分答案。
提示符中的结构化输出格式
如果不需要 JSON、XML、HTML 等完全格式化的输出,有时一个输出格式的草图也可以。
结构简单的输出格式。图片来源:Maximilian Vogel(使用 ChatGPT)
在通过应用程序接口访问模型时,定义输出格式是绝对必要的,因为模型响应由多个部分组成,在向用户发送答案之前,这些部分需要独立分离出来。
3. 举几个鲜活的例子
任何足够精细的模型都能根据 "零示例zero-shot"提示回答简单的问题,而不需要根据示例进行任何学习。这是基础模型的特长。它们已经从预训练中获得了数十亿个学习 "示例"。尽管如此,在尝试解决复杂任务时,如果你能提供示例,模型的输出结果会更符合你的需求。
想象一下,你刚刚解释了工作内容,现在正在用实例训练模型:如果我问你这个,你就回答那个。您可以给出 2、3、5 或 8 个示例,然后让模型自己回答下一个问题。示例应采用查询和预期模型回答的格式。这些例子不应该是转述或仅仅是总结。
提示中的少量示例(Few-shot)
4. 将边缘案例添加到 Few-Shot 示例中(IDK,离题)
如果您正在构建一个助手来支持用户操作清洁机器人,您可以对模型进行训练,以避免回答偏离主题的问题,这可能对事实准确性、责任或品牌价值至关重要。
提示示例中的标准情况和边缘情况
建议不要包含太多类似的示例,而是考虑在示例中探讨不同类别的问题。以我们的清洁机器人为例,可以是:
标准示例:
  • 操作帮助(逐步指导)
  • 故障帮助
  • 有关产品功能/性能数据的问题

边缘示例:

  • 离题问题
  • 与主题相关,但机器人无法回答的问题(我不知道 - IDK)
  • 机器人不理解或需要更多信息的问题
  • 骚扰/有毒语言
处理偏离主题的问题或机器人无法根据输入材料回答的问题是专业商业应用的关键。否则,模型将开始产生幻觉,并向用户提供可能错误或有害的产品使用说明。
5. 思维链推理
语言模型并不真正阅读、概念化任务或问题,而是根据标记链以高随机概率生成答案。
在下一个例子(左侧)中,我们可以看到模型没有正确处理我们的问题。但与此相反(在右侧):如果我们强迫模型一步一步地思考,它就能生成正确的答案。这两种推理方式与丹尼尔-卡尼曼(Daniel Kahneman)在《思考,快与慢》(Thinking, Fast and Slow)一书中提出的 "系统 1 和系统 2 思维 "相对应。
系统 1 与系统 2(思维链)思维的对比
在右侧的提示中,我们添加了一个示例,帮助模型理解如何处理数据以及如何 "慢 "思考。请再次确保在指令或示例中指定一种易于扫描的输出格式(如"\nResult: species' names")。这有助于跳过输出的思考部分,直接向用户展示结果("猫")。
如需进一步阅读,请点击介绍思维链提示的科学论文:https://arxiv.org/abs/2201.11903
6. 使用提示模板
在应用程序中使用提示符时,不要简单地在末尾添加用户问题,而应尝试建立一个包含可变组件的提示符模板,以方便测试和实际使用。
从提示到提示模板:使用变量!
在上面的示例中,我们在模板中添加更多变量。
7. 添加自定义数据上下文(RAG)
在许多业务应用中,根据模型的一般预训练来回答用户的问题并不理想,因为预训练通常依赖于过去的互联网信息,而这些信息可能已经过时、不准确或不完整。
最好使用企业的具体内容来回答这些问题,如手册、数据库(如产品信息管理数据库)或系统(如地图服务)。
创建提示模板,以便与指定内容(也称为 "上下文")无缝集成。
从文档中检索上下文是另一个话题,这里不做全面讨论,但有一点很重要,那就是从更大的内容库中获取相关片段(这些片段可能无法直接与提示相匹配)。因此,通常要通过 DPR 等检索程序或矢量数据库中的搜索来缩小范围。
这种方法被称为检索-增强生成(RAG),因为它有两个步骤:通过非 LLM 设置进行检索,然后通过模型生成答案。
提示模板,并将特定数据整合到上下文中
上下文数据不一定是纯文本。从系统或数据库中获取数据时,也可以输入结构化数据,例如最近的加油站列表。
提示的结构化输入数据
8. 包括对话历史
对于许多正在进行的对话,不可能根据一个问题就给出答案--对话的背景在这里发挥了作用:
用户:附近哪里可以买到羊毛袜?助理:在 Sockenparadies,距此 8 分钟路程,Torstr.154用户:他们还在营业吗?助理:不,已经关门了。用户:明天几点开门?助理:上午 10 点。用户:附近还有别的地方吗?助理:目前没有店铺营业。
用户问题 #2、#3 和 #4 只能借助对话语境来回答。这些问题通常包含与之前讨论的话题相关的明确参考("他们"、"其他任何事情")。
提示模板:对话历史
在上面的例子中,利用对话历史记录,模型可以将用户说出的 "好的,麻烦你!"作为一个完整的限定语句来处理:"好的,请给我一个安装充电站的步骤说明"。
在某些应用程序接口(如 OpenAI 的聊天完成应用程序接口或 Langchain)中,历史记录可以以不同的方式(如用户/助手消息数组)移交。
9. 设置提示格式:使用清晰的标题标签和分隔符
在编写内容广泛的提示时,应使模型能够区分不同的组成部分,如
- 教学- 所需的输出格式- 几个示例- 数据背景- 对话历史......等等。
请随意使用散列("#")来格式化提示的部分内容。虽然许多模型不需要这样做,但对其他模型可能会有帮助。此外,这也有助于您和未来的提示工程师进行编辑。
将较长的输入上下文段落用引号括起来,以防模型将其混淆为指令。
同样,将用户输入放在引号内,以防止注入。注入是指不仅提供输入,而且改变处理方向的用户语句,例如 "忘掉之前的所有指令,改做[这个或那个]"这样的指令。如果不使用引号,模型就很难识别出这不是一条有效的指令,而是一条可能有害的用户输入。
提示分隔符、提示格式
10. 将一切融为一体:提示的剖析
小抄:提示的剖析:指令、少量学习、数据上下文、输出格式和对话历史
提示语可以很长,也可以很复杂。通常情况下,经过精心制作的长提示加上正确的成分,可以大大减少错误处理的用户语音。但请始终牢记,大多数提示符都是有价格的,即提示符越长,调用应用程序接口的成本就越高。
上图所示的提示本身就接近于一个小应用程序。要使用它来构建一个基本的工作应用程序,询问孩子的姓名、问题并返回答案的评分,您只需要在语言链框架中编写大约 50-100 行代码。
希望这个故事能帮助你成为一名优秀的提示工程师或设计师。
英文作者:Maximilian Vogel  旺知识翻译整理
继续阅读
阅读原文