提示原則
一、編寫清晰、具體的指令
- 使用分隔符清晰地表示輸入的不同部分:
- 在Prompt中使用分隔符,如```、“”"、< >、 、:等,將不同的文本部分區分開來,避免混淆和意外的結果。
- 分隔符能夠防止提示詞注入,提高模型輸出的準確性和可靠性。
from tool import get_completiontext = f"""
您應該提供盡可能清晰、具體的指示,以表達您希望模型執行的任務。\
這將引導模型朝向所需的輸出,并降低收到無關或不正確響應的可能性。\
不要將寫清晰的提示詞與寫簡短的提示詞混淆。\
在許多情況下,更長的提示詞可以為模型提供更多的清晰度和上下文信息,從而導致更詳細和相關的輸出。
"""
# 需要總結的文本內容
prompt = f"""
把用三個反引號括起來的文本總結成一句話。
```{text}```
"""
# 指令內容,使用 ```來分隔指令和待總結的內容
response = get_completion(prompt)
print(response)
- 尋求結構化的輸出:
- 請求語言模型以結構化格式(如JSON)返回結果,便于進一步處理和解析。
- 結構化輸出適合在代碼中進一步解析和處理,提高了效率和可操作性。
prompt = f"""
請生成包括書名、作者和類別的三本虛構的、非真實存在的中文書籍清單,\
并以 JSON 格式提供,其中包含以下鍵:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
{"books": [{"book_id": 1,"title": "迷失的時光","author": "張三","genre": "科幻"},{"book_id": 2,"title": "幻境之門","author": "李四","genre": "奇幻"},{"book_id": 3,"title": "虛擬現實","author": "王五","genre": "科幻"}]
}
- 要求模型檢查是否滿足條件:
- 在Prompt中要求模型檢查條件,如果不滿足則指出并停止執行后續操作。
- 考慮可能出現的邊緣情況和模型的應對策略,避免意外結果或錯誤發生。
# 滿足條件的輸入(text中提供了步驟)
text_1 = f"""
泡一杯茶很容易。首先,需要把水燒開。\
在等待期間,拿一個杯子并把茶包放進去。\
一旦水足夠熱,就把它倒在茶包上。\
等待一會兒,讓茶葉浸泡。幾分鐘后,取出茶包。\
如果您愿意,可以加一些糖或牛奶調味。\
就這樣,您可以享受一杯美味的茶了。
"""
prompt = f"""
您將獲得由三個引號括起來的文本。\
如果它包含一系列的指令,則需要按照以下格式重新編寫這些指令:第一步 - ...
第二步 - …
…
第N步 - …如果文本中不包含一系列的指令,則直接寫“未提供步驟”。"
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 的總結:")
print(response)
Text 1 的總結:
第一步 - 把水燒開。
第二步 - 拿一個杯子并把茶包放進去。
第三步 - 把燒開的水倒在茶包上。
第四步 - 等待幾分鐘,讓茶葉浸泡。
第五步 - 取出茶包。
第六步 - 如果需要,加入糖或牛奶調味。
第七步 - 就這樣,您可以享受一杯美味的茶了。
# 不滿足條件的輸入(text中未提供預期指令)
text_2 = f"""
今天陽光明媚,鳥兒在歌唱。\
這是一個去公園散步的美好日子。\
鮮花盛開,樹枝在微風中輕輕搖曳。\
人們外出享受著這美好的天氣,有些人在野餐,有些人在玩游戲或者在草地上放松。\
這是一個完美的日子,可以在戶外度過并欣賞大自然的美景。
"""
prompt = f"""
您將獲得由三個引號括起來的文本。\
如果它包含一系列的指令,則需要按照以下格式重新編寫這些指令:第一步 - ...
第二步 - …
…
第N步 - …如果文本中不包含一系列的指令,則直接寫“未提供步驟”。"
\"\"\"{text_2}\"\"\"
"""
response = get_completion(prompt)
print("Text 2 的總結:")
print(response)
Text 2 的總結:
未提供步驟。
- 提供少量示例:
- 在任務開始前,提供少量示例樣本,讓模型了解要求和期望的輸出樣式。
- 少量示例可以幫助模型快速上手新任務,提高效率和準確性。
prompt = f"""
您的任務是以一致的風格回答問題。<孩子>: 請教我何為耐心。<祖父母>: 挖出最深峽谷的河流源于一處不起眼的泉眼;最宏偉的交響樂從單一的音符開始;最復雜的掛毯以一根孤獨的線開始編織。<孩子>: 請教我何為韌性。
"""
response = get_completion(prompt)
print(response)
<祖父母>: 韌性是一種堅持不懈的品質,就像一棵頑強的樹在風雨中屹立不倒。它是面對困難和挑戰時不屈不撓的精神,能夠適應變化和克服逆境。韌性是一種內在的力量,讓我們能夠堅持追求目標,即使面臨困難和挫折也能堅持不懈地努力。
二、給模型時間去思考
- 給予語言模型充足的推理時間非常重要,避免讓模型匆忙給出結論,減少錯誤的可能性。
- 在Prompt中添加逐步推理的要求,讓模型有足夠的時間進行深入思考和邏輯推理,提高結果的可靠性和準確性。
- 接下來,我們將展示這一策略的效果,通過給定一個復雜任務,提供一系列步驟來完成。首先,我們將描述杰克和吉爾的故事,并給出以下操作的提示詞:
- 用一句話概括三個反引號限定的文本。
- 將摘要翻譯成英語。
- 在英語摘要中列出每個名稱。
- 輸出包含以下鍵的JSON對象:英語摘要和人名個數。要求輸出以換行符分隔。
2.1 指定完成任務所需的步驟
text = f"""
在一個迷人的村莊里,兄妹杰克和吉爾出發去一個山頂井里打水。\
他們一邊唱著歡樂的歌,一邊往上爬,\
然而不幸降臨——杰克絆了一塊石頭,從山上滾了下來,吉爾緊隨其后。\
雖然略有些摔傷,但他們還是回到了溫馨的家中。\
盡管出了這樣的意外,他們的冒險精神依然沒有減弱,繼續充滿愉悅地探索。
"""
# example 1
prompt_1 = f"""
執行以下操作:
1-用一句話概括下面用三個反引號括起來的文本。
2-將摘要翻譯成英語。
3-在英語摘要中列出每個人名。
4-輸出一個 JSON 對象,其中包含以下鍵:english_summary,num_names。請用換行符分隔您的答案。Text:
```{text}```
"""
response = get_completion(prompt_1)
print("prompt 1:")
print(response)
prompt 1:
1-兩個兄妹在山上打水時發生意外,但最終平安回家。
2-In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.
3-Jack, Jill
4-{"english_summary": "In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.", "num_names": 2}
接下來,我們將展示這一策略的效果,通過給定一個復雜任務,提供一系列步驟來完成。首先,我們將描述杰克和吉爾的故事,并給出以下操作的提示詞:
- 用一句話概括三個反引號限定的文本。
- 將摘要翻譯成英語。
- 在英語摘要中列出每個名稱。
- 輸出包含英語摘要和人名個數的JSON對象,要求使用英語鍵名,如 “summary” 和 “names_count”。輸出內容應以換行符分隔。
prompt_2 = f"""
1-用一句話概括下面用<>括起來的文本。
2-將摘要翻譯成英語。
3-在英語摘要中列出每個名稱。
4-輸出一個 JSON 對象,其中包含以下鍵:English_summary,num_names。請使用以下格式:
文本:<要總結的文本>
摘要:<摘要>
翻譯:<摘要的翻譯>
名稱:<英語摘要中的名稱列表>
輸出 JSON:<帶有 English_summary 和 num_names 的 JSON>Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nprompt 2:")
print(response)
prompt 2:
Summary: 在一個迷人的村莊里,兄妹杰克和吉爾在山頂井里打水時發生了意外,但他們的冒險精神依然沒有減弱,繼續充滿愉悅地探索。Translation: In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.Names: Jack, JillJSON Output: {"English_summary": "In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.", "num_names": 2}
2.2 指導模型在下結論之前找出一個自己的解法
在設計 Prompt 時,我們還可以通過明確指導語言模型進行自主思考,來獲得更好的效果。
舉個例子,假設我們要語言模型判斷一個數學問題的解答是否正確。僅僅提供問題和解答是不夠的,語言模型可能會匆忙做出錯誤判斷。
相反,我們可以在 Prompt 中先要求語言模型自己嘗試解決這個問題,思考出自己的解法,然后再與提供的解答進行對比,判斷正確性。這種先讓語言模型自主思考的方式,能幫助它更深入理解問題,做出更準確的判斷。
接下來我們會給出一個問題和一份來自學生的解答,要求模型判斷解答是否正確:
prompt = f"""
判斷學生的解決方案是否正確。問題:
我正在建造一個太陽能發電站,需要幫助計算財務。土地費用為 100美元/平方英尺我可以以 250美元/平方英尺的價格購買太陽能電池板我已經談判好了維護合同,每年需要支付固定的10萬美元,并額外支付每平方英尺10美元作為平方英尺數的函數,首年運營的總費用是多少。學生的解決方案:
設x為發電站的大小,單位為平方英尺。
費用:土地費用:100x太陽能電池板費用:250x維護費用:100,000美元+100x總費用:100x+250x+100,000美元+100x=450x+100,000美元
"""
response = get_completion(prompt)
print(response)
學生的解決方案是正確的。他正確地計算了土地費用、太陽能電池板費用和維護費用,并將它們相加得到了總費用。
但是注意,學生的解決方案實際上是錯誤的。(維護費用項100x應為10x,總費用450x應為360x)
我們可以通過指導模型先自行找出一個解法來解決這個問題。
在接下來這個 Prompt 中,我們要求模型先自行解決這個問題,再根據自己的解法與學生的解法進行對比,從而判斷學生的解法是否正確。同時,我們給定了輸出的格式要求。通過拆分任務、明確步驟,讓模型有更多時間思考,有時可以獲得更準確的結果。在這個例子中,學生的答案是錯誤的,但如果我們沒有先讓模型自己計算,那么可能會被誤導以為學生是正確的。
prompt = f"""
請判斷學生的解決方案是否正確,請通過如下步驟解決這個問題:步驟:首先,自己解決問題。然后將您的解決方案與學生的解決方案進行比較,對比計算得到的總費用與學生計算的總費用是否一致,并評估學生的解決方案是否正確。在自己完成問題之前,請勿決定學生的解決方案是否正確。使用以下格式:問題:問題文本學生的解決方案:學生的解決方案文本實際解決方案和步驟:實際解決方案和步驟文本學生計算的總費用:學生計算得到的總費用實際計算的總費用:實際計算出的總費用學生計算的費用和實際計算的費用是否相同:是或否學生的解決方案和實際解決方案是否相同:是或否學生的成績:正確或不正確問題:我正在建造一個太陽能發電站,需要幫助計算財務。 - 土地費用為每平方英尺100美元- 我可以以每平方英尺250美元的價格購買太陽能電池板- 我已經談判好了維護合同,每年需要支付固定的10萬美元,并額外支付每平方英尺10美元;作為平方英尺數的函數,首年運營的總費用是多少。學生的解決方案:設x為發電站的大小,單位為平方英尺。費用:1. 土地費用:100x美元2. 太陽能電池板費用:250x美元3. 維護費用:100,000+100x=10萬美元+10x美元總費用:100x美元+250x美元+10萬美元+100x美元=450x+10萬美元實際解決方案和步驟:
"""
response = get_completion(prompt)
print(response)
實際解決方案和步驟:1. 土地費用:每平方英尺100美元,所以總費用為100x美元。2. 太陽能電池板費用:每平方英尺250美元,所以總費用為250x美元。3. 維護費用:固定費用為10萬美元,額外費用為每平方英尺10美元,所以總費用為10萬美元+10x美元。4. 總費用:將上述三項費用相加,得到總費用為100x美元+250x美元+10萬美元+10x美元=360x+10萬美元。學生計算的總費用:450x+10萬美元
實際計算的總費用:360x+10萬美元
學生計算的費用和實際計算的費用是否相同:否
學生的解決方案和實際解決方案是否相同:否
學生的成績:不正確
三、局限性
開發大模型相關應用時請務必銘記:
虛假知識:模型偶爾會生成一些看似真實實則編造的知識
在開發與應用語言模型時,需要注意它們可能生成虛假信息的風險。盡管模型經過大規模預訓練,掌握了豐富知識,但它實際上并沒有_完全_記住所見的信息,難以準確判斷自己的知識邊界,可能做出錯誤推斷。若讓語言模型描述一個不存在的產品,它可能會自行構造出似是而非的細節。這被稱為“幻覺”(Hallucination),是語言模型的一大缺陷。
如下示例展示了大模型的幻覺。我們要求告訴我們華為公司生產的 GT Watch 運動手表 產品的信息,事實上,這個公司是真實存在的,但產品是編造的,而模型一本正經地提供了它編造的知識,而且迷惑性很強。
prompt = f"""
告訴我華為公司生產的GT Watch運動手表的相關信息
"""
response = get_completion(prompt)
print(response)
華為公司生產的GT Watch運動手表是一款智能手表,具有多種功能和特點。以下是相關信息:1. 設計和外觀:GT Watch采用圓形表盤設計,具有精致的外觀和高質量的材料制造。它有多種顏色和表帶選擇,可以根據個人喜好進行定制。2. 顯示屏:GT Watch配備了1.39英寸的AMOLED顯示屏,具有高清分辨率和良好的可視性。用戶可以通過觸摸屏幕進行操作和導航。3. 運動追蹤:GT Watch具有全天候的運動追蹤功能,可以監測用戶的步數、跑步距離、卡路里消耗和心率等數據。它還支持多種運動模式,如跑步、騎行、游泳等。4. 健康監測:GT Watch可以監測用戶的心率、血氧飽和度和睡眠質量等健康指標。它還提供健康建議和提醒,幫助用戶保持良好的健康狀態。5. 通知和連接:GT Watch可以與用戶的手機進行連接,通過藍牙技術實現通知推送和電話提醒。用戶可以在手表上查看短信、電話和社交媒體通知,無需拿出手機。6. 長續航時間:GT Watch具有較長的續航時間,一次充電可以使用數天。它還支持快速充電技術,可以在短時間內充滿電。7. 其他功能:GT Watch還具有其他功能,如天氣預報、鬧鐘、計時器、計步器等。它還支持NFC支付和音樂控制等便利功能。總體而言,華為GT Watch是一款功能強大、外觀精致的智能運動手表,適合那些注重健康和運動的用戶使用。
- 問題: 語言模型可能生成虛假信息,令人難以分辨真偽,影響應用的可靠性與安全性。
- 解決方案: 開發者可通過優化Prompt設計降低幻覺發生的可能性,例如先引用原文再解答。目前,相關公司正在研究解決該問題,但需謹慎使用語言模型。
- 注意事項: 在應用語言模型時,需警惕幻覺信息對應用的影響,采取措施減少幻覺發生的可能性。