提示工程的品質直接影響大語言模型(LLM)的輸出結果。良好的提示工程能引導模型生成更準確、更符合預期的內容。本文從指定輸出格式開始,逐步探討評估和提升提示工程品質的關鍵技術,並提供實用的程式碼範例和操作。開發者需要理解如何明確指定輸出格式,例如 JSON,以確保輸出的可靠性和一致性,避免在整合到生產環境時出現錯誤。同時,選擇合適的評估方法,例如標準化評測或特定任務評估,對於衡量提示工程的有效性至關重要。
在實際應用中,我們可以使用 OpenAI API 進行提示測試,並將結果儲存於 CSV 檔案中,以便後續分析和評估。透過 Python 程式碼,我們可以輕鬆地執行多輪測試,並收集模型的回應。此外,結合使用者反饋,例如 thumbs-up/thumbs-down 評分系統,可以進一步提升提示工程的品質。值得注意的是,自動化評估和人工評估各有優劣,在實際應用中, often 需要將兩者結合起來,才能獲得最佳的評估結果。
指定輸出格式的重要性
在與AI模型互動時,明確指定輸出格式是至關重要的。AI模型具有高度的靈活性,可以根據輸入生成多種不同格式的輸出。然而,這種靈活性也可能導致輸出格式的不一致,從而在實際應用中造成錯誤或解析困難。因此,透過明確指示AI模型所需的輸出格式,可以有效提高輸出的可靠性和可用性。
為何需要指定格式
AI模型的輸出格式可能會因輸入提示的不同而有所變化。例如,同一個提示可能在一種情況下傳回一個編號列表,而在另一種情況下傳回一個逗號分隔的列表。這種變化在大多數一次性使用的場景中可能不是大問題,但在將AI工具整合到生產軟體中時,輸出格式的變化可能會導致各種錯誤。
如何指定格式
文字生成模型:對於文字生成模型,輸出JSON格式通常是一個好的選擇,因為JSON是API回應的通用格式,便於解析和錯誤檢測。此外,JSON格式也便於用於渲染前端HTML。
[ { "Product description": "A home milkshake maker.", "Product names": ["HomeShaker", "Fit Shaker", "QuickShake", "Shake Maker"] }, { "Product description": "A watch that can tell accurate time in space.", "Product names": ["AstroTime", "SpaceGuard", "Orbit-Accurate", "EliptoTime"] } ]
當需要將輸出格式指定為JSON時,應確保提示中提供的範例也是JSON格式,並且保持JSON的不完整狀態,以引導模型完成它。
[ { "Product description": "A pair of shoes that can fit any foot size.", "Product names": ["FlexFit Footwear", "OneSize Step", "Adapt-a-Shoe", "Universal Walker"] } ]
這種方式可以確保輸出的JSON是完整的,並且可以透過JSON解析器(如Python的
json
函式庫)進行解析,從而檢測輸出是否正確。影像生成模型:對於影像生成模型,格式的指定同樣重要。影像的格式可以從常見的庫存照片、插圖到特殊的格式,如行車記錄儀影片或Minecraft中的影像。
business meeting of four people watching on MacBook on top of table, in Minecraft
此類別提示指定了所需的影像格式(在本例中為Minecraft風格的影像),從而生成符合特定格式的影像。
影像格式範例
此圖示展示瞭如何在Minecraft中呈現一個商務會議的場景。
graph LR; A[商務會議] --> B[Minecraft 環境]; B --> C[四人會議]; C --> D[觀看 MacBook];
圖表翻譯: 此圖表展示瞭如何在Minecraft環境中呈現一個四人商務會議的場景,會議參與者正在觀看一台放在桌子上的MacBook。
處理格式衝突
在某些情況下,指定的格式可能與提示的其他方面發生衝突。例如,如果提供了一張庫存照片作為基礎影像,則生成的影像可能會是庫存照片和指定格式的混合物。在這種情況下,可能需要移除或調整提示中的某些元素,以確保輸出的格式符合要求。
與給予指示的關係
指定格式和給予指示(即第一原則)之間存在一定的重疊。指定格式關注的是輸出的型別(如JSON或庫存照片格式),而給予指示則關注的是輸出的風格(如以Steve Jobs的風格命名產品或以梵谷風格繪製影像)。當格式和風格之間發生衝突時,通常需要根據最終結果的重要性來解決衝突。
提供範例的重要性
除了指定格式外,提供範例是提高AI模型輸出品質的另一個關鍵因素。範例可以幫助模型理解所需的輸出格式和風格,從而生成更準確、更符合預期的結果。
為何需要提供範例
提供範例可以顯著提高AI模型的表現,特別是在需要特定輸出格式或風格的任務中。研究表明,即使提供一個範例(稱為one-shot learning),也可以顯著提高模型的準確性。
如何提供範例
選擇多樣且具有代表性的範例:選擇能夠代表所需輸出格式和風格的範例。
[ { "Product description": "A home milkshake maker.", "Product names": ["HomeShaker", "Fit Shaker", "QuickShake", "Shake Maker"] }, { "Product description": "A watch that can tell accurate time in space.", "Product names": ["AstroTime", "SpaceGuard", "Orbit-Accurate", "EliptoTime"] } ]
在這個範例中,提供了兩個產品描述和對應的產品名稱列表,展示了所需的JSON格式。
確保範例的多樣性:範例應涵蓋不同的場景和情況,以幫助模型更好地理解所需的輸出。
# 不同格式的範例 - JSON格式 - 庫存照片 - Minecraft風格影像
程式碼範例與解析
import json # 定義產品描述和名稱 product_description = "A pair of shoes that can fit any foot size." product_names = ["FlexFit Footwear", "OneSize Step", "Adapt-a-Shoe", "Universal Walker"] # 組織成JSON格式 output_json = [ { "Product description": product_description, "Product names": product_names } ] # 輸出JSON print(json.dumps(output_json, indent=2))
內容解密:
- 匯入必要的函式庫:使用
import json
匯入Python的JSON處理函式庫。 - 定義變數:定義了
product_description
和product_names
兩個變數,分別代表產品描述和產品名稱列表。 - 組織JSON資料:將產品描述和名稱列表組織成一個字典,並放入列表中,形成所需的JSON結構。
- 輸出JSON:使用
json.dumps()
將Python物件轉換為JSON格式的字串,並透過indent=2
引數進行格式化輸出,使其更易讀。
- 匯入必要的函式庫:使用
隨著AI技術的不斷進步,未來將會有更多的方法來指定輸出格式和提供範例,從而進一步提高AI模型的表現和可用性。開發者應持續關注最新的研究和技術發展,以充分利用這些進步來改進自己的應用和服務。
參考資料
- W3Schools JSON介紹:https://www.w3schools.com/js/js_json_intro.asp
- GPT-3論文:“Language Models are Few-Shot Learners”
最終,透過結合明確的格式指定和具有代表性的範例,可以顯著提高AI模型的輸出品質,從而在各種應用場景中實作更高效、更可靠的自動化處理。
提升提示工程品質的四大關鍵技術
在前一章中,我們探討了提示工程的五大原則,其中「提供範例」是提升大語言模型(LLM)輸出品質的重要方法。然而,提供範例只是第一步,如何評估和最佳化提示工程的品質才是關鍵所在。本章將探討評估提示工程品質的方法,並介紹如何使用程式碼實作自動化評估。
1. 為什麼需要評估品質?
在實際應用中,我們往往需要重複使用相同的提示(prompt)來完成多項任務,或是將提示工程整合到生產環境中的應用程式中。在這種情況下,單純依靠「盲目提示」(blind prompting)已經無法滿足需求。所謂「盲目提示」,是指沒有反饋迴路來評估輸出結果的品質,只能透過反覆執行提示並觀察結果來進行調整。
為了提高提示工程的可靠性和穩定性,我們需要建立一套評估機制,來衡量輸出結果的品質。
2. 常見的評估方法
目前,評估大語言模型(LLM)的表現主要依賴於兩種方法:
標準化評測(Evals):這是一種學術界常用的評估方法,透過一套標準化的問題和預先定義的評分標準來測試模型的表現。不同的模型在不同型別的任務中表現各異,因此在更換模型時,原本運作良好的提示(prompt)可能需要重新調整。
特定任務評估:針對特定任務,如生成影像或撰寫科學論文,需要更為客製化的評估方法。例如,在影像生成任務中,可以透過比較生成影像與原始影像的相似度來評估品質。
3. 簡單的評估實作:使用 Thumbs-up/Thumbs-down 評估系統
對於大多數應用場景,我們不需要過於複雜的評估機制。一個簡單的「大拇指向上/大拇指向下」(thumbs-up/thumbs-down)評分系統,足以為提示最佳化提供基本的反饋。以下是一個簡單的實作範例,使用 Jupyter Notebook 來記錄每次執行的結果,並將其儲存在試算表中進行進一步分析。
程式碼範例:設定 OpenAI API 及簡單評估系統
import os
import openai
# 設定 OpenAI API 金鑰
os.environ["OPENAI_API_KEY"] = "your_api_key_here"
# 初始化 OpenAI 客戶端
openai.api_key = os.getenv("OPENAI_API_KEY")
def generate_response(prompt):
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=50
)
return response.choices[0].text.strip()
# 定義提示
prompt = "Brainstorm a list of product names for a shoe that fits any foot size."
# 執行多次並記錄結果
results = []
for _ in range(5):
response = generate_response(prompt)
results.append(response)
# 將結果儲存到試算表
import pandas as pd
df = pd.DataFrame(results, columns=["Product Names"])
df.to_csv("product_names_results.csv", index=False)
內容解密:
這段程式碼展示瞭如何使用 OpenAI API 生成產品名稱,並將結果儲存在 CSV 檔案中。首先,我們設定了 OpenAI API 金鑰並初始化客戶端。接著,定義了一個 generate_response
函式,用於根據給定的提示生成回應。我們執行了多次生成任務,並將結果儲存在 results
列表中。最後,使用 pandas
函式庫將結果儲存到 CSV 檔案中,以便後續分析。
4. 自動化評估與人工評估的平衡
雖然自動化評估可以提高效率,但某些任務仍然需要人工評估。例如,在創意寫作或影像生成任務中,人類的判斷對於評估輸出結果的品質至關重要。因此,在實際應用中,我們通常會結合自動化評估和人工評估來獲得最佳結果。
5. 未來發展方向
隨著大語言模型(LLM)的快速發展,評估技術也在不斷進步。未來,我們可以期待更為先進的評估框架出現,例如使用更強大的模型(如 GPT-4)來評估較弱模型的輸出結果,從而提高評估的準確性和效率。
提示工程評估流程圖
graph LR A[開始提示工程] --> B[生成輸出結果] B --> C[評估輸出品質] C -->|自動化評估|> D[使用標準化評測指標] C -->|人工評估|> E[人工審查輸出結果] D --> F[最佳化提示設計] E --> F F -->|重複迭代|> B
圖表翻譯:
此圖示展示了提示工程的評估流程。首先,我們開始提示工程並生成輸出結果。接著,評估輸出結果的品質,可以選擇自動化評估或人工評估。自動化評估使用標準化評測指標,而人工評估則由人工審查輸出結果。根據評估結果,我們最佳化提示設計並重複迭代,直到獲得滿意的輸出結果。
使用OpenAI API進行提示工程與品質評估的實作
在進行提示工程(Prompt Engineering)時,開發者需要對不同的提示(prompt)進行測試,以評估模型的回應品質。本文將介紹如何使用OpenAI API進行提示測試、回應評估,並將結果儲存於CSV檔案中。
設定OpenAI API金鑰
首先,您需要設定OpenAI API金鑰。有多種方法可以實作這一點:
- 環境變數:將API金鑰設為環境變數。
- 手動設定:在初始化模型時手動設定金鑰。
- 使用
.env
檔案:利用python-dotenv
套件從.env
檔案載入環境變數。
使用python-dotenv
載入環境變數
from dotenv import load_dotenv
load_dotenv() # 從.env檔案載入環境變數
設定OpenAI客戶端
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY'], # 預設使用環境變數中的金鑰
)
定義提示與取得模型回應
定義測試提示
prompt_A = """產品描述:一雙可以適應任何腳尺的鞋子。
關鍵字:可適應、合適、全能合適。
產品名稱:"""
prompt_B = """產品描述:家用奶昔製造機。
關鍵字:快速、健康、緊湊。
產品名稱:HomeShaker、Fit Shaker、QuickShake、Shake Maker
產品描述:可以在太空中準確顯示時間的手錶。
關鍵字:太空人、太空強化、橢圓軌道
產品名稱:AstroTime、SpaceGuard、Orbit-Accurate、EliptoTime。
產品描述:一雙可以適應任何腳尺的鞋子。
關鍵字:可適應、合適、全能合適。
產品名稱:"""
test_prompts = [prompt_A, prompt_B]
取得模型回應的函式
def get_response(prompt):
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一個有幫助的助手。"},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
執行測試並儲存結果
執行多輪測試並儲存回應
responses = []
num_tests = 5
for idx, prompt in enumerate(test_prompts):
var_name = chr(ord('A') + idx) # 將索引轉換為字母
for i in range(num_tests):
response = get_response(prompt)
data = {
"variant": var_name,
"prompt": prompt,
"response": response
}
responses.append(data)
df = pd.DataFrame(responses)
df.to_csv("responses.csv", index=False)
print(df)
輸出結果分析
從輸出結果可以觀察到,prompt_A
(零樣本學習)傾向於輸出編號列表,而prompt_B
(少樣本學習)則傾向於輸出逗號分隔的名單。
評估回應品質
載入回應資料並隨機排序
import pandas as pd
import ipywidgets as widgets
from IPython.display import display
df = pd.read_csv("responses.csv")
df = df.sample(frac=1).reset_index(drop=True) # 隨機排序
df['feedback'] = pd.Series(dtype='str') # 新增反饋欄位
定義按鈕回饋函式
response_index = 0
def on_button_clicked(b):
global response_index
user_feedback = 1 if b.description == "\U0001F44D" else 0 # 將按鈕反饋轉換為1或0
df.at[response_index, 'feedback'] = user_feedback
response_index += 1
if response_index < len(df):
update_response()
else:
df.to_csv("results.csv", index=False)
print("A/B測試完成。結果如下:")
summary_df = df.groupby('variant').agg(
count=('feedback', 'count'),
score=('feedback', 'mean')).reset_index()
# 顯示摘要結果
顯示互動介面
# 建立按鈕並顯示
button_thumbs_up = widgets.Button(description="\U0001F44D")
button_thumbs_down = widgets.Button(description="\U0001F44E")
button_thumbs_up.on_click(on_button_clicked)
button_thumbs_down.on_click(on_button_clicked)
display(button_thumbs_up)
display(button_thumbs_down)
未來改進方向
- 擴充套件測試範圍:增加更多提示變體和測試輪數,以獲得更全面的評估結果。
- 最佳化回饋機制:改進使用者反饋介面,使其更直觀易用。
- 深入分析結果:對收集到的回饋資料進行更深入的分析,以找出不同提示之間的顯著差異。
透過持續最佳化和改進,您可以進一步提升提示工程的有效性,從而更好地利用大語言模型的能力。
內容解密:
本段程式碼展示瞭如何使用OpenAI API進行提示工程測試。首先,我們定義了兩個不同的提示(prompt_A
和prompt_B
),並使用get_response
函式取得模型的回應。接著,我們將多輪測試的結果儲存於DataFrame中,並匯出為CSV檔案。最後,我們載入回應資料,隨機排序後進行使用者反饋評估,並將結果儲存於新的CSV檔案中。
這個過程展示瞭如何系統性地評估不同提示對模型回應品質的影響,並為進一步的提示最佳化提供了基礎。
圖表說明
graph LR A[開始] --> B[定義提示] B --> C[取得模型回應] C --> D[儲存回應結果] D --> E[載入回應資料] E --> F[隨機排序] F --> G[使用者反饋評估] G --> H[儲存評估結果]
圖表翻譯: 此圖表展示了使用OpenAI API進行提示工程測試的流程。首先,定義測試用的提示(Prompt)。接著,透過API取得模型的回應(Response)。將多輪測試的結果儲存後,載入回應資料並進行隨機排序,以便進行盲測評估。最後,使用者對模型的回應進行反饋評估,並將結果儲存於新的檔案中。這個流程有助於系統性地評估不同提示對模型回應品質的影響。