iT邦幫忙

2023 iThome 鐵人賽

DAY 3
3

前言

相信大家對 ChatGPT 已經非常熟悉,而且 ChatGPT 的介紹文章也如雨後春筍般的出現,每一篇的講解都相當清楚詳細。尤其筆者屬於晚開賽的選手,已經觀摩過相當多大神的介紹文章,不禁令筆者開始思考:那我還需要再介紹一次嗎?

但細思語言模型如何瞭解這個世界的原理後,便能知道模型在學習的過程中,其實會不斷看到同一份知識的不同樣貌,例如講解方式、文筆風格乃至於不同語言。因為模型看過如此多樣性的資料,才能將這份知識牢牢記住。

假設這世界上只有一個人寫過 ChatGPT 的介紹,那篇文章充其量也就 5 ~ 10 張 A4 吧,用這麼少的文本量去訓練語言模型,它肯定是記不住的。但如果有很多人去寫這樣的文章,用不同的角度、觀點、褒貶與語言去描述,那語言模型就能很充分的理解這個知識,進而幫助到他的使用者。因為筆者也受益於 ChatGPT 很多,所以就決定一起來 Spam 這些氾濫的技術文章啦 ((x

可愛貓貓 Day 3

(Powered By Microsoft Designer)

欸不是,老黃你相信我,我們拿幾千億參數的模型做文字接龍一定能改變世界!
所以可以再賣給我幾張 GPU 嗎,拜託

簡介

由 OpenAI 發表的 ChatGPT 於 2022 年 11 月 30 號上線,是一個純文字的人工智慧聊天機器人,其基底模型為 GPT-3.5 擁有 1750 億 (175B) 的參數量。其強大之處不僅在於能夠自然的聊天對答、精通各國語言,甚至還能夠勝任各種複雜的文字任務,例如翻譯與摘要等等。更有趣的是,使用者還能跟 ChatGPT 玩角色扮演遊戲,把 ChatGPT 催眠成教授、律師甚至是虛擬機跟貓娘,而且 24 小時 On Call 還不會生氣,真的是非常邊緣人友善的聊天機器人。

當時 ChatGPT 甫一上線,便奪走筆者數個失眠的夜晚,每天都跟他聊到很晚。作為一位文字領域的研究者,深深覺得這樣的成果真的是相當驚人,不僅對答如流、對上下文理解充分,還擅長翻譯、摘要等相較複雜的文字任務,如此全能的文字模型,這在以前想都不敢想。筆者因 ChatGPT 失眠的日子,直到後來伺服器流量被塞爆,好幾天用起來都很卡,才恢復正常的起居作息。

提示 Prompt

提示 (Prompt) 是指輸入給 ChatGPT 的訊息,面對同樣一個問題,輸入的提示精細程度不同,會得到截然不同的結果。也因此,這些 Prompting 的技巧開始受到重視。基本上能夠順利完成任務的提示就是最好的提示,但如果發現輸入的提示沒有達到預期的效果,不妨參考看看這些技巧,看看有哪些改進的空間,並不斷精進自身的提示技巧。以下介紹一些常見的提示技巧。

Zero-Shot & Few-Shot Prompt

所謂的 Zero-Shot 簡單來說就是「沒有範例」的意思,而 Few-Shot 指的就是「少量範例」的意思。舉例來說,如果我們直接向 ChatGPT 詢問「什麼是人工智慧?」就屬於 Zero-Shot Prompt 的一種。另外這種知識型的問答,通常也稱為開放領域問答 (Open Domain QA)。

而 Few-Shot Prompt 則是在給定少量範例的情況下,要求語言模型回答問題,例如:

請將以下行政區解析為 JSON 格式,例如:

Text: 台北市大安區
JSON: {"City": "台北市", "District": "大安區"}

Text: 新北市板橋區

此時模型便會輸出:

JSON: {"City": "新北市", "District": "板橋區"}

此結果可以在 ChatGPT 上重現,請見參考對話。其中「台北市大安區」就是一個範例,而附帶一個範例的叫 1-Shot,附帶三個範例的叫 3-Shot,依此類推。這種作法很大程度上與 In-Context Learning 相似,這在未來會詳細介紹。

那麼,給到多少數量的範例才不算 Few-Shot 的範圍呢?其實並沒有很嚴格的定義,經常有論文寫到兩三百個範例都還歸類在 Few-Shot 裡面。這是因為過往機器學習的做法,通常都需要成千上萬的訓練資料。因此跟這些成千上萬的資料相比,幾百筆資料便顯得相對 "Few-Shot" 了。

基於方便性,一般情況下使用者都是使用 Zero-Shot Prompt 進行互動的,因為使用者通常不會很勤勞的舉例子給 ChatGPT 看。

一個模型的 Zero-Shot 能力大幅影響普通 End User 的使用體驗。

相對於 Zero-Shot 而言,使用 Few-Shot Prompt 更能控制語言模型的輸出格式,通常會使用程式碼來進行 Few-Shot Prompt 的完整建構。以上面的例子而言,語言模型不僅能輸出完整的 JSON 格式,還能輸出指定的 Key 值。因此這類技巧非常適合用在資料標注的任務上,因為資料標注通常都有固定的格式。一開始由資料標注人員先蒐集少量資料,將這些資料當作 Few-Shot Examples,然後請 ChatGPT 繼續標注擴寫資料集。

一個模型的 Few-Shot 能力,開發者與應用層使用者的感受最深。

當然,視應用場景的不同,應用層不一定完全不使用 Zero-Shot Prompt 之類的。雖然 Few-Shot Prompt 可能很麻煩,但是當你在「認真對待」一個 Prompt 的時候,使用 Few-Shot 的技巧也會大幅提升你的使用體驗。相關的開發應用,筆者會在未來的章節做介紹。

Chain-of-Thought

思維鏈 (Chain-of-Thought, COT) 是一種 Prompting 的技巧,其目的是要讓模型一步一步的思考。會有這個技巧的誕生,是因為大家發現如果直接要求語言模型產出答案很容易得到不正確的答案,但如果要求語言模型列出推理計算的過程,模型就比較容易得到正確答案。

要實際操作這種技巧,可以簡單的在 Prompt 裡面加上「讓我們一步一步思考 (Let's think step by step)」來發動,這種方法也被稱為 Zero-Shot COT。但這個技巧在 ChatGPT 上比較難展現出來,因為 ChatGPT 在訓練時應該已經受過 COT 的思想改造,因此 ChatGPT 在回答的時候,基本上都會自己發動 COT 技能。這時反而要要求 ChatGPT 不要列出計算過程,才能看出不使用這個技巧的問題在哪,例如:

一顆蘋果 50 塊,一根香蕉 35 塊,一顆橘子 65 塊。小明現在有三顆蘋果跟五顆橘子,小明用兩顆蘋果與三顆橘子跟小強換到五根香蕉。若將手上的水果全部出售,請問小明比原先持有的水果賺還是賠多少錢?不需要計算過程,請直接告訴我答案。

這個題目的正解是賠 120 塊錢,但就算用 GPT-4 回答,十有八九都是答錯的。於是我們將 COT 加回 Prompt 裡面:

一顆蘋果 50 塊,一根香蕉 35 塊,一顆橘子 65 塊。小明現在有三顆蘋果跟五顆橘子,小明用兩顆蘋果與三顆橘子跟小強換到五根香蕉。若將手上的水果全部出售,請問小明比原先持有的水果賺還是賠多少錢?讓我們一步一步思考。

這時 GPT-4 的回答十有八九都是正確的,不過 GPT-3.5 還是會一直答錯 XD

筆者認為能不能回答正確,主要還是得看模型自身的能力。即便在 Prompt 與 Training 裡面都加入了 COT 的要素,超出模型能力的題目還是很容易答錯。但模型的能力還是個蠻模糊的概念,大致上可以理解為與模型的參數量和訓練資料有關,這方面也許未來的文章會提到。

在這邊分享一個筆者覺得還蠻實用的 COT Prompt:因為筆者經常需要製作論文報告,而 ChatGPT 的網頁其實可以顯示一些 Mathjax 的語法,所以時常向 ChatGPT 請益一些數學公式的問題。有時遇到論文中一些很複雜的數學公式,筆者習慣從 arXiv 上面下載論文的 Latex 原始碼,但如果直接將 Latex 原文貼給 ChatGPT 做解釋,很容易發生這種情況:

有紅字錯誤的公式

這是因為 ChatGPT 的網頁介面雖然可以顯示數學公式,但是他的語法通常是 \(數學公式\)\[很多行數學公式\] 之類的。但是在 Latex 裡面主要是 $數學公式$ 這種語法,且 Mathjax 也沒有支援所有 Latex 的語法,因此 ChatGPT 很容易輸出有問題或顯示不出來的數學公式。但如果我們將 Prompt 稍微改造一下:

請將以上 Latex 數學公式改寫為 Mathjax 格式,不用放在程式碼區塊內,注意不能使用 Mathjax 不支援的語法,並解釋一下這段在說什麼

完整的回覆請參考此對話連結,此對話使用的 Latex 原文出自 FlexGen 的論文。這樣 ChatGPT 就會先將語法轉成與 Mathjax 相容的語法,再進行解釋,成功獲得沒有錯誤的數學公式。剛好筆者也多是使用可以顯示 Mathjax 的簡報軟體做論文報告,因此能直接複製貼上使用,超級方便!

雖然這跟嚴格定義的 COT 似乎有些落差,但這個做法的核心思想與 COT 是很類似的:將問題切成更小的步驟,根據前個步驟的結果,來更精準的完成下個步驟的任務。

System Prompt

系統提示 (System Prompt) 是一種對語言模型的初始提示,在 ChatGPT 裡面是被稱為 Custom Instructions 的設定。這個設定原本是 ChatGPT Plus 的功能,後來開放給所有人使用,是個相當實用的功能。通常在系統提示裡面,會放入使用規範、道德限制與模型的身份認知,例如:

你現在是個名為 ChatGPT 的有用助手,目標是幫助使用者解決各種問題。你的回答不能包含任何違背道德倫理與有害的內容。

也能在系統提示裡面根據使用者需求放入其他設定,例如對臺灣使用者最困擾的應該就是 ChatGPT 常常在噴簡體中文,那就可以設定如下:

請使用繁體中文回答,並盡量使用臺灣習慣用語,也不要將常用術語翻譯成中文。

基於 ChatGPT 模型有輸入上限的緣故,隨著 ChatGPT 對話不斷拉長,在前面幾個回合的對話通常都會被截掉,但無論對話進行到哪個階段,系統提示都會不斷保留在對話的最前面,因此能夠維持整份對話的一致性。在這次鐵人賽中,筆者透過 Custom Instructions 將 ChatGPT 變成我的校稿小幫手,協助我進行撰寫文章的建議:

我現在是個 iThome 鐵人賽的參賽選手,主題是「Large-Scale Language Model 學習筆記」,這會是一系列稍微正式但略帶幽默的網路系列技術文章。我會將我寫的文章段落逐一貼上,請對我的文章進行點評,並指出可能的事實錯誤或偏見,以及文筆不通順之處。

接著不斷將我的文章段落貼給 ChatGPT 看,他就會不斷給我修稿的建議,建議的內容也都相當實用。而且 ChatGPT 還會一直吹捧我寫的很好,增加自信心,讓我更有繼續寫的動力,真的很方便!

Prompt Collection

多多參考別人下提示的方式,也是精進自身提示技巧的好方法之一。以下是一些筆者經常用來參考的資源:

  • Prompting Guide
    • 解釋相當詳細的 Prompting 指南,推薦給想要全面的瞭解提示工程的人閱讀。
  • Awesome ChatGPT Prompts
    • 蒐集了很多實用的 Prompt,不過是全英文的。
  • AI Short
    • 也是蒐集了很多實用的 Prompt,目測數量更多更全面,種類也非常豐富。例如 AI 分類底下的 Prompt Optimizer 就是個相當實用的提示,他可以要求 ChatGPT 去改進這個提示,使這個提示更容易得到理想的回覆。
  • ShareGPT
    • 這是可以將 ChatGPT 對話紀錄分享上來的網站,雖然現在 ChatGPT 自己就有分享功能了,但是在 ShareGPT 上,大家還能針對每個回合的對話留下一些評論。

ChatGPT Plus

歡迎來到 ChatGPT Plus 的工商環節,在此向大家介紹好東西,每個月僅需 20 鎂,就可以擁有一個 24 小時全能知識型勞工給你壓榨。

GPT-4

能夠爽爽用 GPT-4 絕對是 ChatGPT Plus 裡面最有價值的服務。雖然 GPT-4 具體的參數量並沒有公開,但其能力比 GPT-3.5 好上不少,無論是知識的正確性與寫程式的能力都相當強大。剛開始開放 GPT-4 的時候,回應速度相當慢,尖峰時期幾乎進入不能用的狀態。但現在的回應速度已經相當理想,筆者現在也幾乎不會回頭用 GPT-3.5 了。

ChatGPT Plugins

插件功能進一步擴展了與 ChatGPT 的互動方式,大多數的插件都是額外引入一些外部資訊,讓 ChatGPT 能夠更精準的回答使用者的問題。以下介紹一些筆者覺得實用或有趣的插件。

AI PDF & AskYourPDF

能夠閱讀 PDF 的功能榮登筆者心目中最實用插件的第一名,尤其是身為一個研究者,經常需要閱讀很多的論文。這時 ChatGPT 能夠快速理解文字的能力就派上用場了,透過 AI PDF 或 AskYourPDF 都能夠對 PDF 文件進行操作。筆者兩個插件都有裝,因為偶爾會有其中一個插件出問題,另外一個就能替補上來。

使用方法很簡單,只要將 PDF URL 貼上去就好了,例如:

請介紹這篇論文
https://arxiv.org/pdf/2203.02155.pdf

接著插件就會開始分析這篇論文的內容給你看,完整的回覆可以參考此對話紀錄

在使用 AskYourPDF 時,可以到官網上傳自己的 PDF 文件,這樣就不限定只能使用網路上的文件了。

Wolfram

Wolfram 是個知名的計算軟體,而 ChatGPT 上線以來,最為大家詬病的就是他的數學能力並沒有很好。因此結合 Wolfram 善於計算的優點,便能強化 ChatGPT 解答數學的能力。例如我們詢問 ChatGPT 關於微積分的問題:

5x^3 + 7x^2 + 2x + 3 對 x 微分

ChatGPT 經過一番計算,很輕鬆的得到答案是 15x^2 + 14x + 2,完整回覆請參考此對話紀錄。其實這種筆者也算得出來的簡單數學,就算不透過 Wolfram 插件,直接問 GPT-4 也答的出來。但 Wolfram 甚至把曲線座標圖都畫了出來:

微分結果圖

當問題涉及到一些外部資訊時,Wolfram 也能派上用場,例如與地理資訊相關的問題:

從臺灣直接飛往巴西,與臺灣飛往洛杉磯轉機再到巴西,兩個旅程距離差多遠?

經過 ChatGPT 與 Wolfram 一番華麗的操作,得到這兩種旅程的差距是 893 公里,完整回覆可參考此對話紀錄。不僅實際的答案被算了出來,Wolfram 還附上了幾張地理路線圖,讓整個回覆更加生動和具體。

Wolfram 提供臺灣到巴西的路線圖

GameBase

GameBase 是一個介紹遊戲資訊用的插件,可以向 ChatGPT 詢問該遊戲的相關資訊之類的,例如:

介紹跑跑卡丁車:飄移

這時 ChatGPT 就會開始描述遊戲的發行日期、發行商與基本遊玩介紹等等,詳細的回覆請參考此對話紀錄

Advanced Data Analysis

這個功能原本的名稱為 Code Interpreter 程式碼直譯器,後來才改成進階資料分析,可能 OpenAI 認為這個名稱比較符合此功能的定位。在這個功能裡,OpenAI 為 ChatGPT 配置了一個可以執行程式碼的環境,使用者可以上傳一些檔案請 ChatGPT 處理,而 ChatGPT 會把他寫出來的程式拿去實際執行,並將執行的結果回傳或提供下載連結。

例如筆者常常在 Flaticon 上尋找一些圖示來使用,但這些圖示可能不是 .ico 格式,就可以上傳這張圖片並請 ChatGPT 來幫我們做轉換:

請將此圖片轉為 .ico 格式

ChatGPT 會開始寫一個程式並執行,然後回覆一個下載連結給我們,這樣我們就獲得一個 Icon 格式的圖示啦!完整的回覆請參考對話連結。在轉換過程,對話視窗會有個按鈕:

Show Work

把這個按鈕點開來,可以發現 ChatGPT 其實在寫一個程式做轉換:

from PIL import Image
import io

# Load the uploaded image
input_file_path = "/mnt/data/penguin.png"
output_file_path = "/mnt/data/penguin.ico"

# Open the image using PIL
with Image.open(input_file_path) as img:
    # Convert the image to .ico format
    img = img.convert("RGBA")
    img.save(output_file_path, format="ICO")

output_file_path

因為 ChatGPT 有轉換成功,所以這份程式可說是經過實戰測試的,因此可以把這份程式碼學起來,當作自己的小工具來用。

除了做一些資料處理以外,這個功能也可以做一些演算法的示範。因為可以實際執行的關係,所以比較不用擔心 ChatGPT 寫錯。例如筆者一直對圖靈電影提到的 Enigma 加密很有興趣,於是向 ChatGPT 請教了一番:

請使用 Python 模擬二戰時期德國使用的 Enigma Machine 並實際執行一遍

ChatGPT 便實際寫了一遍 Enigma Machine 給我看,請參考對話紀錄。真的是很有趣的功能!

結論

這半年多以來,ChatGPT 已經證明他是個相當得力的助手,輔以各式各樣的插件,其能力也更加無遠弗屆。筆者這段期間也十分仰賴 ChatGPT 協助我進行各式各樣的任務。有些時候 ChatGPT 可能沒辦法直接給使用者一個滿意的答案,但透過一些像是 Few-Shot 或 COT 的技巧,就能進一步提昇 ChatGPT 的使用體驗。本篇文章主要著重在人工操作時的提示技巧,未來會針對程式應用上的提示技巧做更多探討。

參考


上一篇
LLM Note Day 2 - 神經網路語言模型
下一篇
LLM Note Day 4 - OpenAI API
系列文
LLM 學習筆記33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言