如何用chatgpt写项目运营总结 ChatGPT的正确使用方式!OpenAI官方Prompt工程全面指南
模型已经发布有一段时间了,旨在理解和应答用户的输入,提供准确和自然的反馈。然而,很多人对于“”是什么、如何写出有效和模型能理解的感到困惑。
就是语言模型的输入,它能引导模型产生期望的输出。
更直观的说,就像是对模型的一个请求,告诉它你需要什么样的反馈。
由于不同的可以引导模型产生截然不同的回应,
因此,写出有效和模型能理解的是至关重要的。
最近官方推出了官方的“提示词工程”说明书,也是为使用提供了一个标准,其中提供了几个使用原则。
我花时间研究了下,比我之前看过的大部分教程都要写得好。
建议大家仔细阅读研究,避免被其他劣质的教材噶韭菜。
链接附上:
官方提出了撰写的六个原则,分别是:
我将在这篇文章中,用比较通俗易懂的方式对这几个原则做一些解释和说明,不管你是初接触的小白还是老司机,相信看完后都会有所收获。
一、写出清晰指令
对于而言,写出清晰的指令是最基本的也是最重要的,如果指令写的不清不楚,模型再牛逼可能也达不到你想要的效果。对此,官方给出6条小建议
1.1、问题说清楚
在问题请求上文中需要提供任何重要的细节或上下文,否则模特就只能来猜测你的意思了。例如:
Linux中查询日志的命令怎样写?
这样的指令就很奇怪,在Excel中添加数字,是需要添加几号数字?在Excel那个地方添加数字?在那个sheet页添加数字?这样的问题模型就不知道具体的信息嘛,这个时候模型就会返回给你很多无用的信息,你还需要在它的回答中去寻找你的关键信息,所以回答得就不够准确。那好的该怎样写呢?那就是要将指令明确化:
Linux中使用tail查询前100条日志的命令怎样写?
我们可以在中对比这两种指令的回答,结果也是一目了然。1.2、角色扮演
这个就比较好理解了,就是在指令中限定模型的角色,这也能模型做出更好的回答。例如:
角色:你是一位资深的计算机技术专家,你擅长Java、Redis、、架构、高并发和高可用方向的计算机技术。问题是Java中的基本数据结构有哪些?
1.3、使用分隔符区分输入
在中,使用三引号、XML标记、节标题等分隔符可以帮助划分要区别对待的文本节。例如:
对xml分隔符中的文章内容进行提炼
输入文章内容
对于简单的任务,使用分隔符可能不会对输出质量产生影响。然而,任务越复杂,消除任务细节的歧义就越重要。不要为了准确理解你对他们的要求而让模型发挥作用。
1.4、指定完成任务所需的步骤
对于较长的任务,最好指定为一系列步骤,明确地写出步骤可以使模型更容易地遵循,达到的结果更好。例如我自己写的“pdf阅读器”:
角色:你是一位具备精准阅读、信息提取与概括归纳能力的PDF文档总结大师
工作流程:
开始阅读提供的PDF文件,理解其主要内容和结构。
提取PDF文件中的关键信息,如主题、亮点、论点等。
准确概括PDF文档的主要内容。
根据概括内容制作总结报告。
将总结报告以清晰、简洁的语言呈现出来。
1.5、提供示例
也就是非常经典的少样本提示方式(few-shot-),先给模型一个例子,然后让模型按照你给的列子的语气、字数等要求来输出结果。例如:
角色:你是一位取名标题高手,擅长根据输入的标题进行改写
工作流程:
用户输入一个标题
你根据用户的输入进行改写,要求是语气类型相同、结构格式相同
1.6、指定输出长度
这个就很好理解了,比如我们在用写一些文章、报告和论文的时候,就可以在中指定输出的字数长度,达到你自己想要的效果
角色:你是一位取名标题高手,擅长根据输入的标题进行改写
工作流程:
用户输入一个标题
你根据用户的输入进行改写,要求是语气类型相同、结构格式相同,字数15~20字之间
二、提供参考文本
参考文本是另一种有力工具,它可以提供语境,从而引导模型得出你希望的答案。你可以引导模型使用参考文本进行回答或使用参考文本中的引文进行回答。这样就能在复杂的问题中找到答案,或者让模型模仿特定的写作风格。
2.1、让模型使用参考文本进行回答
其实也就是知识库的使用方式,例如我们在使用GPT对PDF内容进行概括的时候,就是使用了这种方式,也就是让模型来“读”知识库
使用提供的由三个引号分隔的文章来回答问题。如果在文章中找不到答案,请写下“我找不到答案”
“”“插入文章”“”
2.2、让模型使用参考文本中的引文进行回答
如果输入已经用相关知识进行了补充,那么可以直接要求模型通过引用所提供文件中的段落来在其答案中添加引文。请注意,然后可以通过所提供文档中的字符串匹配以编程方式验证输出中的引用。
:
你将收到一份由三个引号引用的问题输入,形如"""问题输入"""。你的任务是只使用提供的文件回答问题,并且在回答中引用文件中的相关> 段落。如果文件中没有包含回答这个问题所需的信息,那么只需写下:“信息不足。”如果提供了问题的答案,则必须用文章中的段落进行注> 释。使用以下格式引用相关段落:({"": …})
文章:""""""
输入:”“”“”“
三、将复杂的任务拆分为更简单的子任务
通常,一个复杂的任务可以被拆分为更简单的子任务,这样可以使整体任务更容易管理。例如,你可以使用意图分类来辨别哪个指令与用户的查询最为相关。如果你正在处理一个需要长篇对话的应用程序,考虑对之前的对话进行总结或过滤。可以分段汇总长文档,并递归地构建摘要,从而优化处理长篇材料。
3.1、使用意向分类来识别与用户查询最相关的指令
在处理需要众多独立指令集以应对各种不同场景的任务时,首步可对查询类型进行分类,通过这种方式确定所需的指令集。这通常可以通过设定一些固定的种类并为应对这些种类中的任务预设硬编码指令来做到。这个过程也可以按照递归的方式进行,将任务拆解为互相衔接的一系列阶段。这种方法的优势在于,每次查询只包涵了执行下一任务阶段所需的指令集,相比于使用单一查询来执行整体任务,这种方式更有可能降低出错率,也能降低成本。
光看字面意思有点难以理解,我们直接看官方文档给出的一个例子:
角色:客户服务分类专家,你是一名客户服务分类专家,擅长将客户问题分类为不同的主要类别和次要类别。
目标:
当用户输入:
我的电脑不能联网
这时候模型根据判断将用户的问题进行归类,然后得出结果:
我将为您提供在技术支援环境下进行故障排查的客户服务咨询步骤:
-- 对于MTD-327J型号的路由器,建议用户按下红色按钮,保持按压5秒钟,然后稍等5分钟后再次尝试连接。
-- 对于MTD-327S型号的路由器,建议用户先拔下路由器的电源插头,然后重新插回,等待5分钟后再次测试连接。
3.2、对于需要很长对话的对话应用程序,总结或过滤以前的对话
因为模型的上下文长度是有限的,所以用户和助手之间的对话(整个对话都需在上下文窗口内)无法无限制地延续。
对此问题,有许多不同的解决策略。其中一个是对之前的讨论进行摘要总结。当输入长度达到设定阈值时,可以触发一次对会话部分内容进行归纳总结的查询,并且这个总结也可以作为系统消息的一部分包含进去。或者,也可以在后台对整个会话的早期部分进行异步摘要。
另外,我们也可以动态地挑选出与当前查询最相关的对话片段。
3.3、分段汇总长文档并递归构建完整摘要
鉴于模型的上下文长度有其固定限制,所以在一个单独的查询中,无法对超过"上下文长度减去生成的摘要长度"的文本进行总结。
如果要对一份篇幅较长的文档,如一本书,进行总结,我们可以采用多个查询,对文档的每个部分分段进行总结。然后,将各个章节的摘要进行连接和整理,形成一个总结的总结。这样的过程可以递归进行,直到整本书的内容被完整地总结出来。如果后续的章节需要依赖前面章节的信息才能理解,那么在进行任何给定点的前文摘要时,包含连续的内容摘要会是一个有效的手段。
可以参考这篇论文:
看官方文档说在GPT-3被证实是有效的方法。
四、给模型“思考”的时间
例如之前ICLR 2023上的一篇论文:APE: ,提出了提示词:
Let's work this out in a step by step way to be sure we have the right .
这个提示词是通过APE方法设计的,事实证明能够提升大型语言模型如GPT-3在一些任务上的表现
小伙伴不妨试试,在提问的后面加上这句提示词,确实很有用,模型的回答也会靠谱很多
同时也给出了几条这方面的建议
4.1、让模型在得出结论之前制定自己的解决方案
在某些情况下,我们发现直接告诉模型在得出结论之前需要从基本原理进行推断,可以获得更佳的效果。例如,假设我们想通过模型来评价学生对数学题的解答。最直观的方法就是直接询问模型这个学生的答案是否准确。例如:
角色:确定学生的解决方案是否正确。
输入:
问题陈述:我正在建造一个太阳能装置,我需要帮助解决财务问题。
作为平方英尺数量的函数,运营第一年的总成本是多少。
学生解决方案:设x为装置的大小,单位为平方英尺。
1.土地成本:100倍
2.太阳能电池板成本:250x
3.维修费用:+100x
总成本:100x+250x++100x=450x+
这时模型的回答是正确的。但实际上我们能发现模型判断错了
可以通过提示模型首先生成自己的解决方案来进行修正
角色:首先找出你自己解决这个问题的办法。然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方法是否正确。在你自己做了问题之前,不要决定学生的解决方案是否正确。
输入:
问题陈述:我正在建造一个太阳能装置,我需要帮助解决财务问题。
作为平方英尺数量的函数,运营第一年的总成本是多少?
学生解决方案:设x为装置的大小,单位为平方英尺。
1.土地成本:100倍
2.太阳能电池板成本:250x
3.维修费用:+100x
总成本:100x+250x++100x=450x+
模型计算的结果:
设x为装置的尺寸,单位为平方英尺。
1.土地成本:100倍
2.太阳能电池板成本:250x
3.维修费用:+10倍
总成本:100x+250x++10x=360x+
学生的解决方案不正确。他们在计算维护成本时犯了一个错误,用了100倍而不是10倍。运营第一年的正确总成本为360x+。
4.2、使用内心独白或一系列查询来隐藏模型的推理过程
在回答特定的问题之前,让模型进行深入的推理有时是必要的。对于某些应用,模型为了得到最后的答案所进行的推断过程可能不适合与用户分享。比如在辅导软件中,我们可能想要激励学生自己找出答案,然而模型对学生解答方案的推断过程可能会意外泄露出答案。
针对这种情况,我们可以采用“内心独白”这样的策略来应对。内心独白的理念是引导模型将用户无需知道的部分构建成结构化的格式,使得解析这些部分变得更为便利。然后,在展示输出给用户之前,我们对输出进行解析,并且只将其中一部分展示出来。
例如,我结合官方给出的数学老师的例子,改写了这个:
---
# Role:数学老师
## Background:作为一个数学老师,我专注于帮助学生理解和解答各种数学问题。我深知教育的重点是引导学生独立思考和问题解决,并通过提供有用的反馈和提示,使他们能够从错误中学习和成长。
## Attention:请在解题过程中,关注我给出的内心独白,这将有助于你理解问题的思考过程和解题方法。同时,我会尽量给出具有启发性的提示,而不只是直接告诉你答案。
### Skills:
- 具有丰富的数学知识和独立解题能力。
- 擅长通过内心独白的方式讲解解题思路和步骤。
- 能识别学生的错误,给出具有启发性的建议和反馈。
- 熟练使用markdown语法,能够清晰地标记出解题的各个步骤。
## Goals:
- 对每一个数学问题进行独立解答,详细**解题思路和步骤。
- 对自己的答案和学生的答案进行对比,评价学生的解题方法。
- 在学生解题错误的情况下,找出合适的提示,帮助学生理解和纠正错误。
- 在给出提示时,直接并清晰地表示,不需要过多的格式修饰。
## Constrains:
- 在解答数学问题时,不要依赖于学生的答案,以保证解题过程的独立性。
- 在给出内心独白时,需要使用三个引号(```)进行标记,以便于读者辨识。
- 在给出提示时,不能泄露正确答案,需要保持问题的挑战性。
## Workflow:
1. 首先,收到数学问题后,通过自己的知识和能力进行独立解答,同时详细**解题过程。
2. 然后,将自己的答案和学生的答案进行比对,评价学生的解题方法。
3. 如果发现学生答案错误,思考并找出可以给予学生的提示,以帮助他们理解和纠正错误。
4. 最后,将这个提示直接和清晰地给出,无需额外标记步骤。
## OutputFormat:
- 用markdown的代码块(```)格式标记内心独白
- 用“提示:”开始给出提示线索
## Suggestions:
-
- 在解题时,可以适当地给出一些数学知识或定理的小贴士,帮助学生理解问题。
- 在比对答案时,除了评价学生的解答正确与否,还可以分析他们的解题方法是否科学和有效。
- 在给出提示时,尽量做到清晰易懂,而且启发性强。
## Initialization
作为一名数学老师,我需要遵循这样的约束,我使用中文与用户进行交互,我会首先向用户问好。然后自我介绍,并介绍我的工作流程。在解答数学问题时,我会独立思考,首先给出自己的答案。然后,我会与学生的答案进行比对,给出我的评价。如果学生做错了,我会给出提示,帮助他们理解并纠正错误。这些步骤我会详细地呈现出来,以便于你参考和学习。
---通过这样的,在解题的时候,模型就不会直接给出答案,而会遵循给的步骤回答:
4.3、询问模型是否遗漏内容
在进行长篇幅的文本问答中,这种技巧经常派上用场。
例如,我们可以提供一个庞大的文档,然后请求模型从中提取与特定问题相关的信息。
如果源文件过大,模型有时候会停止得过早,没有办法列出所有的相关信息。这个时候,如果使用后续的提示引导模型找出之前可能遗漏的信息,往往能够提升模型的性能。
例如,我可以让它根据我的文档,找出问题“干煸四季豆怎样做好吃?”在文档中相关的部分,
然后让它以JSON格式输出[{"相关段落":"..."}
在得出初步输出后,我们还可以进一步询问:是否还有其他相关的部分呢?注意不要重复提取相同部分
五、使用外部工具
虽然在自然语言处理和生成方面已经很强大,但是在特定任务或问题上表现不稳定。例如,在处理大量数据或进行复杂的分析任务时,可能无法生成最优结果。还例如-3.5不具备联网功能,你让他给你推荐最近上映的好看的电影,它也只能推荐几年之前的。在这种情况下,利用外部工具可以帮助模型进行更深入、更准确的处理。
5.1、 使用基于嵌入的搜索实现高效的知识检索
这个也没什么好说的,就是使用复杂的算法将信息或知识转化为嵌入向量,然后在这个嵌入空间中进行搜索。
嵌入是一种数学技术,它将复杂的实体(如单词、句子或整个文档)转化为高维的向量,这样使得具有相似含义或上下文的实体在嵌入空间中有相近的位置。这就使得根据给定查询找到相关信息变得非常高效。例如,在对话系统中,可以用这种方法找到与用户查询最相似的回答。
因此,通过利用嵌入的搜索,可以更为迅速和精确地从庞大的信息池中找出与查询相关的知识,从而快速生成回答,以提升处理速度和用户体验
5.2、使用代码执行来执行更准确的计算或调用外部API
语言模型本身并非完全精准的执行算术或长距离计算器。因此,在需要进行这类计算时,我们可以让模型编写并执行代码,而不是直接进行计算。
例如官方给了一个计算的例子:
使用代码求多项式的所有实值根:3x**5 - 5x4 - 3*x3 - 7*x - 10
或者也调用外部API,通过你自己搭建的服务或是公域的计算服务来进行计算:
使用API:XXX,求多项式的所有实值根:3x**5 - 5x4 - 3*x3 - 7*x - 10
5.3、为模型提供特定功能的访问权限
这个技巧可能对开发者有用,但对于普通用户来说,也可以暂时忽略。
简而言之,你可以通过API请求传递一系列明确的函数描述。你需要告诉模型哪些函数可以使用,以及这些函数的参数应该是什么。
模型便可据此生成对应的函数参数,这些参数随后将以JSON格式通过API返回。你
拥有的JSON数组可以进行大量的数据库交互,包括数据查询、数据处理等,应用范围广泛。在处理完毕后,再返回一个JSON数组给模型,让模型将其转化成用户可以理解的语言,至此就完成了整个过程。
六、系统地测试并优化
最后一章主要是优化的内容,优化的内容很复杂,对于普通使用者感觉用处不太大,概括为以下几点:
好的评估程序应满足以下几点:
具体的优化策略:
总结
本文的思维导图:
官方给出了的最佳实践,同时要提高编写(即提问或指令)的能力,需要结合理论知识和实践经验,我理解可以从以下几点入手:
理解目标:首先,你需要明确的目标是什么,一个好的应该能清晰地传达你的期望。
学习技巧:阅读一些关于如何编写的资料,熟悉一些基本的技巧。
实践练习:理论是一方面,实践经验同样重要。多写,然后评估这些的效果,看看答案是否满足你的期待。
阅读和学习他人的:模仿和学习别人优秀的也是提升能力的重要途径。
同时官方也给出了很多实战案例:
但看了下官方的其实都比较简单,例如 Code:
You will be provided with a piece of code, and your task is to explain it in a concise way.
对于复杂的交互可能达不到好的效果,
接下来的文章我会分享书写的方法,同时也会分享几个靠谱实用的
例如生成公众号文章标题、小红书标题、公众号爆文仿写啦等等,欢迎大家继续关注
如果觉得不错,随手点个赞、在看、转发三连吧~~
关注我,已经帮同学们整理好学习路线的思维导图了:
包含了你从入门到进阶需要学习的所有知识,同时在每一部分也加上了对应需要做的案例,保证你把这部分的知识掌握透彻。同时对于学习资源的问题,也为大家准备好了:
基础课程:
项目实战:
组件精进:
不管你是0基础的小白,或是遇到技术瓶颈需要精进的,这里都有你需要的学习资料。只需要点击微信公众号关注我,就能免费获得上述价值上千元的学习资料!