提示工程是大家学习大模型一定会接触到的知识,接下来我会结合官网和自己的经验来给大家讲解大模型中的提示工程
首先我们可以看下官网中的提示工程:https://platform.openai.com/docs/guides/prompt-engineering
提示工程策略
这是官网给出的6种策略
Tactics:
- Include details in your query to get more relevant answers
- Ask the model to adopt a persona
- Use delimiters to clearly indicate distinct parts of the input
- Specify the steps required to complete a task
- Provide examples
- Specify the desired length of the output
翻译过来就是
- 在查询中包含详细信息以获取更相关的答案
- 要求模型采用角色
- 使用分隔符清楚地指示输入的不同部分
- 指定完成任务所需的步骤
- 提供示例
- 指定所需的输出长度
个人感觉有一些可能不太适用大家的常见思维,然后我们也可以看下官网给的示例
给分了这么几类
- 信息提取
- 生成
- 翻译
- 代码生成
- 自然语言
- 结构化数据
也就是说提示工程利用大模型可以完成上述的事情,感兴趣的话 大家可以自己去看一下官网的示例,链接给大家放到这里
Prompt 的典型构成
- 角色:给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」
- 指示:对任务进行描述
- 上下文:给出与任务相关的其它背景信息(尤其在多轮交互中)
- 例子:必要时给出举例,学术中称为 one-shot learning, few-shot learning 或 in-context learning;实践证明其对输出正确性有帮助
- 输入:任务的输入信息;在提示词中明确的标识出输入
- 输出:输出的格式描述,以便后继模块自动解析模型的输出结果,比如(JSON、XML)
常用技巧
接下来我分享一下我使用的一些常用技巧,跟官网中的策略有相同的地方,大体的思路都是差不多的
使用清晰,明确的提示词
如果我们想让ChatGPT写一首诗,如果直接让他写首诗那么他的回答不一定能满足你的要求,但是如果你写的提示词是 给openai写一首诗,模仿李白的《静夜思》
大家在使用大模型写提示词的过程中,一定不要当一个直男,要把你想要做的事情描述清楚
这是官网的一个示例对比
角色扮演
效果一般的提示词:给我一个减肥的计划。
好的提示词:
System: 我想让你扮演一个专业的健身私人教练。 你应该利用你的运动科学知识、营养建议和其他相关因素为你的客户定制专业的计划。
User: 给我一个减肥的计划。
这里面有两个单词,那么它代表什么意思呢?
system
它设定了 AI 的行为和角色,和背景。
常常用于开始对话,给出一个对话的大致方向,或者设置对话的语气和风格。
例如,可以把它设置为:“你是一个助理”或“你是一名历史教师”。这个消息可以帮助设定对话的语境,以便 AI 更好地理解其在对话中的角色。
user
就是我们输入的问题或请求。
比如说“北京王府井附近有什么值得去的地方?”
用###或者"“” 将指令和待处理的内容分开
其实随着大模型的发展,现在这条可能有的情况下 不加###
或者"""
同样也可以识别出来
指定输出的格式
我们在做开发的时候,基本都是用JSON这种数据类型来进行交互的,那么大模型能不能指定返回的数据类型呢?
少样本提示
我的提示词是
1. 生成文本:ChatGPT可以生成与给定主题相关的文章、新闻、博客、推文等等。您可以提供一些关键词或主题,然后ChatGPT将为您生成相关的文本。
2. 语言翻译:ChatGPT可以将一种语言的文本翻译成另一种语言。
3. 问答系统:ChatGPT可以回答您提出的问题,无论是事实性的问题、主观性的问题还是开放性的问题。
4. 对话系统:ChatGPT可以进行对话,您可以与ChatGPT聊天,让它回答您的问题或就某个话题进行讨论。
5. 摘要生成:ChatGPT可以从较长的文本中生成摘要,帮助您快速了解文章的主要内容。
6. 文本分类:ChatGPT可以将一些给定的文本分类到不同的类别中,例如新闻、体育、科技等等。
7. 文本纠错:ChatGPT可以自动纠正文本中的拼写错误和语法错误,提高文本的准确性。
请把上面7段话各自的开头几个词,翻译成英文,并按序号输出
发现生成的结果并不是我们想要的
我们给一个示例
1. 生成文本:ChatGPT可以生成与给定主题相关的文章、新闻、博客、推文等等。您可以提供一些关键词或主题,然后ChatGPT将为您生成相关的文本。
2. 语言翻译:ChatGPT可以将一种语言的文本翻译成另一种语言。
3. 问答系统:ChatGPT可以回答您提出的问题,无论是事实性的问题、主观性的问题还是开放性的问题。
4. 对话系统:ChatGPT可以进行对话,您可以与ChatGPT聊天,让它回答您的问题或就某个话题进行讨论。
5. 摘要生成:ChatGPT可以从较长的文本中生成摘要,帮助您快速了解文章的主要内容。
6. 文本分类:ChatGPT可以将一些给定的文本分类到不同的类别中,例如新闻、体育、科技等等。
7. 文本纠错:ChatGPT可以自动纠正文本中的拼写错误和语法错误,提高文本的准确性。
请把上面7段话各自的开头几个词,翻译成英文,并按序号输出。例如,第1段话的开头是"生成文本",那么就输出"generate text".
当我们给ChatGPT一个示例,发现回答的结果会比较好
我们上面的都是一些常用的技巧,并没有通过Python代码调用openai的接口,接下来我写一个示例
# 导入模块
from openai import OpenAI
# 填写自己的openai key
client = OpenAI(api_key=API_KEY)
prompt = """可以写上面我们提到的提示词"""
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
print(get_completion(prompt))
提示工程进阶
零样本提示
如今,经过大量数据训练并调整指令的LLM能够执行零样本任务。
from openai import OpenAI
client = OpenAI(api_key=API_KEY)
prompt = """
将文本分类为中性、负面或正面。
文本:我认为这次假期还非常不好。
情感:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
print(get_completion(prompt))
虽然大型语言模型展示了惊人的零样本能力,但在使用零样本设置时,它们在更复杂的任务上仍然表现不佳
少样本提示的限制
我们来看一份代码
from openai import OpenAI
client = OpenAI(api_key=API_KEY)
prompt = """
这组数字中的奇数加起来是一个偶数:4、8、9、15、12、2、1。
A:答案是False。
这组数字中的奇数加起来是一个偶数:17、10、19、4、8、12、24。
A:答案是True。
这组数字中的奇数加起来是一个偶数:16、11、14、4、8、13、24。
A:答案是True。
这组数字中的奇数加起来是一个偶数:17、9、10、12、13、4、2。
A:答案是False。
这组数字中的奇数加起来是一个偶数:15、32、5、13、82、7、1。
A:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
print(get_completion(prompt))
代码输出是true,但是结果应该是false,15+5+13+7+1=41
,可以看到少样本提示在推理问题上效果还是不太好,提供示例对解决某些任务很有用,当零样本提示和少样本提示不足时,这可能意味着模型学到的东西不足以在任务上表现良好
链式思考(思维链COT)
链式思考(CoT)提示通过中间推理步骤实现了复杂的推理能力。您可以将其与少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务
prompt = """
这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。
A:将所有奇数相加(9、15、1)得到25。答案为False。
这组数中的奇数加起来是偶数:17、10、19、4、8、12、24。
A:将所有奇数相加(17、19)得到36。答案为True。
这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。
A:将所有奇数相加(11、13)得到24。答案为True。
这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。
A:将所有奇数相加(17、9、13)得到39。答案为False。
这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
A:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
print(get_completion(prompt))
代码运行输出结果 将所有奇数相加(15、5、13、7、1)得到41。答案为False。
自我一致性(自洽性)
一种对抗「幻觉」的手段。就像我们做数学题,要多次验算一样。
- 同样 prompt 跑多次
- 通过投票选出最终结果
prompt = """
Q:林中有15棵树。林业工人今天将在林中种树。完成后,将有21棵树。林业工人今天种了多少棵树?
A:我们从15棵树开始。后来我们有21棵树。差异必须是他们种树的数量。因此,他们必须种了21-15 = 6棵树。答案是6。
Q:停车场有3辆汽车,又来了2辆汽车,停车场有多少辆汽车?
A:停车场已经有3辆汽车。又来了2辆。现在有3 + 2 = 5辆汽车。答案是5。
Q:Leah有32块巧克力,她的姐姐有42块。如果他们吃了35块,他们总共还剩多少块?
A:Leah有32块巧克力,Leah的姐姐有42块。这意味着最初有32 + 42 = 74块巧克力。已经吃了35块。因此,他们总共还剩74-35 = 39块巧克力。答案是39。
Q:Jason有20个棒棒糖。他给Denny一些棒棒糖。现在Jason只有12个棒棒糖。Jason给Denny多少棒棒糖?
A:Jason有20个棒棒糖。因为他现在只有12个,所以他必须把剩下的给Denny。他给Denny的棒棒糖数量必须是20-12 = 8个棒棒糖。答案是8。
Q:Shawn有五个玩具。圣诞节,他从他的父母那里得到了两个玩具。他现在有多少个玩具?
A:他有5个玩具。他从妈妈那里得到了2个,所以在那之后他有5 + 2 = 7个玩具。然后他从爸爸那里得到了2个,所以总共他有7 + 2 = 9个玩具。答案是9。
Q:服务器房间里有9台计算机。从周一到周四,每天都会安装5台计算机。现在服务器房间里有多少台计算机?
A:从周一到周四有4天。每天都添加了5台计算机。这意味着总共添加了4 * 5 =
20台计算机。一开始有9台计算机,所以现在有9 + 20 = 29台计算机。答案是29。
Q:Michael有58个高尔夫球。星期二,他丢失了23个高尔夫球。星期三,他又丢失了2个。星期三结束时他还剩多少个高尔夫球?
A:Michael最初有58个球。星期二他丢失了23个,所以在那之后他有58-23 = 35个球。星期三他又丢失了2个,所以现在他有35-2 = 33个球。答案是33。
Q:Olivia有23美元。她用每个3美元的价格买了五个百吉饼。她还剩多少钱?
A:她用每个3美元的价格买了5个百吉饼。这意味着她花了15美元。她还剩8美元。
Q:当我6岁时,我的妹妹是我的一半年龄。现在我70岁了,我的妹妹多大?
A:
"""
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
return response.choices[0].message.content
print(get_completion(prompt))
运行输出1:
当我6岁时,我的妹妹是我的一半年龄,也就是3岁。现在我70岁了,所以她是70-3 = 67岁。答案是67。
运行输出2:
当叙述者6岁时,他的妹妹是他年龄的一半,也就是3岁。现在叙述者70岁了,他的妹妹应该是70-3 = 67岁。答案是67。
运行输出3:
当我6岁时,我的妹妹是我的一半年龄,也就是3岁。现在我70岁了,所以她是70/2 = 35岁。答案是35。
思维树 (ToT)
对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。思维树基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。
ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LM 能够自己对严谨推理过程的中间思维进行评估。LM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。
生成数据
LLMs具有生成连贯文本的强大能力。使用有效的提示策略可以引导模型产生更好、更一致和更真实的响应。LLMs还可以特别有用地生成数据,这对于运行各种实验和评估非常有用。例如,我们可以使用它来为情感分类器生成快速样本,如下所示:
提示:
生成10个情感分析的范例。示例被归类为正面或负面。生成2个负面示例和8个正面示例。使用以下格式的示例:Q:<句子>A:<情感>
输出:
Q:我刚刚得到了最好的消息!
A:正面
Q:我们刚刚在工作中得到了加薪!
A:正面
Q:我为今天所取得的成就感到非常自豪。
A:正面
Q:我度过了最美好的一天!
A:正面
Q:我真的很期待周末。
A:正面
Q:我刚刚得到了最好的礼物!
A:正面
Q:我现在感到非常快乐。
A:正面
Q:我很幸运有这么棒的家人。
A:正面
Q:外面的天气很阴沉。
A:负面
Q:我刚刚得到了一些可怕的消息。
A:负面
代码的生成
将注释转换成代码,你还可以使用这些大模型预言代码的代码生成功能将注释转换成代码
提示词
"""
1. 创建一个电影名称列表
2. 创建这些电影的评分列表
3. 组合他们并创建一个包含10部电影及其评级的json对象
"""
输出结果, 我把主要的代码贴在下面
import json
# 1. 创建一个电影名称列表
movie_names = [
"The Shawshank Redemption",
"The Godfather",
"The Dark Knight",
"12 Angry Men",
"Schindler's List",
"Pulp Fiction",
"The Lord of the Rings: The Return of the King",
"The Godfather: Part II",
"The Good, the Bad and the Ugly",
"Fight Club"
]
# 2. 创建这些电影的评分列表
ratings = [
9.3,
9.2,
9.0,
8.9,
8.9,
8.9,
8.9,
8.7,
8.8,
8.8
]
# 3. 组合他们并创建一个包含10部电影及其评级的json对象
movies_json = {
"movies": [
{"name": movie_names[i], "rating": ratings[i]} for i in range(len(movie_names))
]
}
# 将JSON对象转换为字符串
movies_json_str = json.dumps(movies_json, indent=4)
# 打印JSON字符串
print(movies_json_str)
MySQL查询语句生成
除了上面的基本代码生成示例外,您还可以使用该模型生成其他有用的代码,例如创建和测试MySQL查询。
假设您有一个数据集,其中包含一些信息,您可以将其作为提示的一部分包含在内,然后指示它生成特定查询
"""
departments表, columns = [DepartmentId, DepartmentName]
students表, columns = [DepartmentId, StudentId, StudentName]
为计算机科学系的所有学生创建MySQL查询
"""
输出
SELECT s.StudentId, s.StudentName
FROM students s
JOIN departments d ON s.DepartmentId = d.DepartmentId
WHERE d.DepartmentName = 'Computer Science';
模型生成了一个查询语句!但是,我们没有对应的数据库来测试生成的查询语句是否正确。如果要测试,则需要创建这个数据库
也可以利用提示词来生成数据表的创建,这里就不演示了
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