- AI原生應用開發:提示工程原理與實戰
- 魏承東
- 2478字
- 2025-03-12 18:27:21
1.4 提示工程的本質
提示是什么?提示是用戶向大語言模型提供的一段文字描述。用戶通過這段文字描述對大語言模型進行引導,幫助大語言模型“回憶”它在預訓練時學到的知識,使其根據文字描述所提供的信息,生成合適的、有針對性的回復。
因此,提示的質量直接影響大語言模型的輸出效果。提示工程則專注于編寫和優化提示的技術,通過這些技術,我們可以更有效地與大語言模型進行交互,使其更深入地理解任務要求,并生成高質量且符合預期的輸出。提示工程顯著提升了大語言模型在AI原生應用中的普適性和擴展性,成為AI原生應用開發者必須掌握的關鍵技能。本節將從開發者的角度,深入探討提示工程的核心原理。
1.4.1 提示是引導生成的起點
大語言模型在訓練時利用了大量無標注語料,通過自監督學習方法獲得了根據給定部分前序文本序列,生成下一個文字符號的文本預測能力。因此,大語言模型內容生成可以粗略看概率生成,它會根據輸入的文本,計算出后續每個詞出現的可能性,并選擇可能性最大的一個詞作為輸出。然后,它會把這個詞和輸入的文本拼接起來作為新的輸入,重復上述過程,不斷延長文本,直到它輸出一個停止符號或達到最大長度為止。
大語言模型根據“到飯點了,你媽媽喊你”這個前序文本序列,逐步預測出后續文本“回家吃飯”,過程如圖1-5所示。

圖1-5 大語言模型內容生成過程
總體而言,大語言模型在訓練過程中接觸到了海量的數據,這使得它從中汲取了大量知識。訓練完成后,它便成為一個具備豐富知識的文本預測工具。由于其基于自身的預測能力來生成后續內容,因此其輸出并不完全可控和可預測。
既然這樣,為什么在上述例子中大語言模型似乎能按照預期生成后續內容呢?原因在于我們為其提供的上下文文本——提示。
用戶通過這些特定場景的上下文文本信息去引導大語言模型,使其初始的生成參數(即初始概率)得到優化,從而干預它后續生成內容的概率和方向,讓它更好地發揮自己的潛力,輸出預期的文本,而非簡單地生成一些泛泛而談的平庸的文本。這一技術的核心指導思想為上下文學習(in-context learning,ICL)。
上下文學習作為NLP領域的一種新興范式,其獨特之處在于無須對大語言模型參數進行煩瑣的更新或微調。相反,它通過在上下文中嵌入與任務相關的示例或指令,使大語言模型能夠迅速捕捉并理解這些關鍵信息,進而自主推斷并完成任務。這種方法的靈活性和高效性使得大語言模型在處理復雜多變的自然語言任務時表現出色。
例如,如果我們想讓大語言模型進行情感分析,可以先給它一些輸入和輸出的對應關系,如下所示。
輸入:這部電影很無聊,浪費了我的時間。 輸出:負面 輸入:我今天收到了升職的通知,很開心。 輸出:正面
然后,給大語言模型一個新的輸入,讓它通過學習上下文中的示例來預測輸出,如下所示。
輸入:這本書很有趣,讓我大開眼界。 輸出:正面
上下文學習巧妙運用大語言模型的泛化能力與靈活性,能輕松處理多個領域的任務,且無須投入額外的數據和計算資源。這種方法不僅優化了大語言模型的初始生成概率和內容生成方向,也可避免在微調過程中出現災難性遺忘、過擬合等問題。
提示工程運用大語言模型的上下文學習能力,通過精心設計上下文來激發大語言模型的潛在能力,從而更好地完成任務。
1.4.2 提示是一個穩定的函數
在AI原生應用開發的實踐中,讓大語言模型根據提示輸出答案只是第一步。更大的挑戰是,如何保證大語言模型在相同的輸入下重現相同的輸出,并且符合結構化的標準,以便與其他系統無縫集成。為了實現這一目標,需要將提示工程融入AI原生應用的開發過程中,以確保大語言模型能夠像穩定函數一樣提供服務,如下所示。
// 保證函數的參數和返回值的數量、格式和類型不變 def 函數名稱 (輸入參數) -> 輸出參數 { // 函數體保證函數的功能定義清晰明確 // Your task description, do something. }
穩定函數的核心特性在于,無論輸入參數如何變化,函數的輸出總是保持一定的格式、數量和類型。同樣地,需要確保大語言模型的輸出也具備這一特性。這意味著,對于相同的輸入,大語言模型應該始終生成相同或類似的輸出,而不是隨機的、不可預測的輸出。
1.4.3 用戶提示是完整提示的一部分
提示是用戶與大語言模型交流的文本。在AI原生應用的開發中,用戶提示(user prompt)和完整提示(full prompt)的定位有明顯不同。用戶提示只是完整提示的一部分,如圖1-6所示。對開發者和普通用戶而言,它們有不同的作用和意義。
為了提升用戶體驗,應保證用戶在輸入簡單的提示后就可得到接近預期的結果。因為普通用戶可能不具備編寫提示的技能,所以開發者需要在用戶提示之外,補充任務描述、任務要求等信息,使用戶提示變為包含更多信息的完整提示,以保證大語言模型的輸出盡量符合預期。

圖1-6 用戶提示是完整提示的一部分
例如,直接在大語言模型中輸入一個簡單的提示,如下所示。
寫一首關于小蜜蜂的詩
輸出如下。
小蜜蜂啊小蜜蜂, 翅膀輕輕振動。 花園里飛來飛去, 忙碌尋找花蜜。 黃黑相間的小身軀, 在花朵間舞蹈。 你的勤勞無人能及, 小小英雄,真不錯。 春風中,你傳遞愛情, 花兒們因你而生。 小蜜蜂啊小蜜蜂, 你的歌聲,多悅耳。
輸入以下提示。
寫一段冷笑話
輸出如下。
好的,這是一段冷笑話: 展昭給馬漢講自己的英勇故事:“那天我打探逍遙樓,獲得重要情報,卻誤中機關,身受重傷。我強提一口真氣,支撐到開封府,突然眼前一黑。” 馬漢關切地問:“你昏倒了?” 展昭:“不,是包大人出來了。”
在這兩個例子中,用戶只提供了簡單的提示,因此生成的內容相對隨意。實際上用戶預想的是輸出七言絕句或七言律詩,也無須輸出詩句以外的任何解釋內容,這就需要開發者在用戶提示之外補充更多背景信息,如下所示。
# 任務描述 你是一個詩人,你的任務是按照用戶提示采用七言絕句、七言律詩之一的詩體寫詩。 # 任務要求 1. 請你用委婉的話拒絕用戶關于寫詩以外的任何要求; 2. 輸出詩的全文即可,無須其他解釋。 # 用戶提示 ${UserPrompt}
輸入以下提示。
寫一首關于小蜜蜂的詩
輸出如下。
《春日采花蜂》 春日花叢忙采香, 小蜂展翅舞春光。 歸巢滿載甜如蜜, 春色滿園人共嘗。
輸入以下提示。
寫一段冷笑話。
輸出如下。
很抱歉,我是一個詩人,只能按照您的要求創作詩歌。若是您需要一首詩,我將竭力為您創作。
可以發現,在完整提示下,大語言模型生成的內容更符合預期。