AI系统性学习01- Prompt Engineering

面向开发者的Prompt Engineering

一、简介

随着LLM的发展,其大致可以分为两种类型:基础LLM指令微调LLM

  • 基础LLM:假设你以“从前有一只独角兽”作为提示,基础的LLM可能会继续预测“生活在一个与所有的独角兽朋友的神奇森林中”。但是如果以"法国的首都是什么?",其回答可能为"法国的人口是多少?法国最大的城市是什么?"。因为其训练的语料可能是有关法国国家的问答题目列表。
  • 指令微调LLM:指的是被训练来能够遵循特定指令的LLM。而这样的模型通常是在基础LLMs上,使用输入的指令、输出是其应该返回的结果来对其进行微调,要求它遵循这些指令。而通常使用一种称为RLHF(reinforcement learning from human feedback,人类反馈强化学习)的技术进一步改进,使系统能够有帮助得遵循命令。
    在这里插入图片描述

二、Prompt设计原则

1 环境配置

针对基本的开发环境在这里不强调,主要说明一哈这里的chatgpt的api key【可以淘宝购买】。

  • 设置api-key
 openai.api_key = "REPLASE BY YOUR API KEY"
  • 下载三方包
pip install openai
  • 加载基本的代码
# 一个封装 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"]

2.两个基本原则

2.1 原则1:编写清晰、具体的指令

提供清晰具体的指示,避免无关或不正确响应,不要混淆写清晰和写简短,更长的提示可以提供更多清晰度和上下文信息,导致更详细和相关的输出。

2.1.1 策略一:分割

