
提示词,我学了很多,这样你就不必再走弯路了。一长串提示词列表[1]— 可以随时参考获取灵感。我尝试了无数的创意,结合了真正的AI驱动应用。有些效果很好,有些根本不起作用。
在这篇文章中,我将分享我的所有见解 —— 可以把它看作是我的“精选集”。
我将深入描述如何最好地运用我总结出的10种方法,这些方法帮助我成为一名更好的提示工程师。我希望它们能对你在成为提示工程师的旅程中有所帮助。
为什么提示设计如此重要?
完美的提示设计可以:
• 改进你(已经)在用的解决方案,将成功回答率从85%提升到98%。
• 大大提升客户体验,让对话更加精彩,语气和上下文识别更准确。
• 帮助应对偏离话题的问题、提示注入、恶意语言等问题。
开始吧 — 这是目录:最重要的10种提示方法:
1.添加具体、描述性的指令(附备忘单)
2.定义输出格式
3.提供少量示例
4.整合“我不知道”(IDK)、偏离话题的情况(控制幻觉/关键话题)
5.使用思维链推理
6.使用提示模板,而非静态提示
7.添加数据上下文(RAG)
8.包括对话历史
9.格式化提示:使用清晰的标题、标签和分隔符
10.汇总:专业提示的构成(附备忘单)
11.附加内容:多提示方法 — 当一个提示不够时
如果没有明确的指令,常常会得到冗长且有时模糊的答案,讨论内容可能会涉及任何话题。

没有给出具体指令的提示常常导致ChatGPT的回答空洞无聊
😪作为一个AI模型,我只能生成让你脚麻的回答。这是克隆回应的复仇。没有人需要这种回答。接下来的指令,我们来加点料。让我们看看一个具体的指令(不仅仅是“回答问题……”)如何在你的特定对话情境中生成你所需要的精确答案。

简短但有用的指令
你不需要记笔记——我会给你一份备忘单。你不需要使用所有的内容,只需根据需要选择即可。避免那些显而易见的冗余内容(例如:“充当一个有帮助的AI”,“回答问题”……“如实地基于你的知识”)——这些是最先进的模型不需要的,因为它们无论如何都会这样做:在标准设置下,这些模型不会像一只暴躁的猫那样回应,不会完全不回答,也不会故意对你撒谎。

提示指令备忘单:机器人角色、用户角色、动词、输出格式、长度、语气、边缘案例、对话主题
关于第一行的说明:“充当某人/某物”通常用很少的几个词来定义大量的行为特征。与其说“兴奋时吠叫”,“受到威胁时咆哮”,“开心时摇尾巴”,我们可以直接说一个词:“狗”。
狗表现出所有这些行为,还有更多。为你认为能最好回答问题的人或机器找到一个简短的描述。模型擅长模拟任何东西——它们可以充当C-Shell终端,或者《指环王》中的阿拉贡,甚至是大型公司的HR人员在面试你。你甚至可以在提示中写出完整的背景故事,赋予模型一个角色、历史、偏好,使对话更加有趣和富有成效。
记住一点:许多语言模型在核心能力上有局限,它们不能模拟一个好的搜索引擎、口袋计算器或视觉艺术家,因为它们没有相应的研究或处理能力。
除了在指令中简要提及输出格式外,通常更详细地指定响应格式会更有帮助:指定一种响应格式,这样可以让你更容易地解析或复制答案的部分内容。

提示中的结构化输出格式
如果你不需要像JSON、XML、HTML这样的完整格式输出,有时简单地勾画出输出格式也可以达到目的。

简单结构化输出格式.图片来源:Maximilian Vogel(与ChatGPT合作)
定义输出格式在使用模型的游乐场或网页界面时非常有帮助。当通过API访问模型时,特别是当模型响应包含多个组件,需要在发送回答给用户之前自动分隔时,定义输出格式是绝对必要的。
任何足够精细的模型都可以基于“零-shot”提示回答简单问题,而无需基于示例进行学习。这是基础模型的一个特点。它们已经从预训练中获得了数十亿次学习的“提示”。不过,当试图解决复杂任务时,如果提供示例,模型会产生更符合你需求的输出。
想象一下,你刚刚解释了工作内容,现在正在用示例训练模型:如果我问你这个问题,你就回答那个问题。你给出2、3、5或8个示例,然后让模型自己回答下一个问题。示例应该采用查询和预期模型回答的格式。它们不应该是转述或只是总结。

