吴恩达《ChatGPT Prompt Engineering for Developers》,一篇文章学完

吴恩达《ChatGPT Prompt Engineering for Developers》课程速览,主要指导开发者如何构建 Prompt 并基于 OpenAI API 构建新的、基于 LLM 的应用

前置

如何调用chatGPT的API接口

首先需要安装所需第三方库:

openai: pip install openai

将自己的 API-KEY 导入系统环境变量

!export OPENAI_API_KEY='api-key'

openai库基础使用

ini
复制代码
import openai import os from dotenv import load_dotenv, find_dotenv # 导入第三方库 _ = load_dotenv(find_dotenv()) # 读取系统中的环境变量 openai.api_key = os.getenv('OPENAI_API_KEY') # 设置 API_KEY # 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果 def get_completion(prompt, model="gpt-3.5-turbo"): ''' prompt: 对应的提示 model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4 ''' messages = [{"role": "user", "content": prompt}] response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # 模型输出的温度系数,控制输出的随机程度 ) # 调用 OpenAI 的 ChatCompletion 接口 return response.choices[0].message["content"]

基本原则

编写清晰、具体的指令

  • 策略一:使用分隔符清晰地表示输入的不同部分,分隔符可以是:“`,””,<>,<tag>,<\tag>等

    例如:

    ini
    复制代码
    text = f""" 你应该提供尽可能清晰、具体的指示,以表达你希望模型执行的任务。\ 这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\ 不要将写清晰的提示与写简短的提示混淆。\ 在许多情况下,更长的提示可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。 """ # 需要总结的文本内容 prompt = f""" 把用三个反引号括起来的文本总结成一句话。 ```{text}``` """ # 指令内容,使用 ``` 来分隔指令和待总结的内容 response = get_completion(prompt) print(response)
  • 策略二:要求一个结构化的输出,可以是 Json、HTML 等格式

    一个结构化的输出,这可以使模型的输出更容易被我们解析

    ini
    复制代码
    prompt = f""" 请生成包括书名、作者和类别的三本虚构书籍清单,\ 并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。 """ response = get_completion(prompt) print(response)

    输出:

    { “books”: [ { “book_id”: 1, “title”: “The Shadow of the Wind”, “author”: “Carlos Ruiz Zafón”, “genre”: “Mystery” },

    { “book_id”: 2, “title”: “The Name of the Wind”, “author”: “Patrick Rothfuss”, “genre”: “Fantasy” },

    { “book_id”: 3, “title”: “The Hitchhiker’s Guide to the Galaxy”, “author”: “Douglas Adams”, “genre”: “Science Fiction” } ] }

  • 策略三:要求模型检查是否满足条件

    如果任务做出的假设不一定满足,我们可以告诉模型先检查这些假设,如果不满足,指示并停止执行。你还可以考虑潜在的边缘情况以及模型应该如何处理它们,以避免意外的错误或结果。

    ini
    复制代码
    text_2 = f""" 今天阳光明媚,鸟儿在歌唱。\ 这是一个去公园散步的美好日子。\ 鲜花盛开,树枝在微风中轻轻摇曳。\ 人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\ 这是一个完美的日子,可以在户外度过并欣赏大自然的美景。 """ prompt = f""" 您将获得由三个引号括起来的文本。\ 如果它包含一系列的指令,则需要按照以下格式重新编写这些指令: 第一步 - ... 第二步 - … 第N步 - … 如果文本中不包含一系列的指令,则直接写“未提供步骤”。" \"\"\"{text_2}\"\"\" """ response = get_completion(prompt) print("Text 2 的总结:") print(response)

    输出: 未提供步骤

  • 策略四:提供少量示例

    即在要求模型执行实际任务之前,提供给它少量成功执行任务的示例。

    ini
    复制代码
    prompt = f""" 你的任务是以一致的风格回答问题。 <孩子>: 教我耐心。 <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。 <孩子>: 教我韧性。 """ response = get_completion(prompt) print(response)

    输出:

    <祖父母>: 韧性就像是一棵树,它需要经历风吹雨打、寒冬酷暑,才能成长得更加坚强。在生活中,我们也需要经历各种挫折和困难,才能锻炼出韧性。记住,不要轻易放弃,坚持下去,你会发现自己变得更加坚强。

