ChatGPT自動化辦公系列教程 - 提問篇:Prompt 的高級概念
說白話就是,“你問題問的越好,你得到的答案也就越好”。
這就是 Prompt 的核心理念,為了滿足需求不斷優(yōu)化你的提問。
那么今天我們就看一些可以優(yōu)化提問的進階技巧。
零樣本提示(Zero-shot Prompting)
少量樣本提示(Few-shot Prompting)
思維鏈(COT)提示(Chain-of-Thought Prompting)
零樣本CoT(Zero-shot CoT)
自洽性/自一致性(Self-Consistency)
生成知識提示(Generate Knowledge Prompting)
零樣本提示(Zero-shot
Prompting)
在 ChatGPT 的前世今生中,我們了解到 GPT 2 提出了 zero-shot 的概念,也就是不需要微調(diào),不需要提供任何示例樣本也可以直接通過提問來讓模型解決相應的任務。這是因為 GPT 模型本身就通過了大量數(shù)據(jù)進行了訓練。

比如上圖的提問中,我沒有提供任何示例告訴模型什么是消極,什么是積極,模型本身依然可以直接對文本進行情緒分析,這就是 zero-shot 的能力,而如果你的任務光靠 zero-shot 無法實現(xiàn)或者效果不理想,那么你就需要更進一步給模型提供少量示例,這個就叫做 Few-shot
少量樣本提示(Few-shot
Prompting)
雖然 ChatGPT 光通過 zero-shot 零樣本的能力就已經(jīng)很強大了,但如果你的任務需求比較復雜,直接使用 Zero-shot 不一定能滿足需求。
這時候就應該使用 few-shot 少量樣本提示,相當于在 Prompt 中給問題提供一個 Context 上下文,在上下文里面給模型提供示例,這個示例的作用并不是讓模型去學習,因為光靠幾個示例是完全不夠?qū)W習的。
這幾個示例的作用實際上是引導,引導模型找到對應的回答方式,從而生成更準確的響應。

這種少量樣本提示的方式,用途很多,不光是可以按照指定格式和風格生成文字,還可以用于做分類,提取等我們上一篇學習到的各種基本任務。
如果我們只提供一個樣本示例,就叫做 one-shot ,而隨著我們提供的樣本示例越多,模型生成的準確性也會越高。因此你可以先嘗試使用一個示例,效果不好再逐步增加更多示例樣本。
如果我們是使用 few-shot 做分類任務,這個時候你需要在示例中給每段文字打上不同的標簽。
另外如果你想讓模型的性能更好,這些示例最好是從真實場景中提取出來的,并且不同標簽也要隨機分布,比如你用來識別情緒的示例,你總共提供了10個示例,其中9個都是消極,只有1個是積極的標簽,那么效果肯定是不夠好的。
小樣本提示的局限性
few-shot 雖然解決了 zero-shot 的問題,能夠適用于分類等許多基本任務,但如果遇到了需要推理的復雜任務時,few-shot 就無能為力了。
因為模型無法從少量樣本中學習到完整的推理過程。
這時候就要引申出另外一個概念 - 思維鏈提示 - CoT (Chain-of-Thought Prompting)
思維鏈(COT)提示(Chain-of-Thought
Prompting)
通常涉及到推理的復雜任務,并不是可以一步直接得到答案的,中間會有很多的計算和推理過程。
當我們讓 ChatGPT 回答這些推理問題時,并沒有給模型足夠的思考空間,他沒有草稿紙去進行計算。
所以我們在給到模型提供示例時,不要只給一個答案,而是要把解題思路也給到模型,這樣的話模型學習到的效果會更好。
比如下圖,當我讓 ChatGPT 從一堆數(shù)字中挑出奇數(shù)和偶數(shù)時,ChatGPT 的回答出現(xiàn)了錯誤,正確答案是 6 個奇數(shù),4個偶數(shù)。

出現(xiàn)錯誤的原因是在于缺少推理過程,我們自己在面對這樣的問題時都沒法直接一眼得到答案,而是需要心算或者在草稿中進行計算。
這時候要想解決問題,一個最簡單的方式叫做?Zero-shot CoT 零樣本思維鏈。
也就是我們不給 ChatGPT 示例,讓他自己一步一步思考。

