Prompt 工程師壓箱底絕活——Prompt 的基本組成部分、格式化輸出與應用構建

本文由飛槳星河社區開發者張洪申貢獻。張洪申,本科畢業於浙江大學竺可楨學院求是數學班,目前浙江大學控制科學與工程學院博士在讀,研究方向爲數據科學、電力系統。科研工作曾被 Nature 官方公衆號 Nature portfolio 專題報道。

 

目前,大模型輸出往往包含許多冗餘信息。本文中,基於文心一言,我們給出了一種包含指令,輸入數據,背景信息和輸出提示的提示詞結構,讓大模型能夠真正直擊應用開發者的需求,嚴格執行開發者的指令,爲大模型的原生應用奠定了基礎。

前言

Prompt 中文爲“提示詞”。在大語言模型中,Prompt 的作用主要是給大語言模型提示輸入信息的上下文和輸入模型的參數信息。可以將 Prompt 類比於人類交流中的提示或者線索,幫助大語言模型理解開發者的意圖,根據線索提供恰當的響應或者輸出。Prompt 的設計對模型輸出的質量和相關性起決定性作用。然而,現有的提示詞資源,儘管一定程度上爲開發者提供了便利,但它們仍存在一些具體的問題。

問題一:提示詞缺乏理論體系。雖然已有大量的提示詞資源可供使用,開發者在實踐中仍然面臨如何有效編寫提示詞的挑戰。這是因爲目前尚未形成一套完整的理論體系來指導用戶如何構建和優化提示詞。長期以來,在嘗試和應用各式提示詞的過程中,開發者缺乏方法論的支撐,無法系統地提煉經驗、歸納規律,從而難以掌握編寫高效提示詞的技巧,這種情況不僅限制了 Prompt 的潛力發揮,也阻礙了開發者充分利用 AI 模型的能力。

問題二:輸出與開發者期望不符。當前的大語言模型在處理複雜的開發者輸入時,常常無法直接生成符合開發者具體需求的結果。模型輸出的信息可能需要開發者進行額外的人工編輯和調整,才能達到可用的狀態。開發者必須投入額外的時間和精力來修正並完善 AI 的原始輸出,這不僅降低了效率,也影響了開發者體驗。

因此,爲了幫助開發者更深刻地理解和有效地使用提示詞,本文將重點從兩個主要角度展開討論:

1. Prompt 基本組成部分。 包括指令(Instruction)、輸入數據(Input Data)、背景信息(Context)以及輸出指示器(Output Indicator),這些構成了提示詞的核心要素,對於設計有效的 AI 交互至關重要;

2. Prompt 進階應用。 基於 Prompt 的格式化結果輸出,探討如何通過精確的提示詞來格式化 AI 的輸出結果,以突顯提示詞大模型的獨特價值和應用潛力。通過這兩個層面的分析,用戶將能夠更加精準地制定和使用提示詞,以達成更優質的 AI 應用體驗。

Prompt 基本組成部分

Prompt 設計是大語言模型互動的關鍵,它可以顯著影響模型的輸出結果質量。一個合理設計的 Prompt 應當包含以下四個元素:

1.指令(Instruction): 這是 Prompt 中最關鍵的部分。指令直接告訴模型用戶希望執行的具體任務。

2.輸入數據(Input Data): 輸入數據是模型需要處理的具體信息。

3.背景信息(Context): 背景信息爲模型提供了執行任務所需的環境信息或附加細節。

4.輸出指示器(Output Indicator): 輸出指示器定義了模型輸出的期望類型或格式。

設計 Prompt 時,合理結合這四個元素,能夠顯著提升大語言模型的響應效果和輸出質量。用戶可以根據實際需求,選擇性地包含某些元素。其中,指令是必不可少的,其他元素則根據情況來決定是否添加、如何添加,使得 Prompt 更加精煉和高效。通過仔細考慮和運用這些元素,用戶將能夠更好地引導大語言模型,獲取更符合預期的結果。

用一個具體的例子進行演示。設想一個具體場景,想讓大語言模型告訴我們一位學生說的話是“正確”還是“錯誤”的,以下是一份合理的提示詞的構建過程。

1.指令(Instruction): 請判斷學生說的話是否正確

2.輸入數據(Input Data): 學生說的話:[學生說的話]

3.背景信息(Context): 正確請使用'正確'表示,錯誤請使用'錯誤'表示

4.輸出指示器(Output Indicator): 輸出格式:\n### 是否正確\n{是否正確}將提示詞進行組合,不同的內容用\n(換行符)分割:指令:請判斷學生說的話是否正確 \n 學生說的話:[學生說的話] \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確}

基於 Prompt 的格式化結果輸出與正則表達式提取

在具體的問題解決中,特別是在 AI 技術的原生應用領域,對輸出結果進行格式化是至關重要的一步。格式化輸出不僅有助於維持結果的一致性,而且能夠確保輸出的數據可以被後續的分析和處理程序正確識別和使用。大語言模型很容易產生幷包含多餘信息的答案,這些答案雖然在語言上是正確的,但卻不符合特定的格式要求,從而無法直接用於進一步的數據處理流程。

以一個具體的應用場景爲例。我們希望模型能夠指明一位學生說的話是“正確”還是“錯誤”。如果僅僅使用一個簡單直接的 Prompt,通過文字方式表達需求,例如:“請判斷 1+1=3 是否正確,正確請使用'正確'表示,錯誤請使用'錯誤'表示,請僅輸出'正確'和'錯誤',請勿輸出其他任何信息”

