原則一:編寫清晰、具體的指令#
提供盡可能清晰和具體的指令。
策略一:使用分隔符,分割輸入信息中的不同部分。
分隔符可以是:```,"",<>,<tag>,<\tag > 等任何標記符號。將特定的文本部分與其餘部分分開。
避免提示注入:提示注入是指如果用戶將某些輸入添加到提示中,則可能會向模型提供與您想要執行的操作相衝突的指令,從而使其遵循衝突的指令而不是執行您想要的操作。即,輸入裡面可能包含其他指令,會覆蓋掉你的指令。
例子:
text = f"""
你應該提供盡可能清晰、具體的指示,以表達你希望模型執行的任務。\
這將引導模型朝向所需的輸出,並降低收到無關或不正確響應的可能性。\
不要將寫清晰的提示與寫簡短的提示混淆。\
在許多情況下,更長的提示可以為模型提供更多的清晰度和上下文信息,從而導致更詳細和相關的輸出。
"""
# 需要總結的文本內容
prompt = f"""
把用三個反引號括起來的文本總結成一句話。
```{text}```
"""
輸出為:
提供清晰具體的指示,避免無關或不正確響應,不要混淆寫清晰和寫簡短,
更長的提示可以提供更多清晰度和上下文信息,導致更詳細和相關的輸出。
策略二:要求結構化的輸出
生成一個結構化的輸出,例如 JSON、HTML 格式的數據,這樣的輸出更容易被代碼解析。例如,在 Python 中變能方便的處理 JSON 數據,比如將其讀入字典或列表中。
例子:
prompt = f"""
請生成包括書名、作者和類別的三本虛構書籍清單,\
並以 JSON 格式提供,其中包含以下鍵:book_id、title、author、genre。
"""
輸出:
{
"books": [
{
"book_id": 1,
"title": "The Shadow of the Wind",
"author": "Carlos Ruiz Zafón",
"genre": "Mystery"
},
{
"book_id": 2,
"title": "The Name of the Wind",
"author": "Patrick Rothfuss",
"genre": "Fantasy"
},
{
"book_id": 3,
"title": "The Hitchhiker's Guide to the Galaxy",
"author": "Douglas Adams",
"genre": "Science Fiction"
}
]
}
策略三:要求模型檢查是否滿足條件
讓模型先檢查任務做出的假設,如果不滿足,指示並停止執行。
告訴模型應該如何處理潛在的邊緣情況,以避免意外的錯誤或結果。
例子:
prompt = f"""
您將獲得由三個引號括起來的文本。\
如果它包含一系列的指令,則需要按照以下格式重新編寫這些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,則直接寫“未提供步驟”。"
text_1 = f"""
泡一杯茶很容易。首先,需要把水燒開。\
在等待期間,拿一個杯子並把茶包放進去。\
一旦水足夠熱,就把它倒在茶包上。\
等待一會兒,讓茶葉浸泡。幾分鐘後,取出茶包。\
如果你願意,可以加一些糖或牛奶調味。\
就這樣,你可以享受一杯美味的茶了。
"""
text1的輸出:
第一步 - 把水燒開。
第二步 - 拿一個杯子並把茶包放進去。
第三步 - 把燒開的水倒在茶包上。
第四步 - 等待幾分鐘,讓茶葉浸泡。
第五步 - 取出茶包。
text_2 = f"""
今天陽光明媚,鳥兒在歌唱。\
這是一個去公園散步的美好日子。\
鮮花盛開,樹枝在微風中輕輕搖曳。\
人們外出享受著這美好的天氣,有些人在野餐,有些人在玩遊戲或者在草地上放鬆。\
這是一個完美的日子,可以在戶外度過並欣賞大自然的美景。
"""
text2的輸出:
未提供步驟
策略四:提供少量示例
在要求模型執行實際任務之前,提供給它少量成功執行任務的示例。
例子:任務是要求模型以一致的風格回答問題,並先給它一個孩子和一個祖父之間的對話的例子。
prompt = f"""
你的任務是以一致的風格回答問題。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峽谷的河流源於一處不起眼的泉眼;最宏偉的交響樂從單一的音符開始;最複雜的掛毯以一根孤獨的線開始編織。
<孩子>: 教我韌性。
"""
輸出:
<祖父母>: 韌性就像是一棵樹,它需要經歷風吹雨打、日曬風乾,才能成長得更加堅強。所以,當你遇到挫折和困難時,不要輕易放棄,要堅持下去,相信自己的能力和潛力,最終你會成為一棵高大的樹。
原則二:給模型時間去思考#
如果模型急於得出結論而出現推理錯誤,應該嘗試重新設計提問,要求模型在提供最終答案之前進行一系列相關的推理,再給出答案。
如果在給模型一個太過複雜的任務,它就無法在短時間或用少量文字來完成,從而編造一個不正確的猜測。這種情況對人來說也是一樣的,如果讓一個人在沒有時間計算出答案的情況下完成複雜的數學問題,他們也可能會犯錯誤。因此,可以提示模型花更多時間思考問題,這意味著它在該任務上花費了更多的計算資源。
策略一:指定完成任務所需的步驟
先給定一個複雜任務,然後給出完成該任務的一系列步驟。
例如:
我們描述了傑克和吉爾的故事,並給出一個指令。該指令執行以下操作:首先,用一句話概括文本。第二,將摘要翻譯成法語。第三,在法語摘要中列出每個名稱。第四,輸出包含以下鍵的 JSON 對象:法語摘要和名稱數。
text = f"""
在一個迷人的村莊裡,兄妹傑克和吉爾出發去一個山頂井裡打水。\
他們一邊唱著歡樂的歌,一邊往上爬,\
然而不幸降臨——傑克絆了一塊石頭,從山上滾了下來,吉爾緊隨其後。\
雖然略有些摔傷,但他們還是回到了温馨的家中。\
儘管出了這樣的意外,他們的冒險精神依然沒有減弱,繼續充滿愉悅地探索。
"""
prompt_1 = f"""
執行以下操作:
1-用一句話概括下面用三個反引號括起來的文本。
2-將摘要翻譯成法語。
3-在法語摘要中列出每個人名。
4-輸出一個 JSON 對象,其中包含以下鍵:French_summary,num_names。
請用換行符分隔您的答案。
Text:
```{text}```
"""
# 得到輸出
1-兄妹在山頂井裡打水時發生意外,但仍然保持冒險精神。
2-Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet de la montagne. Malheureusement, Jack trébuche sur une pierre et tombe de la montagne, suivi de près par Jill. Bien qu'ils soient légèrement blessés, ils retournent chez eux chaleureusement. Malgré cet accident, leur esprit d'aventure ne diminue pas et ils continuent à explorer joyeusement.
3-Jack, Jill
4-{
"French_summary": "Dans un charmant village, les frère et sœur Jack et Jill partent chercher de l'eau dans un puits au sommet de la montagne. Malheureusement, Jack trébuche sur une pierre et tombe de la montagne, suivi de près par Jill. Bien qu'ils soient légèrement blessés, ils retournent chez eux chaleureusement. Malgré cet accident, leur esprit d'aventure ne diminue pas et ils continuent à explorer joyeusement.",
"num_names": 2
}
# 指定輸出格式
prompt_2 = f"""
你的任務是執行以下操作:
1-用一句話概括下面用<>括起來的文本。
2-將摘要翻譯成英語。
3-在英語摘要中列出每個名稱。
4-輸出一個 JSON 對象,其中包含以下鍵:English_summary,num_names。
請使用以下格式:
文本:<要總結的文本>
摘要:<摘要>
翻譯:<摘要的翻譯>
名稱:<英語摘要中的名稱列表>
輸出 JSON:<帶有 English_summary 和 num_names 的 JSON>
Text: <{text}>
"""
# 得到輸出
摘要:兄妹傑克和吉爾在迷人的村莊裡冒險,不幸摔傷後回到家中,但仍然充滿冒險精神。
翻譯:In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.
名稱:Jack,Jill
輸出 JSON:{"English_summary": "In a charming village, siblings Jack and Jill set out to fetch water from a mountaintop well. While climbing and singing, Jack trips on a stone and tumbles down the mountain, with Jill following closely behind. Despite some bruises, they make it back home safely. Their adventurous spirit remains undiminished as they continue to explore with joy.", "num_names": 2}
策略二:指導模型在下結論之前找出一個自己的解法
指導模型在做決策之前要推理出自己的解決方案時,會得到更好的結果。
例子:
prompt = f"""
判斷學生的解決方案是否正確。
問題:
我正在建造一個太陽能發電站,需要幫助計算財務。
土地費用為 100美元/平方英尺
我可以以 250美元/平方英尺的價格購買太陽能電池板
我已經談判好了維護合同,每年需要支付固定的10萬美元,並額外支付每平方英尺10美元
作為平方英尺數的函數,首年運營的總費用是多少。
學生的解決方案:
設x為發電站的大小,單位為平方英尺。
費用:
土地費用:100x
太陽能電池板費用:250x
維護費用:100,000美元+100x
總費用:100x+250x+100,000美元+100x=450x+100,000美元
"""
模型會回答方案正確。其實是錯誤的。
可以通過指導模型先自行找出一個解法來解決這個問題,要求模型先自行解決這個問題,再根據自己的解法與學生的解法進行對比,從而判斷學生的解法是否正確。同時,我們給定了輸出的格式要求。通過明確步驟,讓模型有更多時間思考,有時可以獲得更準確的結果。
prompt = f"""
請判斷學生的解決方案是否正確,請通過如下步驟解決這個問題:
步驟:
首先,自己解決問題。
然後將你的解決方案與學生的解決方案進行比較,並評估學生的解決方案是否正確。在自己完成問題之前,請勿決定學生的解決方案是否正確。
使用以下格式:
問題:問題文本
學生的解決方案:學生的解決方案文本
實際解決方案和步驟:實際解決方案和步驟文本
學生的解決方案和實際解決方案是否相同:是或否
學生的成績:正確或不正確
問題:
我正在建造一個太陽能發電站,需要幫助計算財務。
- 土地費用為每平方英尺100美元
- 我可以以每平方英尺250美元的價格購買太陽能電池板
- 我已經談判好了維護合同,每年需要支付固定的10萬美元,並額外支付每平方英尺10美元
作為平方英尺數的函數,首年運營的總費用是多少。
學生的解決方案:
設x為發電站的大小,單位為平方英尺。
費用:
1. 土地費用:100x
2. 太陽能電池板費用:250x
3. 維護費用:10萬+100x
總費用:100x+250x+10萬+100x=450x+10萬
實際解決方案和步驟:
"""
GPT-3.5輸出:
正確的解決方案和步驟:
1. 計算土地費用:100美元/平方英尺 * x平方英尺 = 100x美元
2. 計算太陽能電池板費用:250美元/平方英尺 * x平方英尺 = 250x美元
3. 計算維護費用:10萬 + 10美元/平方英尺 * x平方英尺 = 10萬 + 10x美元
4. 計算總費用:100x美元 + 250x美元 + 10萬 + 10x美元 = 360x + 10萬美元
學生的解決方案和實際解決方案是否相同:是/否 (也可能輸出是,也有可能輸出否)
學生的成績:正確/不正確(也可能輸出正確,也有可能輸出不正確)
GPT-4就沒問題
三、局限性#
虛假知識:模型偶爾會生成一些看似真實實則編造的知識如果模型在訓練過程中接觸了大量的知識,它並沒有完全記住所見的信息,因此它並不很清楚自己知識的邊界。這意味著它可能會嘗試回答有關晦澀主題的問題,並編造聽起來合理但實際上並不正確的答案。我們稱這些編造的想法為幻覺。
模型會輸出看上去非常真實的編造知識,這有時會很危險。因此,請使用上面介紹的一些技巧,在構建應用程序時避免這種情況。另一種減少幻覺的策略是先要求模型找到文本中的任何相關引用,然後要求它使用這些引用來回答問題,這種追溯源文檔的方法通常對減少幻覺非常有幫助。