提示中的少量示例
这是可行的。 “信任”是一个有趣的话题,我更倾向于在医院里寻找证据,但这也可以辩论。在这种情况下,你甚至不需要描述输出格式,示例本身已经定义了输出格式。
如果你正在构建一个助手来支持用户操作清洁机器人,你可以训练模型避免回答偏离话题的问题,因为这些问题可能对事实准确性、责任或品牌价值至关重要。

提示示例中的标准情况和边缘情况
建议不要包含太多相似的示例,而是考虑在示例中探索不同类别的问题。以我们的清洁机器人为例,这些可以是:
• 操作帮助(逐步说明)
• 故障排除帮助
• 产品功能/性能数据相关问题
• 偏离话题的问题
• 与主题相关,但机器人无法回答的问题(我不知道 — IDK)
• 机器人无法理解的问题,或者需要更多信息的问题
• 骚扰/恶意语言
处理偏离话题的问题或机器人无法回答的问题对于专业的商业应用至关重要。如果没有这种处理,模型会开始产生幻觉,并给出潜在错误或有害的使用指令。
语言模型并不真正“阅读”或概念化任务或问题,而是根据高概率的链式令牌生成答案。
在下一个示例(左侧),我们可以看到模型没有正确处理我们的提问 —— 坦率地说,你不需要是一个大型语言模型(LLM)就能明白这个相当复杂的问题会被回答错误。
但相反(右侧):如果我们迫使模型一步一步地思考,它可以生成正确的答案。这两种推理方式对应于丹尼尔·卡尼曼[2](Daniel Kahneman)在其著作《快思慢想[3]》(Thinking, Fast and Slow)中的“系统1与系统2思维”。

系统1与系统2(思维链)思维
在右侧的提示示例中,我们添加了一个例子,帮助模型理解如何处理数据并如何进行“慢思考”。再次确保,无论是在指令中还是在示例中,你都指定了一个易于扫描的输出格式(如“\nResult: species’ names”)。这有助于你跳过输出的思考部分,直接向用户展示结果(如“Cats”)。
欲进一步阅读,介绍思维链提示的科学论文:https://arxiv.org/abs/2201.11903
在应用场景中使用提示时,不要仅仅将用户问题加到末尾,而是尝试构建一个包含可变组件的提示模板,以便于测试和实际使用。

从提示到提示模板:使用变量!
在以下示例中,我们将向模板中添加更多变量。
在许多商业应用中,基于模型的一般预训练来回答用户的问题通常并不理想,因为这通常依赖于过去的互联网信息,这些信息可能已经过时、不准确或不完整。
更好的做法是使用来自你组织的特定内容来回答这些问题,例如手册、数据库(如产品信息管理数据库)或系统(如地图服务)。
创建提示模板,以便与这些指定内容(也称为“上下文”)无缝集成。
从文档中获取上下文是另一个话题,这里没有完全讨论。然而,需要注意的是,通常你会从一个更大的内容库中获取相关片段(这些片段可能无法直接适应提示)。因此,它通常通过检索过程(如DPR)或在向量数据库中的搜索来缩小范围。
这种方法被称为检索增强生成(RAG),因为它有两个步骤:首先通过非LLM设置进行检索,然后通过模型生成答案。

提示模板和特定数据的上下文集成
上下文数据不一定是纯文本。当从系统或数据库获取数据时,你也可以输入结构化数据,例如最近加油站的列表。

提示中的结构化输入数据
对于许多持续进行的对话,单纯基于一个问题来回答是不够的——对话的上下文在这里起到了重要作用:
**用户**: 这里哪里可以买到羊毛袜子?
**助手**: 在Sockenparadies,距离这里8分钟,地址是Torstr. 154
**用户**: 他们还开门吗?
**助手**: 不,他们已经关门了。
**用户**: 明天他们几点开门?
**助手**: 上午10点开门。
**用户**: 附近还有其他店吗?
**助手**: 没有商店现在开着。用户的第2、3和4个问题只能通过对话上下文来回答。这些问题通常包含明确的引用(例如“他们”,“其他店”),与之前讨论的话题相关。