代碼 1

 
user_input = "請判斷1+1=3是否正確,正確請使用'正確'表示,錯誤請使用'錯誤'表示,請僅輸出'正確'和'錯誤',請勿輸出其他任何信息"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())回答1:在標準數學邏輯中,1+1=3是不正確的。
這樣的指令可能仍然不足以保證模型輸出的結果完全符合預期。AI 模型可能會產生包含額外解釋或不必要信息的響應,干擾數據的自動化處理。而實際上,如果使用 Prompt 基本組成部分中的結果,能夠完善的生成結果:"請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確} "

代碼 2

 
user_input = "請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確}"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())回答2:###是否正確錯誤
當多個需求需要實現時,也可以通過 Prompt 基礎本組成部分實現,例如希望 AI 在判斷的同時,能夠指出學生的具體錯誤:"請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確} \n###學生的錯誤\n{學生的錯誤}"

代碼 3

 
user_input = "請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確}"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())回答3:###是否正確錯誤###學生的錯誤學生的錯誤在於他們的加法計算不準確。他們認爲1+1=3,但實際上1+1=2。
在基於大模型生成固定格式的輸出結果後,一種常見的方式是基於正則表達式提取對應信息。正則表達式是一種強大的文本處理工具,它允許用戶定義一種搜索模式,然後在文本中匹配這種模式。由於它們具有高度的靈活性和功能性,正則表達式成爲了在自然語言處理、數據挖掘、日誌文件分析等衆多領域,從結構化或半結構化文本中提取信息的常用方法。

代碼 4

 
import retext = response.get_result()pattern_correctness = re.compile(r'###是否正確\n(.*?)\n###學生的錯誤', re.DOTALL)pattern_error = re.compile(r'###學生的錯誤\n(.*)', re.DOTALL)correctness_result = pattern_correctness.search(text)error_result = pattern_error.search(text)is_correct = correctness_result.group(1).strip() if correctness_result else Nonestudent_error = error_result.group(1).strip() if error_result else Noneprint(f"{is_correct}")print(f"{student_error}")回答4:錯誤1+1=3是不正確的。因爲根據數學的運算規則,1+1應該等於2而不是3。這個錯誤可能是因爲學生在進行加法運算時發生了混淆或者疏忽。
在格式化生成大模型回覆時,我們使用’###'作爲提取標識,這樣的格式化標籤可以作爲文本塊的起始點,爲正則匹配提供了明確的錨點。這種明確的標記方式,簡化了正則表達式的編寫。通過使用 Python 的 re 模塊,可以實現基於大模型的特定信息提取。正則表達式在信息提取方面是一個極其有用的工具,特別是當與大模型生成固定格式的輸出結果後進行信息提取。基於提取信息的進一步加工能夠讓大模型助力各種應用的蓬勃發展!

基於飛槳星河社區開發 AI 應用

飛槳星河社區是百度潛心打造的專業大模型社區,爲開發者提供算力、模型庫、數據集、工具套件、實訓項目、社區交流等全方位服務,使得開發者可以輕鬆地開展人工智能項目。該平臺的一大亮點是其輕量化的代碼實現方式,允許用戶通過簡潔的代碼就能夠快速搭建和訓練模型,大大降低了入門門檻。用戶無需關心底層的環境配置,因爲平臺已經提供了預配置的開發環境,包括常用的機器學習和深度學習框架及庫。這意味着用戶可以直接在 Web 界面上編寫代碼,運行實驗,而無需花費時間去安裝和維護各種軟件和硬件環境。此外,飛槳星河社區的一個顯著優勢是其可訪問性。用戶可以直接訪問平臺,它確保了用戶可以穩定和高效地連接到飛槳星河社區的服務,註冊之後即可進入 Coding 界面快樂的編程啦!

常規提示詞結構

 
import ernieboterniebot.api_type = 'aistudio'erniebot.access_token = '<your token>’user_input = "請判斷1+1=3是否正確,正確請使用'正確'表示,錯誤請使用'錯誤'表示,請僅輸出'正確'和'錯誤',請勿輸出其他任何信息"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())
 

Prompt 基本組成部分+單任務格式化輸出

 
import ernieboterniebot.api_type = 'aistudio'erniebot.access_token = '<your token>’user_input = "請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確}"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())
 

Prompt 基本組成部分+多任務格式化輸出

 
import ernieboterniebot.api_type = 'aistudio'erniebot.access_token = '<your token>’user_input = "請判斷學生說的話是否正確 \n 學生說的話:1+1=3 \n 信息:正確請使用'正確'表示,錯誤請使用'錯誤'表示 \n 輸出格式:\n###是否正確\n{是否正確} \n###學生的錯誤\n{學生的錯誤}"response = erniebot.ChatCompletion.create(    model='ernie-3.5',    messages=[{        'role': 'user',        'content': user_input    }])print(response.get_result())
 

隨着通用大語言模型的發展和智能 Agent 技術的興起,我們正迎來 AI 應用開發的一個新時代。無論是有深厚技術背景的開發者還是非技術人員,都能在這個新時代中找到屬於自己的空間,開發自己的專屬應用。AI 的未來,充滿無限潛力和廣闊天地,等待我們去探索和創造。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章