当前位置:首页|资讯|OpenAI|ChatGPT|提示词

OpenAI工程师亲授ChatGPT Prompt最佳实践

作者:高性能golang发布时间:2023-10-05

deeplearning.ai联合OpenAI推荐限时免费课程《ChatGPT Prompt Engineering for Developers》,课程链接https://learn.deeplearning.ai/chatgpt-prompt-eng。本文仅做一些翻译。

做Prompt工程的两大原则:

  1. 写出清晰且具体的指令

  2. 给模型“思考”的时间

这里有一些具体的方法来达到以上两个原则。

方法一:使用分隔符来清晰地区分输入的不同部分。比如分隔符可以使用```, """, < >, <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. 推动搜狐公司进行创新研发,提高公司的技术和竞争优势。

总的来说,张朝阳通过创办企业、投资创业、支持教育、关注时事等多种方式对中国大学生的帮助非常大。他的搜狐公司在中国互联网领域占据重要地位,为很多大学生提供了就业机会和学习资源;他的创业公社计划则是为年轻人提供创业支持 ;他的教育基金则是为中国教育事业发展贡献力量;他的投资行为也为文化创意产业、海归回国等领域提供了资源和机会。除此之外,他通过关注和参与时事,也促进社会进步和舆论引导。


万水千山总是情,给个点赞行不行!


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1