deeplearning.ai联合OpenAI推荐限时免费课程《ChatGPT Prompt Engineering for Developers》,课程链接https://learn.deeplearning.ai/chatgpt-prompt-eng。本文仅做一些翻译。
写出清晰且具体的指令
给模型“思考”的时间
这里有一些具体的方法来达到以上两个原则。
方法一:使用分隔符来清晰地区分输入的不同部分。比如分隔符可以使用```, """, < >, <tag> </tag>
, :
text=f"""
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行计算模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo[3],Go也具有这个模型的特征,比如通道传输。通过goroutine和通道等并行构造可以建造线程池和管道等[8]。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
与C++相比,Go并不包括如枚举、异常处理、继承、泛型(此功能在go1.18中加入)、断言、虚函数等功能,但增加了切片(Slice) 型、并发、管道、垃圾回收、接口等特性的语言级支持[3]。对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go原生提供了关联数组(也称为哈希表(Hashes)或字典(Dictionaries))。
"""
prompt=f"""
请把由三个反引号分隔的文本总结成一句话。
```{text}```
"""
方法二:要求结构化输出。比如要求ChatGPT输出json或html格式,方便后续用程序解析。
text=f"""
罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计Go,[3]稍后伊恩·兰斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)加入项目。Go是基于Inferno操作系统所开发的。[5]Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。
"""
prompt=f"""
请从以下由3个反引号分隔的文本中提取出go语言的设计者和推荐日期,返回json格式,json的key为:authors,publish_date,authors为数组类型,publish_date采用yyyy-mm-dd格式。
```{text}```
"""
输出
{
"authors": [
"罗伯特·格瑞史莫",
"罗勃·派克",
"肯·汤普逊",
"伊恩·兰斯·泰勒",
"拉斯·考克斯"
],
"publish_date": "2009-11-01"
}
方法三:让模型检查条件是否满足。
text=f"""
Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。
"""
prompt=f"""
请从以下由3个反引号分隔的文本中提取出go语言的设计者和推出日期,返回json格式,json的key为:authors,publish_date,authors为数组类型,publish_date采用yyyy-mm-dd格式。
如果文本中没有提及authors或publish_date,请把对应的value置空。
```{text}```
"""
输出
{
"authors": [],
"publish_date": "2009-11-01"
}
如果在prompt中没有交待“如果文本中没有提及authors或publish_date,请把对应的value置空。”这句话,则输出
{
"authors": ["Rob Pike", "Ken Thompson", "Robert Griesemer"],
"publish_date": "2009-11-01"
}
方法四:少样本提示。通过提供给模型一个或多个样本的提示,模型可以更加清楚需要你预期的输出。
prompt=f"""
请按照一致的风格,完成以下对话。
<孙子>:什么是耐心。
<爷爷>:山谷从一个朴素的泉流出;最伟大的交响乐源自一个音符;最复杂的挂毯都是从一根单独的线开始的。
<孙子>:什么是适应力。
"""
输出
<爷爷>:适应力是指在面对变化和困难时,人们运用资源和技能来适应和克服挑战的能力,就像大树在巨风中弯曲而不折断一样。
方法五:指定完成任务的具体步骤,明确说明输出的格式。
text=f"""
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行计算模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo[3],Go也具有这个模型的特征,比如通道传输。通过goroutine和通道等并行构造可以建造线程池和管道等[8]。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
与C++相比,Go并不包括如枚举、异常处理、继承、泛型(此功能在go1.18中加入)、断言、虚函数等功能,但增加了切片(Slice) 型、并发、管道、垃圾回收、接口等特性的语言级支持[3]。对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
不同于Java,Go原生提供了关联数组(也称为哈希表(Hashes)或字典(Dictionaries))。
"""
prompt=f"""
请按照以下步骤逐步执行。
1. 把由<>分隔的文件总结成一句话。
2. 把摘要翻译成英语。
3. 计算英文摘要的字符数。
4. 列举go语言的三大特征,用json表示,key为features,features是数组类型。
<{text}>
输出时按照以下格式:
摘要: <摘要>
翻译: <英文摘要>
字符数: <英文摘要字符数>
特征: <以features为key的json>
"""
输出
摘要: Go语言基于C语言语法,具有并行计算模型,支持通道传输、线程池和管道构造等特征。与C++相比,Go不支持枚举、异常处理、继承、泛型和虚函数,但支持切片型、并发、管道和关联数组等语言级支持特性。
翻译: Go language is based on C syntax and features a parallel computing model with support for channel transmission, thread pools, and pipeline construction. Compared to C++, Go does not support enums, exception handling, inheritance, generics, or virtual functions, but supports slice types, concurrency, pipelines, and associative arrays as language-level support features.
字符数: 201
特征: {"features":["slice types","concurrency","pipelines"]}
方法六:让模型在匆忙下结论之前先自己给出解决方案。
prompt="""
告诉我小张的代码是否正确。请按照以下两步来完成此项任务:
1. 你自己先按要求写出正确的代码。
2. 仔细对比你的代码和小张的代码,检查一下小张的代码是否正确。
输出时按照以下格式:
代码: <你自己写的代码>
结论: <小张的代码是否正确>
问题:
写一段go代码,对长度为1000的int数组求和,要求开4个协程并行计算。
小张的代码:
package main
import "fmt"
func main() {
arr := [1000]int{}
sum := 0
for i := 0; i < len(arr); i++ {
arr[i] = i
}
go func(arr [250]int) {
for _, v := range arr {
sum += v
}
}(arr[0:250])
go func(arr [250]int) {
for _, v := range arr {
sum += v
}
}(arr[250:500])
go func(arr [250]int) {
for _, v := range arr {
sum += v
}
}(arr[500:750])
go func(arr [250]int) {
for _, v := range arr {
sum += v
}
}(arr[750:1000])
fmt.Println(sum)
}
"""
输出
代码:
package main
import "fmt"
func main() {
arr := [1000]int{}
sum := 0
for i := 0; i < len(arr); i++ {
arr[i] = i
}
ch := make(chan int)
go func(arr [250]int) {
partialSum := 0
for _, v := range arr {
partialSum += v
}
ch <- partialSum
}(arr[0:250])
go func(arr [250]int) {
partialSum := 0
for _, v := range arr {
partialSum += v
}
ch <- partialSum
}(arr[250:500])
go func(arr [250]int) {
partialSum := 0
for _, v := range arr {
partialSum += v
}
ch <- partialSum
}(arr[500:750])
go func(arr [250]int) {
partialSum := 0
for _, v := range arr {
partialSum += v
}
ch <- partialSum
}(arr[750:1000])
for i := 0; i < 4; i++ {
sum += <-ch
}
fmt.Println(sum)
}
结论:
小张的代码有一定问题。
没有使用通道交换数据,会导致多个协程之间互相干扰,导致最终结果不准确。
正确的代码需要使用通道交换数据,保证线程安全。
模型经常会捏造一些似是而非的东西,它自己都不知道自己在胡说八道。一个缓解模型幻觉的方法:让模型先给出相关信息,再基于相关信息回答问题。
幻觉示例:
prompt="张朝阳对中国大学生的帮助有哪些?"
输出
张朝阳对中国大学生的帮助可以从多个方面来看:
1. 创办了网易公司,为大学生提供了就业机会和实习机会。
2. 在网易创办的开放课程平台“网易云课堂”,提供了大量的免费网课,让大学生可以在课余时间自主学习。
3. 在新浪微博上开设了“张朝阳谈历史”栏目,通过讲述历史故事和哲学思辨,启迪了很多大学生的思考和心灵成长。
4. 在个人博客中也经常分享自己的思考和阅读心得,让大学生受益于他的思想和智慧。
总体来说,张朝阳通过自己的创业和思考,给予了很多大学生思想和职业方向的启迪和帮助。
正确示例:
prompt="请列举张朝阳近10年做的重大事情,并以此总结张朝阳对中国大学生的帮助有哪些?"
输出
1. 创办搜狐公司,推动中国互联网公司的发展。
2. 联合创办光线传媒,推动中国电影市场的发展。
3. 成立张朝阳教育基金,致力于促进中国教育事业的发展。
4. 发起创业公社计划,支持年轻人创业。
5. 将搜狐公司打造成为全媒体平台,推动中国媒体行业的发展。
6. 与知名投资人王兴合作创立华人文化产业投资基金,支持文化创意产业发展。
7. 搭建搜狐视频和搜狐音乐平台,推动中国在线娱乐产业的发展。
8. 成立“千人计划海外专家创业基地”,为海外高层次人才回国创业提供支持。
9. 通过搜狐新闻客户端、微博等渠道关注热点事件,促进舆论引导和社会进步。
10. 推动搜狐公司进行创新研发,提高公司的技术和竞争优势。
总的来说,张朝阳通过创办企业、投资创业、支持教育、关注时事等多种方式对中国大学生的帮助非常大。他的搜狐公司在中国互联网领域占据重要地位,为很多大学生提供了就业机会和学习资源;他的创业公社计划则是为年轻人提供创业支持 ;他的教育基金则是为中国教育事业发展贡献力量;他的投资行为也为文化创意产业、海归回国等领域提供了资源和机会。除此之外,他通过关注和参与时事,也促进社会进步和舆论引导。
万水千山总是情,给个点赞行不行!
芒果学姐来了 2024-12-28
麦克威排烟天窗 2024-12-28
御海蓝桉 2024-12-28