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大數據挖掘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裏點擊購買鏈接購買博主的書進行學習,在此感謝大家的支持。關注下面公衆號,根據提示,可免費獲取書籍的教學視頻。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章