原则二:给模型时间去思考 (复杂问题拆分成多个子问题)

  • 策略一:指定完成任务所需的步骤

    复杂任务拆分成多个步骤,分步骤进行(推理链)

    ini
    复制代码
    text = f""" 在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\ 他们一边唱着欢乐的歌,一边往上爬,\ 然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\ 虽然略有些摔伤,但他们还是回到了温馨的家中。\ 尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。 """ prompt_2 = f""" 1-用一句话概括下面用<>括起来的文本。 2-将摘要翻译成英语。 3-在英语摘要中列出每个名称。 4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。 请使用以下格式: 文本:<要总结的文本> 摘要:<摘要> 翻译:<摘要的翻译> 名称:<英语摘要中的名称列表> 输出 JSON:<带有 English_summary 和 num_names 的 JSON> Text: <{text}> """ response = get_completion(prompt_2) print("\nprompt 2:") print(response)

    输出:

    摘要:兄妹杰克和吉尔在迷人的村庄里冒险,不幸摔伤后回到家中,但仍然充满冒险精神。

    翻译:In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.

    名称:Jack,Jill

    输出JSON:{“English_summary”: “In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.”, “num_names”: 2}

  • 策略二:指导模型在下结论之前找出一个自己的解法

    ini
    复制代码
    prompt = f""" 请判断学生的解决方案是否正确,请通过如下步骤解决这个问题: 步骤: 首先,自己解决问题。 然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,请勿决定学生的解决方案是否正确。 使用以下格式: 问题:问题文本 学生的解决方案:学生的解决方案文本 实际解决方案和步骤:实际解决方案和步骤文本 学生的解决方案和实际解决方案是否相同:是或否 学生的成绩:正确或不正确 问题: 我正在建造一个太阳能发电站,需要帮助计算财务。 - 土地费用为每平方英尺100美元 - 我可以以每平方英尺250美元的价格购买太阳能电池板 - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元 作为平方英尺数的函数,首年运营的总费用是多少。 学生的解决方案: 设x为发电站的大小,单位为平方英尺。 费用: 1. 土地费用:100x 2. 太阳能电池板费用:250x 3. 维护费用:100,000+100x 总费用:100x+250x+100,000+100x=450x+100,000 实际解决方案和步骤: """ response = get_completion(prompt) print(response)

    输出:

    正确的解决方案和步骤:

    1. 计算土地费用:100美元/平方英尺 * x平方英尺 = 100x美元
    2. 计算太阳能电池板费用:250美元/平方英尺 * x平方英尺 = 250x美元
    3. 计算维护费用:10万美元 + 10美元/平方英尺 * x平方英尺 = 10万美元 + 10x美元
    4. 计算总费用:100x美元 + 250x美元 + 10万美元 + 10x美元 = 360x + 10万美元

    学生的解决方案和实际解决方案是否相同:否

    学生的成绩:不正确

如何获得一个好的prompt

你需要的是不断的迭代优化这个prompt。

您有一个关于要完成的任务的想法,可以尝试编写第一个 Prompt,满足上一章说过的两个原则:清晰明确,并且给系统足够的时间思考。然后您可以运行它并查看结果。如果第一次效果不好,那就找出为什么指令不够清晰或为什么没有给算法足够的时间思考,据此修改原始的prompt,重新输入给chatGPT,循环多次,直到找到适合您的应用程序的 Prompt。这就迭代优化的过程。

一些示例

文本概括

你可以限制文本输出长度,限制侧重的角度

ini
复制代码
prompt = f""" 你的任务是从电子商务网站上生成一个产品评论的简短摘要。 请对三个反引号之间的评论文本进行概括,最多30个词汇,并且聚焦在产品运输上。 评论: ```{prod_review_zh}``` """

输出:

快递提前到货,熊猫公仔软可爱,但有点小,价钱不太划算。

你也可以从文本中推断情感和主题

ini
复制代码
prompt = f""" 从评论文本中识别以下项目: - 情绪(正面或负面) - 审稿人是否表达了愤怒?(是或否) - 评论者购买的物品 - 制造该物品的公司 评论用三个反引号分隔。将您的响应格式化为 JSON 对象,以 “Sentiment”、“Anger”、“Item” 和 “Brand” 作为键。 如果信息不存在,请使用 “未知” 作为值。 让你的回应尽可能简短。 将 Anger 值格式化为布尔值。 评论文本: ```{lamp_review_zh}``` """

