文章目錄
- 基本概念
- AI輸出配置:調整AI的回答方式
- 輸出長度
- 溫度(Temperature)
- Top-K和Top-P
- 提示技術:讓AI更好地理解你
- 零樣本提示(Zero-shot)
- 少樣本提示(Few-shot)
- 系統提示(System Prompting)
- 角色提示(Role Prompting)
- 上下文提示(Contextual Prompting)
- 后退提示(Step-back Prompting)
- 思維鏈提示(Chain of Thought)
- 思維樹(Tree of Thoughts)
- ReAct(推理與行動)
- 代碼提示(Code Prompting)
- 編寫代碼示例
- 解釋代碼示例
- 調試代碼示例
- 提示工程最佳實踐
- 提供示例
- 簡潔設計
- 明確指定輸出
- 使用指令而非約束
- 控制最大標記長度
- 在提示中使用變量
- 嘗試不同的輸入格式和寫作風格
- 對于少樣本分類任務,混合不同類別
- 適應模型更新
- 嘗試不同的輸出格式
- 記錄提示嘗試
基本概念
當你與大型語言模型(如Gemini)交流時,你輸入的文字就是"提示",AI會根據這些提示生成回答。提示工程就是設計高質量提示的過程,引導AI產生準確的輸出。
小貼士: 你不需要成為數據科學家或機器學習工程師 — 任何人都可以學習如何寫好提示!
大型語言模型(LLM)是一個預測引擎。當你輸入文字時,模型會根據它訓練過的數據預測下一個詞應該是什么。通過精心設計的提示,你可以引導模型生成更符合你期望的回答。
為什么提示工程很重要?
-
好的提示讓AI給出準確、有用的回答
-
不好的提示可能導致模糊、不準確的回答
-
提示工程是一個反復嘗試和改進的過程
提示工程的應用
-
文本摘要
-
信息提取
-
問答系統
-
文本分類
-
代碼生成和翻譯
-
推理任務
AI輸出配置:調整AI的回答方式
除了提示本身,你還可以調整各種配置選項來控制AI的輸出。這些設置會影響AI生成回答的方式。
輸出長度
控制AI生成的文字數量。生成更多文字需要更多計算資源,可能導致響應時間變慢和成本增加。
注意: 僅設置輸出長度限制不會讓AI的回答變得更簡潔,它只會在達到限制時停止生成。
溫度(Temperature)
控制AI回答的隨機性程度:
-
低溫度(接近0):回答更確定、更可預測
-
高溫度(接近1):回答更隨機、更有創意
溫度為0時,AI總是選擇概率最高的詞。
Top-K和Top-P
這些設置控制AI在選擇下一個詞時考慮的可能性范圍:
-
Top-K:只考慮最可能的K個選項
-
Top-P(核采樣):只考慮累積概率達到P的選項
👍推薦設置: 一般情況下,溫度0.2、Top-P 0.95和Top-K 30會給你提供相對連貫但又不失創意的結果。如果需要更有創意的回答,可以嘗試溫度0.9、Top-P 0.99和Top-K 40。
??警告: 如果你看到AI回答的末尾出現大量重復文字,這可能是"重復循環錯誤"。這是由于溫度和采樣設置不當導致的。調整這些參數可以解決問題。
提示技術:讓AI更好地理解你
以下是一些強大的提示技術,可以幫助你獲得更好的AI回答:
零樣本提示(Zero-shot)
最簡單的提示方式,直接告訴AI你想要什么,不提供任何示例。
例子:電影評論分類
將電影評論分類為正面、中性或負面。
評論:"Her"是一項令人不安的研究,揭示了如果允許人工智能繼續無限制地發展,人類將走向何方。我希望有更多像這樣的杰作。
情感:
正面
少樣本提示(Few-shot)
通過給AI提供一些例子,幫助它更好地理解你的需求。這種方法向模型展示了它需要遵循的模式。
例子:披薩訂單解析
將客戶的披薩訂單解析為JSON:
示例:
我想要一個小號披薩,配奶酪、番茄醬和意大利辣香腸。
JSON響應:
{
“size”: “small”,
“type”: “normal”,
“ingredients”: [[“cheese”, “tomato sauce”, “pepperoni”]]
}
現在,我想要一個大號披薩,前半部分配奶酪和馬蘇里拉,另一半配番茄醬、火腿和菠蘿。
JSON響應:
{
"size": "large",
"type": "half-half",
"ingredients": [["cheese", "mozzarella"], ["tomato sauce", "ham", "pineapple"]]
}
💡小貼士: 一般來說,少樣本提示應該使用3-5個例子。例子應該多樣化、高質量且書寫良好。
系統提示(System Prompting)
為語言模型設置整體上下文和目的,定義模型應該做什么的"大局"。
例子:電影評論分類(JSON格式)
將電影評論分類為正面、中性或負面。返回有效JSON:
評論:"Her"是一項令人不安的研究,揭示了如果允許人工智能繼續無限制地發展,人類將走向何方。它太令人不安了,我無法觀看。
模式:
電影:
{
"sentiment": String "POSITIVE" | "NEGATIVE" | "NEUTRAL",
"name": String
}
電影評論:
{
"movie_reviews": [電影]
}
JSON響應:
```
{
"movie_reviews": [
{
"sentiment": "NEGATIVE",
"name": "Her"
}
]
}
```
角色提示(Role Prompting)
為AI模型分配特定角色或身份,幫助模型生成與指定角色一致的回答。
例子:旅游指南
我希望你扮演旅游指南。我會寫給你我的位置,你將以幽默的風格建議我附近3個可以參觀的地方。
我的位置:“我在曼哈頓。”
旅游建議:
仰望帝國心境:攀登帝國大廈的令人頭暈的高度,沐浴在曼哈頓天際線的輝煌中。準備感受像金剛在大蘋果上,除了沒有巨大猿猴大小的香蕉。
在MoMA變得藝術范兒:在現代藝術博物館釋放你內心的藝術鑒賞家。凝視那些會讓你的思維困惑,并讓你質疑自己的棍子人畫作是否有任何藝術價值的杰作。
在第五大道購物直到倒下:準備好在這些設計師精品店購物時遭受價格沖擊。但嘿,你在曼哈頓,所以你不妨擁抱這華麗!
上下文提示(Contextual Prompting)
提供與當前對話或任務相關的特定細節或背景信息,幫助模型理解所問內容的細微差別。
例子:博客文章建議
上下文:你正在為一個關于80年代復古街機電子游戲的博客寫作。
建議3個可以寫文章的主題,并附上幾行關于這篇文章應該包含什么的描述。
街機柜設計的演變:本文將探索街機柜設計的演變,從20世紀70年代早期的木材和金屬柜到20世紀80年代及以后的時髦、霓虹燈照明設計。
回顧過去:80年代標志性街機游戲:本文將展示一些20世紀80年代最具標志性和影響力的街機游戲的歷史、影響和遺產,突出它們的創新、流行機制和持久魅力。
像素藝術的興起和復古復興:本文將深入探討像素藝術作為早期街機游戲的標志性視覺風格的演變,追溯其根源,探索其技術,并討論像素藝術在現代游戲和數字藝術中的復興。
后退提示(Step-back Prompting)
先要求AI考慮與特定任務相關的一般問題,然后將該問題的答案用于解決具體問題。這種"后退"允許AI在嘗試解決特定問題前激活相關的背景知識。
例子:游戲關卡故事情節
基于流行的第一人稱射擊動作游戲,有哪5個虛構的關鍵設置可以為第一人稱射擊游戲中的挑戰性和引人入勝的級別故事情節做出貢獻?
廢棄軍事基地:一個廣闊的、后世界末日的軍事綜合體,爬滿了變異士兵和叛逃機器人,適合挑戰性的火器戰斗。
賽博朋克城市:一個霓虹燈照明的未來城市環境,有高聳的摩天大樓和密集的小巷,有增強型的敵人和黑客機制。
外星飛船:一艘滯留在地球上的巨大外星飛船,有詭異的走廊、零重力區域和外星生物。
僵尸感染的城鎮:一個被侵略性僵尸群占領的荒涼城鎮,有激烈的近戰戰斗和尋找安全通道的解謎元素。
水下研究設施:一個被水淹沒的深海實驗室,充滿了變異的水生生物,需要潛行和水下探索技能才能生存。
然后,你可以將這些主題用作上下文,創建更具體的故事情節:
上下文:[上面的5個主題]
選擇其中一個主題,為第一人稱射擊游戲的新級別寫一段既具挑戰性又有吸引力的故事情節。
在幽暗深淵的中心,矗立著一座破敗的水下研究設施,作為人類野心及其災難性后果的見證。籠罩在黑暗中,伴隨著故障機械的嗡嗡聲,以及被淹沒靈魂的回聲,這座設施如今成為了深海噩夢的溫床。玩家,一名配備先進潛水裝備和實驗性武器的精英海軍陸戰隊員,被派遣深入這個水生恐怖領域。肩負著韌性和智慧的使命,他們必須穿越危險的走廊,解決神秘的謎題,與在深處潛伏的可怕海怪對抗。從抵抗海水壓力到智勝狡猾的水生掠食者,在這個未知的水下世界中,每一刻都考驗著人類的耐力和勇氣極限。
思維鏈提示(Chain of Thought)
通過生成中間推理步驟來提高AI的推理能力,特別適合解決需要逐步思考的復雜問題。
例子:數學問題
當我3歲的時候,我的伴侶是我年齡的3倍。現在,我20歲了。我的伴侶多大?讓我們一步一步思考。
當我3歲時,我的伴侶是3 * 3 = 9歲。
這是6歲的年齡差,我的伴侶比較大。
現在我20歲了,所以我的伴侶是20 + 6 = 26歲。
答案是26歲。
小貼士: 使用思維鏈提示時,最好將溫度設置為0,因為通常只有一個正確答案。
思維樹(Tree of Thoughts)
允許AI同時探索多個不同的推理路徑,而不是僅僅遵循單一的線性思維鏈。特別適合需要探索的復雜任務。
思維樹通過維護一個思維樹,每個思維代表一個連貫的語言序列,作為解決問題的中間步驟。模型可以通過從樹的不同節點分支出來探索不同的推理路徑。
ReAct(推理與行動)
結合自然語言推理和外部工具(如搜索、代碼解釋器等),使AI能夠執行某些操作,如與外部API交互以檢索信息。
ReAct通過將推理和行動結合到一個思考-行動循環中工作。AI首先推理問題并生成行動計劃,然后執行計劃中的行動并觀察結果,最后使用觀察結果更新推理并生成新的行動計劃。
> 輸入新的AgentExecutor鏈...
Metallica有4個成員。
行動: 搜索
行動輸入: James Hetfield有多少個孩子?
觀察: 三個孩子
思考: 1/4 Metallica樂隊成員有3個孩子
行動: 搜索
行動輸入: Lars Ulrich有多少個孩子?
觀察: 3
思考: 2/4 Metallica樂隊成員有6個孩子
行動: 搜索
行動輸入: Kirk Hammett有多少個孩子?
觀察: Hammett自1998年以來與他的第二任妻子Lani結婚。他們有兩個兒子,Angel(2006年9月29日出生)和Vincenzo(2008年6月28日出生)。
思考: 3/4 Metallica樂隊成員有8個孩子
行動: 搜索
行動輸入: Robert Trujillo有多少個孩子?
觀察: 2
思考: 4/4 Metallica樂隊成員有10個孩子
最終答案: 10
代碼提示(Code Prompting)
使用特定技巧讓AI幫助你編寫、解釋或調試代碼。
編寫代碼示例
例子:批量重命名文件
寫一個Bash代碼片段,詢問文件夾名稱。然后獲取文件夾內容并通過在文件名前添加"draft"來重命名所有文件。
#!/bin/bash
# 詢問文件夾名稱
echo "輸入文件夾名稱: "
read folder_name
# 檢查文件夾是否存在
if [ ! -d "$folder_name" ]; then
echo "文件夾不存在。"
exit 1
fi
# 獲取文件夾中的文件列表
files=( "$folder_name"/* )
# 通過在文件名前添加"draft"來重命名每個文件
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$folder_name/$new_file_name"
done
echo "文件重命名成功。"
解釋代碼示例
例子:解釋Bash代碼
解釋以下Bash代碼:
#!/bin/bash
echo "輸入文件夾名稱: "
read folder_name
if [ ! -d "$folder_name" ]; then
echo "文件夾不存在。"
exit 1
fi
files=( "$folder_name"/* )
for file in "${files[@]}"; do
new_file_name="draft_$(basename "$file")"
mv "$file" "$new_file_name"
done
echo "文件重命名成功。"
這個Bash腳本執行以下任務:
1. 用戶輸入:
- 使用`echo`和`read`命令提示用戶輸入文件夾名稱。輸入的文件夾名稱存儲在`folder_name`變量中。2. 文件夾存在檢查:
- 使用`[ ! -d "$folder_name" ]`條件檢查指定名稱的文件夾是否存在。如果文件夾不存在,顯示錯誤信息("文件夾不存在。")并以退出代碼1退出腳本。3. 文件列表:
- 使用`files=( "$folder_name"/* )`命令列出指定文件夾內的所有文件。這創建了一個名為`files`的數組,包含文件夾中所有文件的路徑。4. 文件重命名:
- 使用`for`循環遍歷`files`數組中的每個文件。
- 對于每個文件,使用`new_file_name="draft_$(basename "$file")"`命令生成新文件名。這個新文件名是通過在原始文件名前加上"draft_"字符串創建的。
- 然后使用`mv "$file" "$new_file_name"`命令重命名文件,將文件移動到新文件名。5. 成功消息:
- 重命名所有文件后,顯示成功消息("文件重命名成功。")表示重命名操作成功。
調試代碼示例
例子:調試Python代碼
以下Python代碼出現錯誤:
Traceback (most recent call last):
File “/Users/leeboonstra/Documents/test_folder/rename_files.py”, line 7, in <module>
text = toUpperCase(prefix)
NameError: name ‘toUpperCase’ is not defined
調試錯誤并解釋如何改進代碼。
import os
import shutil
# 從用戶獲取文件夾名稱
folder_name = input("輸入文件夾名稱: ")
prefix = input("輸入要添加到文件名前的字符串: ")
text = toUpperCase(prefix)
# 檢查文件夾是否存在
if not os.path.isdir(folder_name):
print("文件夾不存在。")
exit(1)
# 獲取文件夾中的所有文件列表
files = os.listdir(folder_name)
# 遍歷文件
for file in files:
# 創建帶有前綴的新文件名
new_filename = f"{text}_{file}"
# 移動文件到新名稱
shutil.move(os.path.join(folder_name, file),
os.path.join(folder_name, new_file_name))
# 打印成功消息
print("文件重命名成功。")
代碼調用了toUpperCase
函數將prefix
轉換為大寫,但該函數未定義。要修復這個問題,你可以使用字符串類的upper()
方法,它可以將給定字符串轉換為大寫。修改后的代碼如下:
import os
import shutil
# 從用戶獲取文件夾名稱
folder_name = input("輸入文件夾名稱: ")
prefix = input("輸入要添加到文件名前的字符串: ")
text = prefix.upper()
# 檢查文件夾是否存在
if not os.path.isdir(folder_name):
print("文件夾不存在。")
exit(1)
# 獲取文件夾中的所有文件列表
files = os.listdir(folder_name)
# 遍歷文件
for file in files:
# 創建帶有前綴的新文件名
new_filename = f"{text}_{file}"
# 移動文件到新名稱
shutil.move(os.path.join(folder_name, file),
os.path.join(folder_name, new_filename))
# 打印成功消息
print("文件重命名成功。")
此外,代碼還有幾處其他問題:
-
變量名不一致:代碼中使用了
new_filename
和new_file_name
兩個變量名 -
沒有處理可能在重命名過程中發生的錯誤
-
沒有保留原始文件的擴展名
改進后的代碼應該包含錯誤處理和更好的文件名處理。
提示工程最佳實踐
以下是一些提示工程的最佳實踐,幫助你獲得更好的AI回答:
提供示例
在提示中提供示例是最有效的方法之一。示例可以幫助AI理解你期望的輸出格式和風格。
簡潔設計
提示應該簡潔、清晰、易于理解。如果提示對你來說已經很混亂,那么對AI來說也可能很混亂。盡量不要使用復雜的語言,不要提供不必要的信息。
改進前后對比
-
改進前:
我現在正在紐約旅游,我想了解更多關于好地方的信息。我帶著兩個3歲的孩子。我們假期應該去哪里? -
改進后:
扮演旅游指南。描述紐約曼哈頓適合帶3歲孩子參觀的好地方。
明確指定輸出
明確說明你期望的輸出。簡潔的指令可能不足以引導AI,或者太過籠統。在提示中提供具體細節可以幫助模型關注相關內容,提高整體準確性。
- 好的做法
生成一篇關于前5大視頻游戲主機的3段博客文章。博客文章應該信息豐富且吸引人,并且應該以對話風格編寫。
- 不好的做法
生成一篇關于視頻游戲主機的博客文章。
使用指令而非約束
研究表明,在提示中專注于積極指令比嚴重依賴約束更有效。這與人類更喜歡積極指令而不是"不要做什么"的列表的方式一致。
- 好的做法
生成一段關于前5大視頻游戲主機的博客文章。只討論主機、制造公司、發布年份和總銷量。
- 不好的做法
生成一段關于前5大視頻游戲主機的博客文章。不要列出視頻游戲名稱。
控制最大標記長度
要控制AI回答的長度,你可以在配置中設置最大標記限制,或者在提示中明確要求特定長度。例如:“用推特長度的消息解釋量子物理學。”
在提示中使用變量
使用變量可以讓你的提示更加動態,避免重復。例如,不要在提示中硬編碼城市名稱,而是使用變量。
使用變量的提示
變量:
{city} = "阿姆斯特丹"
提示:
你是一名旅游指南。告訴我關于這個城市的一個事實:{city}
阿姆斯特丹是一個美麗的城市,到處都是運河、橋梁和狹窄的街道。它是一個很好的地方,可以參觀其豐富的歷史、文化和夜生活。
嘗試不同的輸入格式和寫作風格
不同的模型、模型配置、提示格式、詞匯選擇和提交方式可能產生不同的結果。因此,嘗試不同的提示屬性很重要。
不同的提問方式
-
問題形式: 什么是世嘉夢幻游戲機,為什么它是如此革命性的游戲機?
-
陳述形式: 世嘉夢幻游戲機是世嘉于1999年發布的第六代視頻游戲機。它…
-
指令形式: 寫一段描述世嘉夢幻游戲機并解釋為什么它如此革命性的段落。
對于少樣本分類任務,混合不同類別
在進行分類任務時,確保在少樣本示例中混合可能的響應類別。這可以確保模型學習識別每個類別的關鍵特征,而不是簡單地記住示例的順序。
適應模型更新
了解模型架構變化、添加的數據和功能很重要。嘗試新的模型版本,并調整你的提示以更好地利用新的模型功能。
嘗試不同的輸出格式
除了提示輸入格式外,考慮嘗試不同的輸出格式。對于非創意任務,如提取、選擇、解析、排序或分類數據,嘗試讓輸出以JSON或XML等結構化格式返回。
使用JSON輸出的好處:
-
始終以相同的風格返回
-
專注于你想要接收的數據
-
減少幻覺的可能性
-
使其關系感知
-
獲得數據類型
-
可以排序
記錄提示嘗試
詳細記錄你的提示嘗試,這樣你可以隨著時間的推移了解哪些方法有效,哪些無效。
提示工程是一個迭代過程: 制作和測試不同的提示,分析并記錄結果。根據模型的表現改進你的提示。繼續實驗,直到達到期望的輸出。當你更改模型或模型配置時,回去繼續嘗試之前使用的提示。