通過上圖我們可以看出來,在沒有給示例的情況下,只是加上一句“請一步步思考”。ChatGPT 就能在輸出結(jié)果中返回他的思考方式,并得到最終的結(jié)果。
類似的示例還有很多

而如果問題更加復雜,零樣本思維鏈得到的結(jié)果還是錯誤的。
那就需要提供幾個示例,而這時候提供的示例不光是給一個結(jié)果,還要給到一個思考的過程作為示例,相當于把自己的思維過程傳達給 AI,讓 AI 也用這個思路來分析問題,最終得到所需的答案。
這里我實在是找不到 ChatGPT 通過一步步思考還回答不出來的問題(原因是現(xiàn)在 ChatGPT 使用的模型已經(jīng)對這種邏輯推理問題有很大進步了),只能是給你們放一張示例圖片了。
相當于你要把解題思路也作為 Prompt 示例的一部分,而不光是給它一個答案。

CoT 變種
如果你發(fā)現(xiàn)這樣還是不能解決問題。
那還可以更進一步的對 Prompt 進行優(yōu)化 - 這些優(yōu)化的方法叫做 CoT 變種。
自洽性(Self-Consitency)
比如可以讓 ChatGPT 產(chǎn)生多個思維鏈,也就是多個推理路徑,最終選擇一個一致性最高的答案。
這種方法叫做 Self-Consitency 自洽性。

提出子問題(Self-Ask)
還有時候中間的推理過程比較復雜,這時將問題拆解也是一種解決方案。
如果你不知道如何拆解問題,可以讓 ChatGPT 自己根據(jù)問題提出子問題。
這種方法叫做 Self-Ask 提出子問題。
如下圖所示,首先給一個示例,在示例中提供一個簡單的帶有子問題的例子,然后再問實際的問題。
這時模型就會把實際的問題拆解成子問題,并進行解答。

生成知識提示(Generate
Knowledge Prompting)
還有很小的情況下-我們?nèi)绾巫屇P退伎迹P投紱]法解決我們的問題。
因為模型本身可能本身缺少解決問題的背景知識,或者模型想不到要用什么背景知識。
如果是前者,那只能是我們主動通過上下文 Context 的方式把背景知識直接添加到 Prompt 中再讓模型去回答。
而如果是后者,則可以先給模型一些示例來讓模型自己去生成對應問題的背景知識,這個技巧叫做 【Generate Knowledge Prompting 生成知識提示】
這樣有了背景知識后,再把生成后得到的背景知識添加到 Context 中向模型提問,這樣模型因為有了背景知識自然就能準確回答我們的問題。
舉例如下:
比如我希望知道高爾夫比賽的得分是不是誰高誰好。
我直接問 ChatGPT , 他回答的前后矛盾。

這個時候我讓一步一步思考也沒用,回答的還是不對。

那就只能給他背景知識了,這時候可以用【生成知識提示】的方法,也就是先給模型一些示例,讓模型可以來生成關(guān)于高爾夫得分問題的背景知識。

這樣有了背景知識,我們再向模型進行相關(guān)的問題的提問,模型在回答的時候就會更準確。

除了以上方法外, GPT 模型還可以結(jié)合外部工具實現(xiàn)更加復雜的場景需求,甚至是從外部搜索引擎獲取信息,但這些工具基本上都是在代碼層面展開的,后面有機會在開發(fā)篇我們再進行介紹。
總結(jié)
今天我們學習到了 Prompt 的進階內(nèi)容,包括不需要任何示例也可以讓模型回答問題的零樣本提示,提供幾個示例的少量樣本提示,讓模型可以拆分步驟進行思考的 CoT 思維鏈提示,以及讓模型自己生成背景知識上下文的生成知識提示。
這些內(nèi)容都屬于 Prompt 的高級知識,在我們解決實際問題時,可以或多或少參考這些高級概念來輔助我們完成實際需求。
Prompt 概念性的內(nèi)容就介紹到這里,接下來就是實戰(zhàn)部分 - 我會挑選幾個日常工作和生活中會遇到的實際需求來利用 Prompt 讓 ChatGPT 給我們生成滿意的答案。