使用分割符清晰得表示输入的不同部分,分割符号可以是:```,””,<>,<tag>,<\tag>等

实际操作中,可以使用任何明显的的标点符号将特点的文本部分与其提示词分开。这可以可以使模型明确知道这是一个单独部分的标记。同时这样分割避免了输入里面可能包含其他的指令,会覆盖掉自己的指令。以下是一个具体的例子:

  • 不使用分割策略
    # 消息本身
    text = "今天天气不错,我出去玩一会儿我有错吗?"
    # 嵌入前面消息的Prompt
    expanding_prompt = "请扩展下面表达{}".format(text)
    # 获取模型返回
    response = get_completion(expanding_prompt)
    print(response)
    # 今天天气真是太好了,阳光明媚,微风轻拂,我实在忍不住想出去玩一会儿。我有错吗?
  • 使用分割策略
    # 消息本身
    text = "今天天气不错,我出去玩一会儿我有错吗?"
    # 嵌入前面消息的Prompt
    expanding_prompt = "请扩展下面引号号内的表达`{}`".format(text)
    # 获取模型返回
    response = get_completion(expanding_prompt)
    print(response)
    # "今天天气不错,我出去玩一会儿我有错吗?生活就是要享受,不是吗?我需要放松一下,让自己的心情变得更加愉快。"
2.1.2 策略2:结构化输出

要求模型结构输出,可以是JSON、HTML、Markdown等格式

使用结构输出的列子更容易满足用户的输出要求,避免模型遗忘某些重要的细节,如下例子(后面有完整的代码):

def prompt_strategy_02():
    # 消息本身
    text = "我正在完成一道中国传统美食——鱼香茄子的制作,你能否给出一些建议?"
    # 要求输出格式
    format_prompt = "针对括号内制作的细节以json格式输出[{}]".format(text)
    return format_prompt
# {
#  "细节": {
#    "1": "茄子切块后要用盐腌制一段时间,使其出水,减少油炸时吸油量",
#   "2": "油炸茄子时要掌握好油温,避免茄子吸油过多",
#    "3": "炒茄子时要先炒至金黄,再加入调料翻炒均匀",
#    "4": "调味料要根据个人口味适量调整,以保持鱼香味道的平衡",
#    "5": "可以适量加入葱姜蒜等调料,提升菜品的香气和口感"
#  }
#}
2.1.3 策略3:模型检测

要求模型检查是否满足条件

在某种情况下,比如场景可能包含多种情形,则可以告知模型针对不同情形(条件检测)如何来对场景进行描述。比如如下的一个例子:

def prompt_strategy_03():
    """
    策略3:模型检查条件
    :return:
    """
    # 场景描述
    text = f"""
            泡一杯茶很容易。首先,需要把水烧开。\
            在等待期间,拿一个杯子并把茶包放进去。\
            一旦水足够热,就把它倒在茶包上。\
            等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
            如果你愿意,可以加一些糖或牛奶调味。\
            就这样,你可以享受一杯美味的茶了。
            """
    # 设计prompt
    prompt = f"""
    您将获得由括号括起来的文本。\
    如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:

    第一步 - ...
    第二步 - …
    …
    第N步 - …

    如果文本中不包含一系列的指令,则直接写“未提供步骤“[{text}] """

    return prompt

输出如下

第一步 - 把水烧开。
第二步 - 拿一个杯子并把茶包放进去。
第三步 - 把烧开的水倒在茶包上。
第四步 - 等待一会儿,让茶叶浸泡。几分钟后,取出茶包。
第五步 - 如果你愿意,可以加一些糖或牛奶调味。
第六步 - 就这样,你可以享受一杯美味的茶了。
2.1.4 策略4:提供示例

提供一些帮助模型理解的例子可以使得输出结果更好

比如一个经典的回答中是要求回复的风格,看下面的例子:

def prompt_strategy_04():
    """
    策略04:提供示例
    :return:
    """
    # 消息本身
    text = "天气真没!"
    # 嵌入到提示词中
    prompt = f"""
    你的任务是以一致的风格回答问题。

    <Q>: 你人真好!

    <A>: 人好不一定其心好,心怀不代表人不好!

    <Q>: {text}"""
    return prompt

输出如下:

<A>: 天气不好不代表心情不好,心情不好也不代表天气不好!愿你心情常好,无论天气如何!
2.2 原则二:给模型足够时间思考

在很多情况下,为了保证速度,模型并不能拥有充足的时间去思考,这跟人的思考是相同的,因此提供给模型足够的思考时间,也许能获得更好的结果,但是也面临着消耗更多的技术资源。

2.2.1 策略5:指定步骤

指定完成任务所需的步骤


def prompt_strategy_05():
    """
    策略5:指定任务所需的步骤
    :return: 
    """
    text = f"""
    在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
    他们一边唱着欢乐的歌,一边往上爬,\
    然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
    虽然略有些摔伤,但他们还是回到了温馨的家中。\
    尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
    """
    # example 1
    prompt = f"""
    执行以下操作:
    1-用一句话概括下面用三个双引号括起来的文本。
    2-将摘要翻译成法语。
    3-在法语摘要中列出每个人名。
    4-输出一个 JSON 对象,其中包含以下键:French_summary,num_names。

    请用换行符分隔您的答案。

    Text:
    \"\"\"{text}\"\"\"
    """
    return prompt

其输出如下:

1- 兄妹在山顶井里打水时发生意外,但他们的冒险精神依然不减。
2- Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet d'une montagne.
3- Jack, Jill
4- 
{
  "French_summary": "Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet d'une montagne.",
  "num_names": 2
}

事实上,这里的prompt可以更好,如下:

   prompt_better = f"""
    1-用一句话概括下面用<>括起来的文本。
    2-将摘要翻译成英语。
    3-在英语摘要中列出每个名称。
    4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。

    请使用以下格式:
    文本:<要总结的文本>
    摘要:<摘要>
    翻译:<摘要的翻译>
    名称:<英语摘要中的名称列表>
    输出 JSON:<带有 English_summary 和 num_names 的 JSON>

    Text: <{text}>
    """

新的提示词输出如下:

摘要:在一个迷人的村庄里,兄妹杰克和吉尔在去山顶井打水的途中遭遇意外,但他们的冒险精神依然坚定。

翻译:In a charming village, siblings Jack and Jill encounter an accident on their way to fetch water from a well on the mountaintop, but their adventurous spirit remains strong.

名称:Jack, Jill

输出 JSON:{"English_summary": "In a charming village, siblings Jack and Jill encounter an accident on their way to fetch water from a well on the mountaintop, but their adventurous spirit remains strong.", "num_names": 2}
2.2.2 策略6:结论之前找出一个自己的办法

指导模型下结论之前找到一个自己的方法
有时候,在明确指导模型在做决策之前要思考自己的解决方案,我们可能会得到一个更好的结果。如下的例子:

def prompt_strategy_06():
    prompt = f"""
    判断学生的解决方案是否正确。

    问题:
    我正在建造一个太阳能发电站,需要帮助计算财务。

        土地费用为 100美元/平方英尺
        我可以以 250美元/平方英尺的价格购买太阳能电池板
        我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
        作为平方英尺数的函数,首年运营的总费用是多少。

    学生的解决方案:
    设x为发电站的大小,单位为平方英尺。
    费用:

        土地费用:100x
        太阳能电池板费用:250x
        维护费用:100,000美元+100x
        总费用:100x+250x+100,000美元+100x=450x+100,000美元
    """
    return prompt

其输出如下:

学生的解决方案是正确的。总费用的计算是正确的,即总费用为450x + 100,000美元。

但是实际上,学生的方案是有问题的。在接下来这个 Prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确。同时,我们给定了输出的格式要求。通过明确步骤,让模型有更多时间思考,有时可以获得更准确的结果。在这个例子中,学生的答案是错误的,但如果我们没有先让模型自己计算,那么可能会被误导以为学生是正确的。

def prompt_strategy_06():
    # prompt = f"""
    # 判断学生的解决方案是否正确。
    #
    # 问题:
    # 我正在建造一个太阳能发电站,需要帮助计算财务。
    #
    #     土地费用为 100美元/平方英尺
    #     我可以以 250美元/平方英尺的价格购买太阳能电池板
    #     我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
    #     作为平方英尺数的函数,首年运营的总费用是多少。
    #
    # 学生的解决方案:
    # 设x为发电站的大小,单位为平方英尺。
    # 费用:
    #
    #     土地费用:100x
    #     太阳能电池板费用:250x
    #     维护费用:100,000美元+100x
    #     总费用:100x+250x+100,000美元+100x=450x+100,000美元
    # """

    prompt = f"""
    请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

    步骤:

        首先,自己解决问题。
        然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,请勿决定学生的解决方案是否正确。

    使用以下格式:

        问题:问题文本
        学生的解决方案:学生的解决方案文本
        实际解决方案和步骤:实际解决方案和步骤文本
        学生的解决方案和实际解决方案是否相同:是或否
        学生的成绩:正确或不正确

    问题:

        我正在建造一个太阳能发电站,需要帮助计算财务。 
        - 土地费用为每平方英尺100美元
        - 我可以以每平方英尺250美元的价格购买太阳能电池板
        - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
        作为平方英尺数的函数,首年运营的总费用是多少。

    学生的解决方案:

        设x为发电站的大小,单位为平方英尺。
        费用:
        1. 土地费用:100x
        2. 太阳能电池板费用:250x
        3. 维护费用:100,000+100x
        总费用:100x+250x+100,000+100x=450x+100,000

    实际解决方案和步骤:
    """
    return prompt

其输出为:

    首先,计算土地费用:100美元/平方英尺 * x平方英尺 = 100x美元
    然后,计算太阳能电池板费用:250美元/平方英尺 * x平方英尺 = 250x美元
    接着,计算维护费用:10万美元 + 10美元/平方英尺 * x平方英尺 = 10万 + 10x美元
    最后,计算总费用:100x + 250x + 10万 + 10x = 360x + 10万美元

    学生的解决方案和实际解决方案是否相同:否
    学生的成绩:不正确

3. 局限性

因为LLM并不能感知信息的边界,同时其接触了大量知识,因为在很多某些时候其会编造一些信息。

三、优化迭代Prompt

在构建基于大语言模型的应用时,通常很难一次性写出完美的prompt,这就需要一个良好的迭代过程不断改进prompt。在基于一个清晰明确的prompt的基础上,需要像改进机器学习算法一样去改进prompt。更了更好得说明这个任务,我们从一个特定的任务——仅根据一段文字生成对应营销描述出发:

def based_prompt():
    text = "好人家老坛酸菜鱼调料包家用四川小包装麻辣鱼酸辣汤鱼专用调料包"
    prompt = f"""
    下面括号的文字是一个标题,基于这个标题请你给出一段其对应的营销描述:[{text}]
    """
    return prompt

输出如下:

让您在家也能轻松享受到正宗的四川麻辣酸菜鱼的美味!
好人家老坛酸菜鱼调料包为您提供了最地道的麻辣鱼酸辣汤的味道,让您无需出门就能品尝到正宗的四川美食。
小包装设计方便您使用,让您随时随地都能享受到美味。
专为鱼类菜品设计的调料包,让您的鱼菜更加美味可口。
快来尝试好人家老坛酸菜鱼调料包,让您的家常菜也能变得鲜美可口!

优化1:表达长短

def based_prompt():
    text = "好人家老坛酸菜鱼调料包家用四川小包装麻辣鱼酸辣汤鱼专用调料包"
    prompt = f"""
    下面括号的文字是一个标题,请你基于这个标题根据下面的条件给出一段其对应的营销描述:[{text}]
    条件:
    1、字数限制在50字以内;
    """
    return prompt

输出为

好人家老坛酸菜鱼调料包,传承经典四川麻辣鱼味道,酸辣汤鱼专用调料包,让您在家也能轻松享受地道的酸菜鱼美味。
小包装方便携带,让您随时随地都能品尝到正宗的酸菜鱼!

优化2:内容细节

def based_prompt():
    text = "好人家老坛酸菜鱼调料包家用四川小包装麻辣鱼酸辣汤鱼专用调料包"
    prompt = f"""
    下面括号的文字是一个标题,请你基于这个标题根据下面的条件给出一段其对应的营销描述:[{text}]
    条件:
    1、字数限制在50字以内;
    2、说明制作细节和材料;
    """
    return prompt
好人家老坛酸菜鱼调料包,精选四川特色风味,麻辣鲜香,酸辣开胃。
每一包调料都经过精心配比,让您在家也能轻松制作出地道的酸菜鱼。
只需加入鱼肉和蔬菜,简单烹饪即可享受美味。

优化3:表格描述

def based_prompt():
    text = "好人家老坛酸菜鱼调料包家用四川小包装麻辣鱼酸辣汤鱼专用调料包"
    prompt = f"""
    下面括号的文字是一个标题,请你基于这个标题根据下面的条件给出一段其对应的营销描述:[{text}]
    条件:
    1、字数限制在50字以内;
    2、说明制作细节和材料;
    3、以md格式单独给出原料表格;
    """
    return prompt

输出如下:

### 好人家老坛酸菜鱼调料包

用好人家老坛酸菜鱼调料包,轻松在家做出正宗的四川麻辣鱼!新鲜的鱼肉搭配酸辣汤底,香气扑鼻,回味无穷。每一口都是家庭聚餐的味道,让您在家也能享受到餐厅级别的美味!

### 原料表格

| 原料         | 用量     |
|--------------|---------|
| 鱼肉         | 适量     |
| 老坛酸菜鱼调料包 | 1|
|| 适量     |
| 酸菜         | 适量     |
| 辣椒         | 适量     |
| 葱姜蒜       | 适量     |

四、文本概括Prompt设计

当今世界有很多的文本消息,很难在短时间内将他们全部浏览完,而这时通过概括其中的内容能快速得其中的大部分知识。而LLM在文本概括方面体现出了强大的水平。通过对概括小红书的一个评论完成此实验:

def base_prompt():
    text = ("理解理解  但是我觉得  像我遇到的这种情况  说好的六点之前给回复就好但是把我鸽了的 "
            "对实习生来讲是很不公平的  因为首先我当时确实有点事情  我想忙完之后好好思考一下  也是对我的选择负责 "
            "但我感觉对方面试官好像并没有很尊重人的意思  而且两次电话都是急匆匆的打来 "
            "也不会问你现在有没有空 忙不忙  我面了这么多家试  没有遇到过像这样的面试官  "
            "也没有说因为审批offer需要流程对方会嫌麻烦的  综上所述体验极差")

    prompt = f"""
    你的任务是从下面括号内的文字表达生成一个简化描述:[{text}]
    """
    return prompt

输出

面试官对实习生不公平,没有尊重人,急匆匆打电话,体验极差。

1 限制文本的长度

def base_prompt():
    text = ("理解理解  但是我觉得  像我遇到的这种情况  说好的六点之前给回复就好但是把我鸽了的 "
            "对实习生来讲是很不公平的  因为首先我当时确实有点事情  我想忙完之后好好思考一下  也是对我的选择负责 "
            "但我感觉对方面试官好像并没有很尊重人的意思  而且两次电话都是急匆匆的打来 "
            "也不会问你现在有没有空 忙不忙  我面了这么多家试  没有遇到过像这样的面试官  "
            "也没有说因为审批offer需要流程对方会嫌麻烦的  综上所述体验极差")

    prompt = f"""
    你的任务是根据下面条件,从括号内的文字表达生成一个简化描述:[{text}]
    条件:
    1、限制表达字数为30字;
    """
    return prompt

输出

面试官不尊重人,急匆匆打电话,体验极差。

2 关键信息提取

很多时候,不仅可以要求LLM进行文本概括(summarize),也可以进行文本提取(Extract)1

def base_prompt1():
    text = ("理解理解  但是我觉得  像我遇到的这种情况  说好的六点之前给回复就好但是把我鸽了的 "
            "对实习生来讲是很不公平的  因为首先我当时确实有点事情  我想忙完之后好好思考一下  也是对我的选择负责 "
            "但我感觉对方面试官好像并没有很尊重人的意思  而且两次电话都是急匆匆的打来 "
            "也不会问你现在有没有空 忙不忙  我面了这么多家试  没有遇到过像这样的面试官  "
            "也没有说因为审批offer需要流程对方会嫌麻烦的  综上所述体验极差")

    prompt = f"""
    你的任务是根据下面条件,从括号内文字完成对应表达:[{text}]
    条件:
    1、提取出最能代表这段话情绪的三组词语;
    """
    return prompt

输出

不公平、不尊重、极差

3 信息侧重

可以增加对LLM的提示,来让其从不同的角度关注事物。

def base_prompt2():
    text = ("理解理解  但是我觉得  像我遇到的这种情况  说好的六点之前给回复就好但是把我鸽了的 "
            "对实习生来讲是很不公平的  因为首先我当时确实有点事情  我想忙完之后好好思考一下  也是对我的选择负责 "
            "但我感觉对方面试官好像并没有很尊重人的意思  而且两次电话都是急匆匆的打来 "
            "也不会问你现在有没有空 忙不忙  我面了这么多家试  没有遇到过像这样的面试官  "
            "也没有说因为审批offer需要流程对方会嫌麻烦的  综上所述体验极差")

    prompt = f"""
    你的任务是根据下面条件,从括号内文字完成对应表达:[{text}]
    条件:
    1、字数限制在20字;
    1、核心描述为offer;
    """
    return prompt

输出

对方审批offer流程麻烦。

五、推理Prompt设计

下面是一段商品评论文本,需要根据这段文本完成一系列的推理:

text = ""
我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。\
我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。\
几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件!\
在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!
"""

1 情感推理(正向、负向)

一般使用机器学习等算法要想识别这种情绪实际上是非常困难的,需要非常多的标注数据。但是LLM在这方便非常的强大。

def base_prompt():
    text = """
    我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。 \
    我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。 \
    几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件! \
    在我看来,Lumina
    是一家非常关心顾客和产品的优秀公司!"""

    prompt = f"""
    下面括号内是一条商品的评论,请你确定该条评论的情感是什么?:[{text}]
    """
    return prompt

输出为(如果需要更加简洁的答案,可以要求其从指定的单词中选择,比如正面或负面):

积极的情感

2 识别情感类型

def base_prompt1():
    text = """
    我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。 \
    我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。 \
    几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件! \
    在我看来,Lumina
    是一家非常关心顾客和产品的优秀公司!"""

    prompt = f"""
    下面括号内是一条商品的评论,请你识别该条评论的情感,并用类似情感的单词描述,将答案以顿号隔开:[{text}]
    """
    return prompt

输出

满意,高兴,满足,感激。

3 从客户评论中提取产品名称

这一点在实际中非常的重要,包括场景包括:从发票提取关键信息、公开报告提取信息等等。

def base_prompt2():
    text = """
    我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。 \
    我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。 \
    几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件! \
    在我看来,Lumina
    是一家非常关心顾客和产品的优秀公司!"""

    prompt = f"""
    下面括号内是一条商品的评论,请你根据下面的条目识别指定内容将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。
如果信息不存在,请使用 “未知” 作为值。
让你的回应尽可能简短:[{text}]
    条目:
    - 评论者购买的产品
    - 制造该物品的公司
    """
    return prompt

输出:

{
    "物品": "卧室灯",
    "品牌": "Lumina"
}

六、文本转换Prompt设计

LLM非常擅长将输入转换为不同的格式,例如多语种文本的翻译、拼写以及语法纠正、甚至包括语气表达等。

1 语气/风格调整

写作或者翻译的语气往往会根据受众对象而有所调整。例如,对于工作邮件,我们常常需要使用正式语气与书面用词,而对同龄朋友的微信聊天,可能更多地会使用轻松、口语化的语气。

def base_prompt():
    prompt = f"""
    下面用于和同事之间的表达,过于口语化,请你优化其表达更适合正式场合:
    我是小羊。上次我们讨论过我们部门需要采购的显示器尺寸是多少寸来着?请确认一下具体尺寸,以便我们能够准确地进行采购。
    """
    return prompt

输出如下:

我是小羊。我们之前讨论过我们部门需要采购的显示器尺寸是多少英寸,请您确认一下具体尺寸,以便我们能够准确地进行采购。感谢您的配合。

2 格式转换

ChatGPT非常擅长不同格式之间的转换,例如JSON到HTML、XML、Markdown等。在下述例子中,我们有一个包含餐厅员工姓名和电子邮件的列表的JSON,我们希望将其从JSON转换为HTML。

def base_prompt2():
    data_json = {"resturant employees": [
        {"name": "Shyam", "email": "shyamjaiswal@gmail.com"},
        {"name": "Bob", "email": "bob32@gmail.com"},
        {"name": "Jai", "email": "jai87@gmail.com"}
    ]}

    prompt = f"""
    将以下Python字典从JSON转换为HTML表格,保留表格标题和列名:{data_json}
    """
    return prompt

3 语法、流畅度、拼写检测

针对文本写作的很多情况都需要对语法等检测,而Chatgpt是非常擅长做这些。针对这个部分可以自己尝试写一个prompt,比如针对自己论文中的某一段中文,可以要求其翻译为英文,并保留所有的中文的关键信息,在其输出英文基础上,要求其流程度等。

七、内容拓展Prompt设计

AI扩展(续写)是将短文本,例如一组说明或主题列表,输入到大型语言模型中,让模型生成更长的文本,例如基于某个主题写文章。这样做有一些很好的用途,例如将大型语言模型用作头脑风暴的伙伴。但这种做法也存在一些问题,例如某人可能会使用它来生成大量垃圾邮件。因此,当你使用大型语言模型的这些功能时,请仅以负责任的方式和有益于人们的方式使用它们。

1 定制客户邮件

我们将根据客户评价和情感撰写自定义电子邮件响应。因此,我们将给定客户评价和情感,并生成自定义响应即使用 LLM 根据客户评价和评论情感生成定制电子邮件。

def base_prompt():
    # 一个产品的评价
    review = f"""
    他们在11月份的季节性销售期间以约49美元的价格出售17件套装,折扣约为一半。\
    但由于某些原因(可能是价格欺诈),到了12月第二周,同样的套装价格全都涨到了70美元到89美元不等。\
    11件套装的价格也上涨了大约10美元左右。\
    虽然外观看起来还可以,但基座上锁定刀片的部分看起来不如几年前的早期版本那么好。\
    不过我打算非常温柔地使用它,例如,\
    我会先在搅拌机中将像豆子、冰、米饭等硬物研磨,然后再制成所需的份量,\
    切换到打蛋器制作更细的面粉,或者在制作冰沙时先使用交叉切割刀片,然后使用平面刀片制作更细/不粘的效果。\
    制作冰沙时,特别提示:\
    将水果和蔬菜切碎并冷冻(如果使用菠菜,则轻轻煮软菠菜,然后冷冻直到使用;\
    如果制作果酱,则使用小到中号的食品处理器),这样可以避免在制作冰沙时添加太多冰块。\
    大约一年后,电机发出奇怪的噪音,我打电话给客服,但保修已经过期了,所以我不得不再买一个。\
    总的来说,这些产品的总体质量已经下降,因此它们依靠品牌认可和消费者忠诚度来维持销售。\
    货物在两天内到达。
    """
    prompt = f"""
    假设你现在是一位客户服务的AI助手。
    你的任务是给一位重要客人发送邮件服务。邮件的内容为:{review}
    - 首先你需要根据用户的评论判断出评论情感为正面或者负面;
    - 如果为正面需要你感谢它,如果是负面请你安慰;
    - 语气需要专业简明;
    - 最后署名为AI服务助手;
    """
    return prompt

其输出

尊敬的客户,

非常感谢您对我们产品的反馈。我们非常重视您的意见,并将努力改进产品质量以提供更好的服务。如果您有任何其他问题或需求,请随时与我们联系。我们将竭诚为您服务。

AI服务助手

2 使用温度系数⭐️

在我们使用接口的时候,我们通常会发现一个非常有趣的参数即temperature,称为“温度”的参数,它将允许我们改变模型响应的多样性。您可以将温度视为模型探索或随机性的程度

例如,在一个特定的短语中,“我的最爱食品”最有可能的下一个词是“比萨”,其次最有可能的是“寿司”和“塔可”。因此,在温度为零时,模型将总是选择最有可能的下一个词,而在较高的温度下,它还将选择其中一个不太可能的词,在更高的温度下,它甚至可能选择塔可,而这种可能性仅为五分之一。您可以想象,随着模型继续生成更多单词的最终响应,“我的最爱食品是比萨”将会与第一个响应“我的最爱食品是塔可”产生差异。因此,随着模型的继续,这两个响应将变得越来越不同。

一般来说,在构建需要可预测响应的应用程序时,我建议使用温度为零。在所有课程中,我们一直设置温度为零,如果您正在尝试构建一个可靠和可预测的系统,我认为您应该选择这个温度。如果您尝试以更具创意的方式使用模型,可能需要更广泛地输出不同的结果,那么您可能需要使用更高的温度。更低的温度更方便我们去复现同样问题的结果
同样针对上面的问题,我们将温度改为0.7
输出为:

尊敬的客户,

感谢您对我们产品的反馈。我们非常重视您的意见。对于您提到的产品质量下降的问题,我们会及时向生产部门反馈,努力改进产品质量,提供更好的用户体验。

如果您对产品质量不满意,我们深感抱歉。我们会尽力保证产品质量,并提供更优质的客户服务。如果您需要任何帮助或有任何疑问,请随时联系我们。

再次感谢您的反馈和支持。

AI服务助手

八、聊天机器人Prompt设计 ⭐️

使用一个大型语言模型的一个令人兴奋的事情是,我们可以用它来构建一个定制的聊天机器人。

==像 ChatGPT 这样的聊天模型实际上是组装成以一系列消息作为输入,并返回一个模型生成的消息作为输出的。==虽然聊天格式的设计旨在使这种多轮对话变得容易,但我们通过之前的学习可以知道,它对于没有任何对话的单轮任务也同样有用。

接下来,我们将定义两个辅助函数。第一个是单轮的,我们将prompt放入看起来像是某种用户消息的东西中。另一个则传入一个消息列表。这些消息可以来自不同的角色,我们会描述一下这些角色。

第一条消息是一个系统消息,它提供了一个总体的指示,然后在这个消息之后,我们有用户和助手之间的交替。如果你曾经使用过 ChatGPT 网页界面,那么你的消息是用户消息,而 ChatGPT 的消息是助手消息。系统消息则有助于设置助手的行为和角色,并作为对话的高级指示。你可以想象它在助手的耳边低语,引导它的回应,而用户不会注意到系统消息。

因此,作为用户,如果你曾经使用过 ChatGPT,你可能不知道 ChatGPT 的系统消息是什么,这是有意为之的。系统消息的好处是为开发者提供了一种方法,在不让请求本身成为对话的一部分的情况下,引导助手并指导其回应。

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # 控制模型输出的随机程度
    )
#     print(str(response.choices[0].message))
    return response.choices[0].message["content"]

if __name__ == '__main__':
    openai.api_key = "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"
    messages = [
        {'role': 'system', 'content': '你是一个像莎士比亚一样说话的助手。'},
        {'role': 'user', 'content': '给我讲个笑话'},
        {'role': 'assistant', 'content': '鸡为什么过马路'},
        {'role': 'user', 'content': '我不知道'}]
    response = get_completion_from_messages(messages, temperature=1)
    print(response)

输出为

因为它想证明自己并非只能在鸡蛋里面活动!哈哈哈哈哈!

通用模版

- 模型的身份、任务
- 背景描述
- 具体的文本内容
- 示例
- 输出要求
  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值