02 学好提示工程,轻松驾驭大模型
你好,我是独行。
这节课我们好好讲讲提示工程,也就是我们常说的Prompt Engineering。这一节课的内容非常关键,可以这么说,能否充分使用好AI大模型,提示是关键,所以现在已经有一种新的职业诞生,就是提示工程师。
目前国内已经有不少公司在招聘提示工程师,薪水接近软件开发工程师的水平,达到20万~30万人民币,国外有的高级提示工程师,薪水已经超越软件开发工程师水平,达到了惊人的30万美金以上,要知道Google软件开发工程师的平均年薪也就20万美金左右。为什么会出现这样的现象?到底什么是提示工程?想了解这个问题,我们先来聊聊什么是提示。
什么是提示?
这里你可能会有一些疑问,因为一般在使用大模型产品的时候,我们都是向大模型“提问”,大模型给出“答案”,这个过程也没有看到提示啊?其实不然,如果阅读过OpenAI官方使用文档,你就会发现,在官方文档里,你是看不到question和answer这两个词的,我们能看到的是prompt和completion,翻译过来就是提示和补全,也就是说,我们向大模型提出的问题,其实是给大模型一个提示,让它进行补全,补全的内容就是大模型给我们输出的答案。
看到这里,你可能又想问了,为什么是提示和补全,而不是提问和答案呢?这就要从大模型训练的原理出发去理解了。上节课我们讲过,GPT系列模型是基于Transformer架构的解码器机制,使用自回归无监督方式进行预训练的。这个训练过程简单来说就是大量的文本输入,不断进行记忆的过程,相比监督学习,效率会更低,但是训练过程简单,可以喂大量的文本语料,上限比较高。
而我们在使用大模型的时候,先给出提示,大模型会根据提示,来推测补全内容。实际上是根据训练过的“记忆”,一个字一个字地计算概率,取概率最大的那个字进行输出,所以不少人吐槽大模型输出很慢。的确,它是一个字一个字地计算并输出,效率肯定会比较低。
光从使用角度看,提示还是比较容易理解的,那什么是提示工程呢?
什么是提示工程?
用过ChatGPT的人,心态一般是这样的:
第一天:哇!这个东西好牛啊,还懂人性,回答不对还道歉,太牛了!
第二天:哎?好像也没啥啊,回答的内容也就那样,看似长篇大论,实则没有新意,感觉也解决不了太多实际问题。
我见过身边很多人都是这样的,那这里我就要问一下你了,你的提示长什么样?可否回想一下,你的提示是不是这样的?
- 提示一:请帮我生成一个PPT大纲。
- 提示二:请帮我生成一个专利创作背景。
- 提示三:请帮我写一篇日记。
- 提示四:…
就拿【提示一】来说,试想一下,你有一个秘书小李,想让他帮忙做个PPT,你们的对话一般来说应该是这样的:
👨🏫:小李,请帮我写一个PPT。
👦:老板,您的PPT需要什么内容,用来做什么?
👨🏫:我明天去拜访客户,向客户展示我们的新产品。
👦:那您需要简要介绍还是详细介绍?除了产品还需要放其他内容吗?
👨🏫:简要介绍即可,除了产品介绍,再放一些客户案例。
👦:好的,老板,您需要什么风格的PPT呢?
👨🏫:有科技感一点的。
👦:好的,老板。
正常来说,你是需要向小李详细描述你的PPT内容的,这样小李才能尽可能准确地制作符合你要求的PPT,其实上面的对话还不够详细,不出预料,当小李把初稿发给你后,你还会提出一些建议,再次进行修改,有时甚至会修改多轮。
如果把大模型当作秘书小李的话,那我们给他的提示就不应该是简单的一句话了,而是尽可能地将需求描述清楚,需求描述越详细越准确,大模型输出的内容越符合你的要求。所以说好的提示,包含很多信息,这些信息帮助你和大模型相互了解,所以它是复杂的、规范的,类似于人与人相处,要相互了解才能合作愉快、高效。
所以提示工程是一门专门研究和大语言模型交互的新型学科,通过不断地开发和优化,帮助用户更好地了解大型语言模型的能力和局限性。换句话说,提示工程(Prompt Engineering)就是探讨如何设计出最佳提示,用于指导语言模型帮助我们高效完成某项任务。
提示工程不仅仅是设计和研发提示,它还包含了与大语言模型交互的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型的能力。
换个角度,如果AI大模型是你的员工,他能否表现优秀,除了他本身的潜质外,还需要你能够领导好他,也就是我们常说的领导力,在这里叫做 AI领导力。
什么是AI领导力?
做过管理的人都知道,领导力是一个管理者非常重要的素质。在现在这种情况下,AI大模型其实就是我们的虚拟员工,而且是一个智力高,知识储备量巨大的员工,能否让他有高质量的产出,就是看你怎么带他,怎么领导他。
那么我就要问了,你确认你能领导一个智商超过140,大脑几乎掌握了全世界大部分公开知识的员工?一般人我估计不敢轻易给出肯定的答案。但是也不要被吓住,我们需要做的就是提升自身的AI领导力。提示是我们和AI大模型沟通的唯一桥梁,只有熟练掌握提示技巧,才能进一步提升领导力,进而让你轻松驾驭AI大模型。
如何构造好的提示?
获取好的输出结果有几种方式,一种就是不断和模型交互,比如输入很简单,但是通过多轮问答,不断地对输出进行调整;第二种就是一次性尽可能地将输入写好,我更推荐第二种,这样模型就不需要去理解上下文了,一般来说,好的提示可以通过下面这个公式去构造。
- 任务模块:从动作动词开始,无论简单还是复杂,都要明确说明目标,来有效指导输出。
- 上下文模块:为大模型提供足够的背景信息,描述清楚用户环境,来缩小可能性,同时可以定义生成任务需要的步骤。
- 示例模块:利用示例或框架可以显著提高简历、面试问题或职位描述等各种任务的输出质量。
- 角色模块:定义大模型应该效仿的人,例如技术专家、营养师、专业运动员等。
- 格式模块:无论是表格、电子邮件、项目符号、代码块、段落,还是期望的输出长度,我们都可以把所需的输出格式可视化,来有效地适应任务。
- 语气模块:指定所需的语气,比如休闲、正式、热情或者具体感受,指导大模型匹配写作风格。
各部分的重要性顺序如下:
一个好的提示不一定要包含所有模块,但是最好要包含任务和上下文。无论如何,都要尽可能详细地进行描述。
这几个模块整体来说是比较易懂的,我简单为你解释下。比如我正在写用户登录模块,打算让大模型为我生成相关的示例代码,我们可以这么写:
你是一个软件开发工程师,请使用Java语言,写一个登录的模块,生成相关代码。
我们为模型指定了角色:软件开发工程师,并指定使用Java写一个登录模块。以下是ChatGPT3.5返回的结果。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class LoginModule {
private Map<String, String> userDatabase;
public LoginModule() {
// 初始化用户数据库,实际应用中通常会连接到数据库
userDatabase = new HashMap<>();
userDatabase.put("user1", "password1");
userDatabase.put("user2", "password2");
// 添加更多用户...
}
public boolean authenticateUser(String username, String password) {
// 在实际应用中,这里通常会连接到数据库,验证用户名和密码是否匹配
String storedPassword = userDatabase.get(username);
return storedPassword != null && storedPassword.equals(password);
}
public static void main(String[] args) {
LoginModule loginModule = new LoginModule();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名: ");
String username = scanner.nextLine();
System.out.print("请输入密码: ");
String password = scanner.nextLine();
if (loginModule.authenticateUser(username, password)) {
System.out.println("登录成功!");
} else {
System.out.println("登录失败,用户名或密码错误!");
}
scanner.close();
}
}
可以看出来,并不是我们想要的代码,因为一般情况下我们需要的是Web页面登录,而上述结果是一个控制台程序,所以我们接着修改提示。
你是一个软件开发工程师,请使用Java语言,写一个Web登录的模块,请使用SpringBoot框架,前端使用ReactJS语言,要求密码使用MD5加密。第一步:用户在页面输入用户名和密码,点击登录。第二步:服务端接口收到请求,对参数进行非空验证。第三步:通过数据库查询用户名和密码进行验证。请生成相关代码。
这一次我们不仅指定了角色,还为任务指定了生成步骤,当然模型输出的内容也更加详细了。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class UserController {
@PostMapping("/login")
public String login(@RequestBody UserLoginRequest request) {
// 第二步:非空验证
if (request.getUsername() == null || request.getPassword() == null) {
return "用户名和密码不能为空";
}
// 第三步:数据库验证
if (isValidUser(request.getUsername(), request.getPassword())) {
return "登录成功";
} else {
return "用户名或密码错误";
}
}
private boolean isValidUser(String username, String password) {
// 这里应该调用数据库查询用户信息的方法,进行用户名和密码的验证
// 在实际项目中,不应该将密码存储为明文,而是使用哈希算法进行存储和比对
// 这里仅为演示,实际中应该使用更安全的方式
return "admin".equals(username) && "21232f297a57a5a743894a0e4a801fc3".equals(md5(password));
}
private String md5(String input) {
// 这里是一个简单的MD5加密示例,实际项目中应该使用更安全的加密方式
// 注意:MD5不是安全的加密算法,仅作为演示使用
// 实际项目中应该使用更安全的哈希算法,如BCrypt
// 可以使用Spring Security等库来进行密码的安全处理
return org.apache.commons.codec.digest.DigestUtils.md5Hex(input);
}
}
加入了UserController,定义了RESTful接口,但是数据库连接部分还是通过注释提示的,没有生成出来,我们可以继续优化提示。
你是一个软件开发工程师。请生成一个Web用户登录模块。前端使用ReactJS+CSS+HTML进行页面布局和发起HTTP请求。后端请使用Java+SpringBoot+MyBatis框架,使用Maven进行依赖包管理。要求密码使用MD5加密,并将具体的数据库连接代码生成出来。请按照以下步骤生成代码。第一步:用户在页面输入用户名和密码,点击登录。第二步:前端发起HTTP请求,服务端接口收到请求,对参数进行非空验证。第三步:通过数据库查询用户名和密码进行验证。请生成相关代码。
当我们这样提问后,基本该有的代码都有了,数据库连接也加上了,前端页面的代码也补上了。这是一个简单的示例,需要注意的是,不同的大模型实现机制以及配置不同,你需要通过不断调试,找到合适的方式和大模型进行沟通交互,最终构建最合适的提示。
万能工具:生成提示的提示
下面我给你展示一个非常强大的功能——生成提示的提示,让ChatGPT为你生成你需要的提示。
你在ChatGPT中输入以下内容:
我想让你成为我的提示工程师。你的目标是帮助我为我的需求制作尽可能好的提示。提示将由你使用。你需要遵循以下流程:
- 你的第一反应是问我提示应该是什么。我会提供我的答案,但我们需要通过下一步不断地迭代来改进它。
- 根据我的输入,你将生成2个部分:
- 修改后的提示(提供你重写的提示,它应该要清晰、简洁、易于理解);
- 问题(向我提出任何相关问题以改进提示)。
- 我们将继续这一迭代过程,我将向你提供更多信息,你也将更新修改后的提示部分中的提示,直到我说我们完成为止。
将这段提示输入ChatGPT,ChatGPT会一步一步询问我们是否需要补充,直到我们回复【我们完成】才结束对话。你可以试试,功能很强大。这里我举一个例子,我们一起看一下。
这个工具的厉害之处在于,只要我们不喊停,它就会一直问,可以把提示调整得非常完善,这一步后,我就主动叫停了。
最后生成的提示如下:
主题: 为初学者设计的6个月增肌30%、减脂20%计划,结合高蛋白饮食和哑铃力量训练。
内容: 专为无力量训练基础、喜欢高蛋白饮食和有氧运动的个体制定的健身计划。此计划强调使用哑铃进行力量训练,以适应新手的学习曲线,同时促进肌肉增长和脂肪燃烧。每周三次的训练将包括有氧运动和哑铃训练,逐步提高难度以适应身体变化。计划还建议寻找现场教练指导,以确保动作的正确性和安全性,同时使用蛋白粉补充营养,支持恢复和肌肉生长。
写给软件工程师的话
近一年人工智能发展速度非常快,我个人预测很有可能在五年内颠覆软件开发行业。为什么这么讲?因为软件开发的目的是实现用户和计算机的交互,而大模型的到来,已经改变了人类和计算机的交互形式,未来我们可能不再需要写代码,而是需要学会写提示,也就是从软件开发工程师向提示工程师转变。我们今天用的代码仓库,几年后可能就变成提示仓库了。
现在我们软件开发工程师的工作流程,和五年后我们作为提示工程师的工作流程,会有怎样的区别呢?你可以对比一下。
小结
这节课我们从与大模型交互方面入手,学习了提示及提示工程,提示是我们与大模型沟通的唯一桥梁,是决定大模型能否高效产出的关键。当然,使用的大模型不同,提示效果可能完全不同,这和我们人与人之间交往一样,不同的人有不同的性格,同一句话有人爱听有人不爱听。所以,和大模型“交往”也需要慢慢摸底,摸清楚对方的习惯和能力。
思考题
请你思考一下,我们为什么要为大模型指定角色呢?欢迎你把你思考后的结果分享到评论区,也欢迎你把这节课的内容分享给其他朋友,我们下节课再见!
- 张申傲 👍(8) 💬(1)
打卡第2讲~ 个人理解,指定角色可以让大模型更好地理解上下文和场景,类似人类聊天时的“语境”和“氛围”。同样是让大模型生成一个PPT,它的角色是项目负责人还是一线业务人员,最终生成PPT的内容和风格可能是完全不同的。
2024-06-12 - zMansi 👍(3) 💬(1)
指定角色能有助于回答的数据更倾向于角色领域?
2024-06-08 - while (1)等; 👍(2) 💬(1)
ChatGPT背后的工作原理是怎样的,他是如何理解人类的逻辑的?他又是怎么根据提示进行补全的呢?根据提示像百度搜索一样,自己检索答案再组织输出吗?麻烦老师给小白解惑一下。
2024-06-21 - sami 👍(1) 💬(1)
提示工程这块,网络上有18个提示词框架; 也有开源的LangGPT,通过编码来生成结构化的提示词; 近期本人用比较多的是kimi的提示词专家,也是基于langgpt开发的
2024-07-16 - roman 👍(1) 💬(1)
老师,我之前看到过一篇讲提示工程的文章,文章中提到的 CO-STAR 框架逻辑和您讲的整体逻辑差不多,文章的例子更多一些,分享给大家 https://baoyu.io/translations/prompt-engineering/how-i-won-singapores-gpt-4-prompt-engineering-competition
2024-06-09 - nnn 👍(0) 💬(1)
Q:我们为什么要为大模型指定角色呢? A: 可能类如DDD中领域概念,指定角色类似于将问题聚焦在某个领域中,避免问题的扩散。
2024-12-28 - like life 👍(0) 💬(1)
为大模型指定角色就是在给大模型一个具体的应答方向,就好像我上语文课要带语文书一样。
2024-11-07 - Geek_0a4616 👍(0) 💬(1)
试了下豆包 比如“制定一份去南山竹海的自驾游计划 ” ,一直把目标是制作好的提示 忘记了 直接把计划制定出来了。 我想让你成为我的提示工程师。你的目标是帮助我为我的需求制作尽可能好的提示。提示将由你使用。你需要遵循以下流程: 1、你的第一反应是问我提示应该是什么。我会提供我的答案,但我们需要通过下一步不断地迭代来改进它。 2、根据我的输入,你将生成 2 个部分: * 修改后的提示(提供你重写的提示,它应该要清晰、简洁、易于理解); * 问题(向我提出任何相关问题以改进提示)。 3、我们将继续这一迭代过程,我将向你提供更多信息,你也将更新修改后的提示部分中的提示,直到我说我们完成为止。
2024-08-11 - 石云升 👍(0) 💬(1)
既然大模型是根据你的输入去生成概率最大的输出,那么设置一个角色就是限制了输出的范围,提高了输出的准确性。
2024-08-10 - 王昊 👍(0) 💬(1)
太棒了
2024-08-06 - 绿月亮 👍(0) 💬(1)
指定角色我认为是增加了输入的特征,在大模型众多参数中确定某个参数是有效的,那么对后面计算输出某些token的概率是非常有益的。不知道正确与否,还请老师和前辈们批评指正
2024-07-29 - Joe Black 👍(0) 💬(1)
用大模型和提示完成软件开发感觉还是太乐观了。一般的简单项目,流程化业务有可能还行,稍微有些创造性和专业性的估计就不行了。本身一些领域的开发代码公布在互联网上的就不多,大模型很难学到多少。
2024-07-19 - Planning 👍(0) 💬(1)
是不是大模型训练的时候都指定了角色,然后指定角色之后效果会变好?
2024-06-20 - hudy_coco 👍(0) 💬(1)
个人理解指定角色应该能在一定程度上限定语聊范围。其实日常生活中,人们的沟通也是有“指定角色”的,换句话说叫“情景中的身份”。比如和父母沟通时,默认你是站在儿女的角度,而不是路人。
2024-06-08 - 小马哥 👍(0) 💬(0)
1, 模型就是由很多的对话数据训练而成的; 2, 推理时给模型更好的提示.
2024-12-07