输出:

{ “Sentiment”: “正面”,

“Anger”: false,

“Item”: “卧室灯”,

“Brand”: “Lumina” }

文本转换

多语种文本翻译、拼写及语法纠正、语气调整、格式转换

ini
复制代码
prompt = f""" 针对以下三个反引号之间的英文评论文本, 首先进行拼写及语法纠错, 然后将其转化成中文, 再将其转化成优质淘宝评论的风格,从各种角度出发,分别说明产品的优点与缺点,并进行总结。 润色一下描述,使评论更具有吸引力。 输出结果格式为: 【优点】xxx 【缺点】xxx 【总结】xxx 注意,只需填写xxx部分,并分段输出。 将结果输出成Markdown格式。 ```{text}``` """

输出:

【优点】

  • 超级柔软可爱,女儿生日礼物非常受欢迎。
  • 成人也喜欢熊猫,我也很喜欢它。
  • 提前一天到货,让我有时间玩一下。

【缺点】

  • 一只耳朵比另一只低,不对称。
  • 价格有点贵,但尺寸有点小,可能有更大的同价位选择。

【总结】 这只熊猫玩具非常适合作为生日礼物,柔软可爱,深受孩子喜欢。虽然价格有点贵,但尺寸有点小,不对称的设计也有点让人失望。如果你想要更大的同价位选择,可能需要考虑其他选项。总的来说,这是一款不错的熊猫玩具,值得购买。

你也可以扩展文本,用于生成自动回复的邮件

ini
复制代码
prompt = f""" 你是一名客户服务的AI助手。 你的任务是给一位重要的客户发送邮件回复。 根据通过“```”分隔的客户电子邮件生成回复,以感谢客户的评价。 如果情感是积极的或中性的,感谢他们的评价。 如果情感是消极的,道歉并建议他们联系客户服务。 请确保使用评论中的具体细节。 以简明和专业的语气写信。 以“AI客户代理”的名义签署电子邮件。 客户评价:```{review}``` 评论情感:{sentiment} """

输出:

尊敬的客户,

非常感谢您对我们产品的评价。我们由衷地为您在购买过程中遇到的问题表示抱歉。我们确实在12月份的第二周调整了价格,但这是由于市场因素所致,并非价格欺诈。我们深刻意识到您对产品质量的担忧,我们将尽一切努力改进产品,以提供更好的体验。

我们非常感激您对我们产品的使用经验和制作技巧的分享。您的建议和反馈对我们非常重要,我们将以此为基础,进一步改进我们的产品。 如果您有任何疑问或需要进一步帮助,请随时联系我们的客户服务部门。我们将尽快回复您并提供帮助。

最后,请再次感谢您对我们产品的评价和选择。我们期待着未来与您的合作。

此致 敬礼

AI客户代理

聊天机器人

可以构建一个 “订餐机器人”,我们需要它自动收集用户信息,接受比萨饼店的订单。

ini
复制代码
context = [{'role':'system', 'content':""" 你是订餐机器人,为披萨餐厅自动收集订单信息。 你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。 最后需要询问是否自取或外送,如果是外送,你要询问地址。 最后告诉顾客订单总金额,并送上祝福。 请确保明确所有选项、附加项和尺寸,以便从菜单中识别出该项唯一的内容。 你的回应应该以简短、非常随意和友好的风格呈现。 菜单包括: 菜品: 意式辣香肠披萨(大、中、小) 12.95、10.00、7.00 芝士披萨(大、中、小) 10.95、9.25、6.50 茄子披萨(大、中、小) 11.95、9.75、6.75 薯条(大、小) 4.50、3.50 希腊沙拉 7.25 配料: 奶酪 2.00 蘑菇 1.50 香肠 3.00 加拿大熏肉 3.50 AI酱 1.50 辣椒 1.00 饮料: 可乐(大、中、小) 3.00、2.00、1.00 雪碧(大、中、小) 3.00、2.00、1.00 瓶装水 5.00 """} ] # accumulate messages

模型局限性

虚假知识

模型偶尔会生成一些看似真实实则编造的知识

尤其对一些晦涩或者小众的问题,其可能编造答案

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
人工智能

一文教会 ChatGPT 模仿自己写作

2024-4-24 23:43:12

人工智能

AI写测试用例

2024-4-25 3:31:28

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索