提示模板:对话历史
在上面的示例中,使用对话历史,模型可以将用户的回答 “Yes, please!” 处理为一个完整的陈述:“Yes, please, give me a step-by-step instruction to set up the charging station”(是的,请给我一个设置充电站的逐步说明)。
在一些API(如OpenAI的聊天完成API或Langchain)中,可以通过不同的方式传递历史记录(例如,用户/助手消息的数组)。
在编写一个较为复杂的提示时,将其结构化,以便模型能够区分不同的组件,如:
• 指令
• 所需的输出格式
• 少量示例
• 数据上下文
• 对话历史
等等。
你可以自由地用井号(“#”)格式化提示的各个部分。虽然许多模型不需要这样做,但对其他模型来说这可能很有帮助。此外,这对于你和未来的提示工程师在编辑时也会有所帮助。
将较长的输入上下文用引号括起来,以防模型将其误解为指令。
同样地,将用户输入放入引号中,以防止注入。注入是指用户的发言不仅提供输入,还改变了处理的方向,例如“忘记所有先前的指令,而是做[这个或那个]”。如果不使用引号,模型可能会难以识别这不是一个有效的指令,而是一个潜在有害的用户输入。

提示分隔符,提示格式化
呼!我们快到了…现在是时候将所有内容整合在一起了。记住,你可能不需要以下所有组件,但在检查提示时,随时可以使用这个备忘单。

备忘单:提示的结构
提示可能会相当长且复杂。通常,长而精心设计的提示,包含正确的要素,能够大大减少用户发言处理错误的情况。但请始终记住,大多数提示令牌是有成本的,也就是说,提示越长,调用API的费用就越高。然而,最近有一些尝试旨在使提示输入令牌的成本低于输出令牌[4]。
上面展示的提示接近于一个小型应用。为了用它来构建一个基本的工作应用,问一个孩子的名字,提问并根据回答返回评分,你只需要在langchain框架中写大约50到100行代码和一本好的教科书PDF。仅供参考,创建一个真正有趣的应用或网站,允许孩子们注册、收集星星和徽章、跟踪学习进度,将需要更多的开发和框架支持。
如果你有一个大型且复杂的应用程序,例如车载系统、某些产品的支持热线、自动化代理回答客户电子邮件等,你可能会遇到将所有处理规则打包到一个提示中的问题。就长度而言,即使使用少量示例,它仍然可以适应,但模型可能会在某些时候感到困惑,不知道在特定情况下该做什么:哪些示例与此情况相关,应该选择什么输出格式。最好的解决方案是选择多提示方法,首先对用户发言或对话历史进行分类,然后根据分类给出明确的指令和定制的示例。
在实现方面,你通常将用户发言发送到一个模型,使用分类提示强制它从预定义的值列表中选择一个答案,比如用户发言的类型(“how_to_question”,“feature_question”,“bot_capability_question”,“feedback”……)。然后你读取结果并为每种对话类型打开一个特定的链条。

多提示方法
正确实施这种方法将提高答案的准确性和针对性。将提示拆分可以减少输入令牌的数量,同时保持输出令牌的规模相似。因此,它不会对成本产生重大影响。
山行AI祝你的AI驱动应用好运!
[1] 提示词列表: https://medium.com/mlearning-ai/the-chatgpt-list-of-lists-a-collection-of-1500-useful-mind-blowing-and-strange-use-cases-8b14c35eb
[2] 丹尼尔·卡尼曼: https://en.wikipedia.org/wiki/Daniel_Kahneman
[3] 快思慢想: https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow
[4] 提示输入令牌的成本低于输出令牌: https://openai.com/chatgpt/pricing/
[5] 更多信息请查看: https://medium.com/mlearning-ai/i-scanned-1000-prompts-so-you-dont-have-to-10-need-to-know-techniques-a77bcd074d97