上課筆記系列(3) — ChatGPT Prompt Engineering for Developers(2)迭代/總結

Martin Huang
6 min readMay 10, 2023

--

課程由此

課程筆記索引:

(1) 簡介及互動基本指引
(2) 迭代和總結 — 本篇
(3) 推論和轉換
(4) 擴充和聊天機器人/結語

方便有興趣的朋友點閱。

迭代

訓練模型的時候,很難第一次就讓模型有很不錯的表現。和ChatGPT互動也一樣,並不是每次都能馬上得到滿意的輸出。開發的流程如下:

構想=>實作=>測試=>錯誤分析=>構想

形成一個迴圈,也就是標題迭代的精神。更具體一點的指引如下:

1. 試著輸入構想(記得搭配使用前一篇提到的概念,如:明確的指示、將複雜的步驟拆解、試著讓模型提出解法…等等)
2. 執行得到的結果,找出和構想有落差的地方
3. 將這些地方整理,調整輸入

吳恩達在這邊提出一個和網路上常見的「完美的輸入指示(perfect prompt)」「詠唱魔法」不一樣的概念:沒有完美一招半式走天下的輸入指示。這是因為隨著需求不同,輸入也不同,而只有在嘗試和修正的迴圈中,才能得到符合開發者需求的答案。

課堂舉的例子是:給模型一個產品資訊,然後要求模型根據該資訊,輸出一個可以協助經銷團隊放在零售網站上的說明。模型的確輸出了一段相當符合宗旨的文字,但還是太冗長了。

因此在輸出中加了一條限制:字數上限50字。(好像高中/大學聯考的國文,文意簡縮題)

這次輸出的文字長度大幅縮減了。確認一下段落的字數:

len(response)

影片中顯示的是52個字,但我實作在Jupyter上是344!當然,模型每次生成的文字段落都會不一樣,這是因為它是生成式模型,沒有固定的規則,只有方向。總之,無論是哪個,都顯示出模型並不擅長遵守精確的字數限制。於是我們改成:限制在3個句子。

輸出如下:(實作範例,每次生成可能都不太一樣)

Introducing the SWC-100/SWC-110 office chair, part of a stunning mid-century inspired furniture collection. Available in a range of shell colors and base finishes, this chair is suitable for both home and business settings. With a 5-wheel plastic coated aluminum base and pneumatic chair adjust, it’s easy to customize for your comfort.

確實限制在3句裡。你也可以設定限制在多少字母,但由於LLM使用token的方式(這裡不細談),通常不太能抓很準。

接著來看內容。假如這個經銷網頁的受眾不是一般消費者,而是家具零售業者,他們可能對產品的技術或材料比較有興趣。因此,我們又加入了對文章擷取重點的需求:改寫的時候必須技術本位,而且注重在材料和製作方法。

輸出中顯示了對應的結果:例如強調其輪子是以塑膠包覆的鋁製品,以及椅子本身使用高品質材料等等。

也可以要求輸出中包含原始文章中,特定的字。例如,希望在輸出的最後附上產品的兩個型號。

Introducing our mid-century inspired office chair, perfect for home or business settings. With a range of shell colors and base finishes, and the option of plastic or full upholstery, this chair is both stylish and comfortable. Constructed with a 5-wheel plastic coated aluminum base and pneumatic chair adjust, it’s also practical. Available with or without armrests and suitable for contract use. Product ID: SWC-100, SWC-110.

最後來點複雜的,算是給ChatGPT的壓力測試吧!我們希望模型在描述段落之後加上一個表格,用於描述規格。基於前一篇提到的「清楚指示」精神,我們要告訴模型表格的內容。其包括兩個欄位,第一個欄位是長寬高等等,第二個欄位則是對應的尺寸,單位用吋。表格標題則為產品規格。然後,要求全部以HTML格式輸出。

結果很長,就不放這裡了。以python呈現HTML格式之後,哇,真的蠻像一回事的。想知道的人,自己去玩吧!

以上的例子,就是一種迭代的過程。並不是一開始就要求模型一步到位,而是先測試局部的概念或想法,然後再調整,最後整合在一起。這個過程是不是和自己寫程式很像?我覺得蠻像的。

當然,隨著開發到比較成熟的階段,這樣一種輸出模式,也不見得能通用在所有的狀況。以上面的例子來說,可能我們想批次轉化大量的產品說明。這時候,適用於轉化椅子產品說明的指示,不見得能適用在檯燈、架子,或其他家具。要找到一個比較通用的指示方法,同樣也需要經過嘗試、思考落差、和調整。

總結

不是課堂的總結喔!是指模型的總結功能。將文字段落做一個整理,有點類似上面那個擷取文意的例子。一樣,可以把長度限制放在指示裡面,也可以要求模型特別偏重某方向(就是文意擷取)。例如:

請在30字內總結文字段落,並偏重文章內提到的材料部分。

批次的總結也很簡單,利用for loop產出就可以了:

for i in range(len(reviews)):
prompt = f"""
Your task is to generate a short summary of a product \
review from an ecommerce site.

Summarize the review below, delimited by triple \
backticks in at most 20 words.

Review: ```{reviews[i]}```
"""

response = get_completion(prompt)
print(i, response, "\n")

這可以用在意見回饋整理之類的場合。

以上就是迭代和總結的功能,其實不難理解,甚至不太需要程式設計的背景。在下一篇,課堂將會講解如何利用模型,根據文字段落進行推論和轉換。

--

--

Martin Huang

崎嶇的發展 目前主攻CV,但正在往NLP的路上。 歡迎合作或聯絡:martin12345m@gmail.com