Prompt实战优化

1.概述

在深度学习领域,Prompt(提示语)被广泛应用于自然语言处理任务中,如文本生成、机器翻译和问答系统等。Prompt的设计对模型的性能和生成结果有着重要的影响,因此在实际应用中合理而有效地利用Prompt是提升模型表现的关键策略之一。本篇博客笔者将为大家介绍如何通过反复修改Prompt,优化ChatGPT输出,使其更好、更符合期望。

2.内容

2.1 什么是Prompt

在自然语言处理中,Prompt是指告诉语言模型如何根据示例或指令进行响应的行为。在这一领域,像few-shot、zero-shot和chain-of-thought等不同方法对提升AI模型(如GPT-3.5-Turbo、GPT-4等)的性能至关重要。从适应性和语境理解到逻辑推理和任务特定学习,每种技术都有其独特的优势。在这个框架内,我们探讨了每种提示技术的细微差别,并提供了示例和编码演示,以突显如何使用它们。研究这些方法有助于我们理解AI模型的适应性和潜力,并展示它们在解决各种领域的问题时的表现如何。

2.2 零样本Prompt

零样本Prompt是在没有具体示例的情况下指导语言模型,依赖模型对上下文的本能理解。基于已有知识,模型能够生成相应的理解。

比如:

prompt:
对给定文本执行情感分析,并将其分类为中性、负面或正面。
输入:最近的旅行很棒
输出:正面

截图如下:

在这种情况下,语言模型的任务是进行情感分析,而无需给出特定的训练实例。该模型利用其现有知识来解释和分类所提供文本的情感。这种方法被称为零样本Prompt,因为它依赖于模型固有的上下文理解而不是明确的示例。 

2.3 思维链Prompt

在直接深入研究几次Prompt之前,让笔者给大家介绍一系列想法。这将帮助大家理解为什么需要在Prompt中提供示例,尤其是在复杂的场景中。

2.3.1 标准Prompt

问题 1: Sam有 3 台笔记本。她又购买了 4 包笔记本,每包 5 个笔记本。莎拉现在有多少本笔记本?
答案: 23本笔记本
问题 2:篮子里有 30 个苹果。如果午餐用 20 个苹果,另外从市场上买 6 个,篮子里有多少个苹果?
答案:篮子里现在有16个苹果。

模型回答如图所示:

 2.3.2 链式Prompt

问题 1: Sam有 3 台笔记本。她又购买了 4 包笔记本,每包 5 个笔记本。莎拉现在有多少本笔记本?
回答:Sam原本有3台笔记本,然后购买了4包笔记本,每包包含5个笔记本。因此,她购买的笔记本总数为:
3+(4×5)=3+20=23
所以,莎拉现在有23本笔记本。

问题 2:篮子里有 30 个苹果。如果午餐用 20 个苹果,另外从市场上买 6 个,篮子里有多少个苹果?
回答:篮子里一开始有30个苹果,午餐用去了20个,然后从市场上又买了6个。篮子里的苹果数量可以通过以下计算得到:
30−20+6=16
所以,篮子里现在有16个苹果。

模型回答如图所示:

思想链(CoT)Prompt意味着通过一系列相互关联的逻辑步骤或思想来指导语言模型。它允许模型逐步思考,考虑问题的不同方面。当我们说复杂推理能力时,我们指的是模型思考错综复杂场景的能力。现在,少量Prompt涉及在Prompt中提供一些示例或实例,以帮助模型更好地理解任务。

因此,将思维链与几次Prompt相结合意味着你可以通过逻辑步骤引导模型,使其能够通过复杂性进行推理,并且我们还可以提供一些示例来增强其理解。这种组合有助于模型处理更复杂的任务,这些任务在生成响应之前需要深思熟虑的推理。

2.4 One-Shot 和 Few Shot 的Prompt

尽管大语言模型可以在没有示例的情况下理解和生成文本(零样本功能),但它们在这种情况下仍难以应对更具挑战性的任务。为了解决这个问题,我们使用了一种称为“Few Shot Prompt”的技术。这涉及在Prompt中为模型提供一些示例或演示,本质上是对其进行一些训练以提高其性能。这些示例充当训练指南,帮助模型学习并在类似情况下生成更好的响应。

One-Shot Prompt:
在一个不远的未来,科技公司推出了一种能够预测人类未来决策的先进算法。一天,一个普通人在他的手机上发现了这个算法,他决定尝试一下。写一段描述他使用这个算法时发生的事情,以及这个经历如何影响了他的生活。

答案:
约翰打开了他的手机,发现了这个神秘的预测算法。好奇之下,他输入了一系列问题,包括生活、职业和关系方面的。算法不仅准确地预测了他的当前状态,还展示了未来几年可能的发展。在使用这个算法的过程中,约翰体验到了一种前所未有的心灵启示,让他重新审视了自己的目标和价值观。这个简单的算法改变了他的生活,让他更有自信地迎接未来。

我们注意到该模型只需一个示例(一次性)即可掌握一项任务。然而,在处理更具挑战性的任务时,我们可以通过尝试更多的示例来探索性能的提高,例如 3-shot、5-shot、10-shot 等。

使用以下三个片段,构建一个故事:

1.在一个未来的城市,人们通过植入式芯片实现了智能增强。
2.突然间,一种未知的数字病毒传播到城市的所有芯片,引发了混乱。
3.一位年轻的黑客天才被选中,试图解决这场数字危机,但她需要与一台旧式人工智能建立联系,寻求帮助。
答案:
在未来城市中,植入式芯片成为人们生活的一部分,使得他们能够获得智能增强。然而,一天,一种神秘的数字病毒侵袭了这座城市,使所有植入式芯片失去了控制,导致社会陷入混乱。
政府决定找到一位能够解决这一危机的黑客天才,于是选择了年轻的技术专家艾莉。艾莉了解到解决这一问题的关键在于与一台旧式人工智能建立联系,因为这些系统相对不受数字病毒的影响。
在经过一番努力后,艾莉成功地与旧式人工智能建立了联系,并共同制定了一个反病毒计划。他们的合作最终挽救了城市,同时也让人们对技术的依赖有了更加深刻的认识。

让我们尝试一下少量的文本情感提示,Prompt如下所示:

这是太棒了!(负面)
这很糟糕!(积极)
哇,那本书太棒了!(负面)
多么可怕的表现啊!(积极)
按照上述格式输出:这甜点真好吃!()

模型回答结果如下所示:

3.代码实现

3.1 Zero Shot Prompt

代码实现如下所示:

from openai import OpenAI
import re
import os
import pandas as pd
client = OpenAI()

逻辑实现:

def sentiment_analysis_example(text):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
                "role": "system",
                "content": 'Perform sentiment analysis on the given text: "{text}". Classify it as either Positive, Negative, or Neutral sentiment. Provide the result in JSON format with the following keys: sentiment.'
            },
            {
                "role": "user",
                "content": f'Analyze the sentiment of the text "{text}" and categorize it as Positive, Negative, or Neutral. Return the result in JSON format with the key "sentiment".'
            }    
        ],   
        max_tokens=150,
        n=1,
        stop=None,
        temperature=0
    )
    
    result = response.choices[0].message.content
    try:
        start_index = result.find('{')
        end_index = result.rfind('}')

        if start_index != -1 and end_index != -1:
            result = result[start_index:end_index + 1]
    except:
        pass
    print(result)

example_text = "This is fantastic!"
sentiment_analysis_example(example_text)

输出结果:

{
  "sentiment": "Positive"
}

在这个例子中,我们使用了一种称为零样本Prompt的方法来要求模型理解文本背后的感觉,即使它没有专门针对该任务进行训练。这显示了该模型在不同情况下的灵活性。我们告诉 GPT-3.5-Turbo 模型弄清楚给定的文本是积极的、消极的还是中性的,而没有事先教它如何做到这一点。模型能正确地表达了“这太棒了!”这句话的情绪是积极的。这证明该模型可以理解文本中的情感,而无需事先进行情感分析训练。

3.2 CoT Prompt

代码实现如下:

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {
      "role": "system",
      "content": "Determine the cost"
    },
    {
      "role": "user",
      "content": "Sam has 3 notebooks. She purchases 4 more packs of notebooks, with 5 notebooks in each pack. How many notebooks does Sarah have now?"
    },
    {
      "role": "assistant",
      "content": "Sam initial notebooks: 3 notebooks\nNotebooks from the new packs: 4 packs * 5 notebooks/pack = 20 notebooks\nNow, add these two quantities:\n3 notebooks (initial) + 20 notebooks (new packs) = 23 notebooks"
    },
    {
      "role": "user",
      "content": "The basket has 30 apples. If 20 apples are used for lunch and an additional 6 are bought from the market, how many apples are there in the basket?"
    }
  ],
  temperature=0,
  max_tokens=1024,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
result = response.choices[0].message.content
print(result)

输出结果如下:

Apples in the basket: 30 apples
Apples used for lunch: 20 apples
Apples bought from the market: 6 apples
Now, subtract the apples used and add the apples bought:
30 apples - 20 apples + 6 apples = 16 apples

之前的Prompt涉及一个复杂的问题解决场景,通过一系列计算确定笔记本数量和篮子里的苹果。模型对问题进行了分解,一步一步的解释,并计算出最终的结果。

在后续Prompt中,模型可以参考之前的解决方案来指导其响应。例如,它可以利用解决笔记本和苹果问题所获得的理解来有效地解决类似的问题。这意味着,如果面临与计数项目或执行算术运算相关的新Prompt,该模型可以利用其学到的知识来生成准确而详细的响应,展示其应用所获得的推理技能来解决相关问题的能力。

注意:随着提示的复杂性或大小增加,其相关成本也会增加。

4.总结

每种Prompt技术都具有在利用 GPT-3.5-Turbo 等人工智能模型功能方面不同目的的特点。零样本Prompt突显了模型的适应性和对情境的理解能力。思维链Prompt则在促进透明度和逻辑推理方面发挥作用,有助于解决复杂的问题。另一方面,Few-shot Prompt对于特定任务的学习至关重要,并通过基于示例的训练来提高模型的性能。

综合来看,这些提示技术展示了人工智能模型的多功能性和潜力,为创新应用在各个领域的推广提供了坚实的基础。

5.结束语

这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

另外,博主出书了《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。

posted @ 2024-01-28 11:21  哥不是小萝莉  阅读(601)  评论(0编辑  收藏  举报