欢迎来到《提示工程学习笔记》专栏,我是和你一起学习的Mr.Juice。在这里,我们将一起探索和学习提示工程的奥秘,解锁人工智能领域的新前沿。提示工程,或称 Prompt Engineering,是指在与人工智能模型交互时,设计和优化输入提示(Prompt)的过程,以引导模型生成更精准、更有用的输出。这项技术在自然语言处理、大模型等领域扮演着越来越重要的角色。
在这个专栏中,我们不仅会介绍提示工程的优秀策略,还会分享实用的技巧和案例分析,帮助大家更好地理解和运用这项技术。无论你是人工智能领域的专业人士,还是对大模型充满好奇的初学者,我相信你都能在这里找到有价值的内容。进入正题,我们从OpenAI的官方文档入手,以智谱AI的文档为辅,学习针对OpenAI的提示工程策略,希望对你有所帮助。
OpenAI提示工程
获得更好结果的六种策略
- 写清晰的指令
- 提供参考文本
- 将复杂任务分解为更简单的子任务
- 给模型时间思考
- 使用外部工具
- 系统地测试改动
确实,六个策略已经为我们展示了如何引导模型生成更理想的内容。那么,开发者究竟应该采用哪些技巧来实现这些策略呢?让我们逐一探讨这些技巧的实际应用方法。
策略一:写清晰的指令
技巧一:在查询中包含细节以获得更相关的答案
为了获得精准且高质量的回应,请务必在请求中提供所有重要的细节或上下文。缺乏这些信息可能导致模型只能猜测你的意图。因此,尽量详尽地描述任务细节,以确保准确理解和执行你的需求。来看个例子。
不好的查询 | 好的查询 |
---|---|
编写代码来计算斐波那契序列。 | 编写一个TypeScript函数来有效地计算斐波那契序列。对代码进行自由的注释,解释每一部分的作用以及为什么要这样写。 |
好的例子为左边的查询添加了更多细节,比如使用什么语言,或者利用注释让代码更具有解释性。
技巧二:让模型扮演一个角色
system message可用于指定模型在回复中使用的角色。在系统提示词中指定模型的角色一般用于设定模型的习惯风格。很多智能体工具就是利用这样的策略设计不同的助手。
技巧三:使用分隔符清楚地指示输入的不同部分
"""、XML标记、节标题等分隔符可以帮助划分要区别对待的文本部分。
system | 你将获得两个关于同一主题的文章(用XML标记分隔)。首先总结每篇文章的论点。然后指出他们中哪一个更有说服力,并解释原因。 |
---|---|
user | <article> insert first article here </article> <article> insert second article here </article> |
XML的标记帮助模型更好理解哪些是文章的内容,以及区分两个文章的内容,哪些是对模型的指令。
技巧四:指定完成任务所需的步骤
某些任务最好指定为一系列步骤,明确地写出步骤可以使模型更容易地遵循它们。核心思想有点像思维链,指定模型的步骤来一步一步生成你想要的结果。来看个例子。
system | 使用以下分步说明对用户输入做出响应。步骤1-用户将为您提供三个引号中的文本。用一个前缀写着"总结:"的句子来总结这篇文章。步骤2-将步骤1中的摘要翻译成西班牙语,前缀为Translation:。 |
---|---|
user | """插入需要总结翻译的文本""" |
技巧五:提供例子
提供普适性的指令通常比详尽地列举任务的各种可能性更为高效。然而,在某些场合,提供具体示例可能更为直观。例如,当你希望模型模仿一种难以用言语清晰表述的风格来响应用户查询时,展示几个样例便是一种有效的策略。这种方法被称为"少样本提示",这基于大模型的强大的上下文学习的能力。鉴于OpenAI文档中的例子比较抽象,我们使用智谱AI文档中的例子。
system | 模仿这种风格 |
---|---|
user | ''' 1、三杯鸡在锅中欢跃,是岁月的篝火,是浪漫的乐章。 |
2、炖排骨的滋味,是冬日的棉被,是乡土的回响。 | |
3、红烧勤鱼的鲜香,是海洋的密语,是大海的情书。''' | |
生成新的句子。 |
技巧六:指定输出的期望长度
很好理解。有些要求你可以直接表达在指令中,或许效果会优于代码上的改动。看例子。
user | 用大约50个单词总结由三个引号分隔的文本 |
"""插入需要总结的文本""" |
策略二:提供参考文本
技巧一:知道模型使用参考文本回答
如果我们可以为模型提供与当前查询相关的可信信息,可以指导模型使用所提供的信息来生成答案。这也是大部分rag工作所使用的思想,为模型提供更加可信的知识,可以丰富生成结果,并让内容更加可信。来看例子。
system | 使用提供的由三个引号分隔的文章来回答问题。如果在文章中找不到答案,请写下"我找不到一个答案。" |
---|---|
user | <插入你的文章,文章由三个引号分隔> |
问题:<在此处插入问题> |
如何动态地查询与问题相关的信息,可以参考技巧使用基于嵌入的搜索来实现高效的知识检索。
技巧二:指导模型使用参考文本中的引用进行回答
如果输入已经用相关知识进行了补充,那么可以直接要求模型通过引用所提供文件中的段落来在其答案中添加引文。请注意,然后可以通过所提供文档中的字符串匹配以编程方式验证输出中的引用。相比于上面的技巧,这个技巧一定程度上降低了虚假信息的可能,并且提供了可验证的方式。
system | 您将收到一份由三引号分隔的文档和一个问题。你的任务是只使用提供的文件回答问题,并引用用于回答问题的文件的段落。如果文件中没有包含回答这个问题所需的信息,那么只需写下:"信息不足。"如果提供了问题的答案,则必须用引文进行注释。使用以下格式引用相关段落({"citation":...})。 |
---|---|
user | <插入你的文章,文章由三个引号分隔> |
问题:<在此处插入问题> |
策略三:将复杂的任务拆分为更简单的子任务
技巧一:使用意图分类来识别用户查询的最相关指令
对于处理多种情境的任务,一个有效的技巧是对查询类型进行分类。这种分类方法能够明确识别出处理特定类别任务所需的指令集。通过定义固定类别和硬编码指令,专门针对给定类别中的任务,可以大大提高处理效率。此外,这个过程可以递归地应用于任务分解,将其细化为一系列阶段。这种方法的优势在于,每个查询仅包含执行下一阶段任务所需的指令,与试图通过单个查询完成整个任务相比,这种方法可能降低错误率,并减少成本,因为更长的提示通常意味着更高的运行成本。这种技巧类似于对话系统的操作流程,即在提供最终答案之前,先对用户的任务类型进行分类处理。 看一下例子。
python
System:
You will be provided with customer service queries. Classify each query into a primary category and a secondary category. Provide your output in json format with the keys: primary and secondary.
Primary categories: Billing, Technical Support, Account Management, or General Inquiry.
Billing secondary categories:
- Unsubscribe or upgrade
- Add a payment method
- Explanation for charge
- Dispute a charge
Technical Support secondary categories:
- Troubleshooting
- Device compatibility
- Software updates
Account Management secondary categories:
- Password reset
- Update personal information
- Close account
- Account security
General Inquiry secondary categories:
- Product information
- Pricing
- Feedback
- Speak to a human
User:
I need to get my internet working again.
Assistant:
{
"primary": "Technical Support",
"secondary": "Troubleshooting"
}
技巧二:对于需要很长对话的对话应用程序,总结或过滤以前的对话
鉴于模型受限于固定的上下文长度,用户与助手之间的对话(需全部包含在上下文窗口中)无法无限期延续。针对这一挑战,存在多种解决策略。其中之一涉及对先前对话进行总结。当输入长度达到预设的阈值时,可以触发对对话部分进行总结,而之前对话的总结则可被纳入系统消息之中。此外,还可以在对话后台异步进行整个会话的总结。
另一种策略涉及动态选择对话中与当前查询最相关的部分。可以参考技巧使用基于嵌入的搜索来实现高效的知识检索。
结语
本章我们就先学习这三个策略,如果您有什么建议的话,希望大家能继续给我提出宝贵的意见和建议,帮助我们共同成长。下一章我们将继续学习剩下的三个策略。希望大家多多支持!