是一門設計和優化輸入指令(稱為「提示」或「Prompt」)的藝術與科學,引導大型語言模型 (LLM) 產生更準確、相關且符合預期的輸出。由於LLM行為高度依賴於輸入,一個精心設計的提示能夠極大地影響模型的性能和輸出的品質
為什麼提示工程很重要?
提升輸出品質
:好的提示能讓LLM更好地理解意圖,從而生成更高品質、更符合需求內容減少「幻覺」與錯誤
:精確提示可以限制模型生成不準確或無關資訊可能性提高效率
:透過優化提示,可以減少重複嘗試和修正的時間,更快地達到理想結果應對模型局限性
:即使是相同LLM,透過不同的提示也能展現出截然不同的能力。提示工程可以幫助充分發揮模型的潛力實現特定任務
:許多複雜的任務,例如:摘要、翻譯、程式碼生成等等,都需要特定提示結構才能有效完成提示工程核心原則與技巧
明確指示
:清楚說明希望模型做什麼。避免模糊或開放式問題提供範例(Few-shot Learning)
:提供少量的輸入-輸出範例,讓模型學習期望格式和風格,這比單純的文字描述更有效限定範圍
:告訴模型在特定上下文中思考,或只使用提供的資訊賦予模型一個角色(例如:「你是一位經驗豐富的市場行銷專家」、「你是一位Python程式設計師」),這能讓模型以該角色的視角和知識來回應
指定輸出格式
:要求模型以 JSON、列表、段落、Markdown 等特定格式輸出使用分隔符號
:使用 ```、### 或長度限制
:指定輸出文本的字數、行數或段落數風格要求
:要求模型以特定風格(例如:正式、幽默、簡潔)進行回應禁止事項
:明確說明模型不應做什麼要求模型在給出最終答案之前,先一步步地思考問題或解釋其推理過程。這對複雜的推理任務特別有效,例如:「一步一步地思考這個問題。」
提示工程是一個迭代的過程。從一個基礎提示開始,測試其輸出,然後根據結果進行調整和改進,分析模型失敗的原因,並針對性地修改提示
內容生成
:撰寫部落格文章、行銷文案、詩歌、劇本問答系統
:提高問答的準確性和相關性程式碼生成與除錯
:讓模型生成特定功能的程式碼或找出錯誤文本摘要與翻譯
:控制摘要的長度、提取特定資訊或指定翻譯風格數據提取與結構化
:將非結構化文本轉換為 JSON 或 CSV 等結構化數據創意寫作
:激發靈感,生成故事情節或角色描述使用不同提示策略影響 LLM 輸出
以下程式碼範例使用 Hugging Face transformers 庫和一個小型 LLM (如 gpt2),展示了不同的提示策略如何影響模型的輸出
首先,已安裝pip install transformers torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 1. 載入預訓練模型和分詞器
model_name = "gpt2" # 選擇一個小型且容易載入的模型
try:
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 設定 tokenizer 的 padding token,避免警告 (GPT-2 預設沒有 pad_token)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
print(f"成功載入模型:{model_name}")
except Exception as e:
print(f"載入模型時發生錯誤:{e}")
print("請檢查您的網路連接或嘗試其他模型名稱。")
exit()
def generate_text_from_prompt(prompt, max_length=150, temperature=0.7, top_p=0.95):
"""
通用文本生成函數,包含一些常用的生成參數。
"""
input_ids = tokenizer.encode(prompt, return_tensors='pt')
# 設置 attention_mask,確保正確處理 batching (如果未來會用到)
attention_mask = torch.ones(input_ids.shape, device=input_ids.device)
generated_output = model.generate(
input_ids,
attention_mask=attention_mask,
max_length=max_length,
num_beams=5, # 使用 beam search 提高生成質量
no_repeat_ngram_size=2, # 避免重複 N-gram
early_stopping=True, # 如果生成了 EOS token,則提前停止
do_sample=True, # 啟用採樣
temperature=temperature, # 控制隨機性
top_p=top_p, # 累積機率採樣
top_k=50 # 考慮機率最高的 50 個詞
)
return tokenizer.decode(generated_output[0], skip_special_tokens=True)
print("--- 提示工程範例:不同策略的影響 ---")
# 範例 1: 簡單開放式提示
print("\n=== 範例 1: 簡單開放式提示 ===")
prompt_1 = "請寫一篇關於人工智能的短文。"
output_1 = generate_text_from_prompt(prompt_1, max_length=150)
print(f"提示詞:\n{prompt_1}\n\n生成結果:\n{output_1}")
# 範例 2: 增加角色扮演和風格要求
print("\n=== 範例 2: 增加角色扮演和風格要求 ===")
prompt_2 = """你是一位專業的科幻作家。請以引人入勝且帶有未來感的筆觸,寫一篇關於人工智能未來發展的短文,字數不超過100字。
短文開頭必須是:「在遙遠的未來,人工智能...」
"""
output_2 = generate_text_from_prompt(prompt_2, max_length=150) # 設置max_length略大於字數要求,給模型留足空間
print(f"提示詞:\n{prompt_2}\n\n生成結果:\n{output_2}")
# 範例 3: 任務導向與格式要求
print("\n=== 範例 3: 任務導向與格式要求 ===")
prompt_3 = """請從以下文章中提取關鍵詞,並以逗號分隔的列表形式輸出。
文章:
大型語言模型(LLM)正在徹底改變許多行業。從自動化客戶服務到內容創作,它們的應用前景廣闊。然而,挑戰依然存在,包括資源消耗、幻覺問題和道德考量。研究人員正努力提高模型的效率和可靠性。
"""
output_3 = generate_text_from_prompt(prompt_3, max_length=50) # 期望輸出較短
print(f"提示詞:\n{prompt_3}\n\n生成結果:\n{output_3}")
# 範例 4: 思維鏈 (Chain of Thought)
print("\n=== 範例 4: 思維鏈 (Chain of Thought) ===")
prompt_4 = """請問 15 乘以 7 等於多少?
請一步一步地思考這個問題,並在最後給出答案。
"""
# 對於簡單數學,LLM 可能直接給出答案,但對於複雜邏輯,CoT 能顯著提高準確性。
output_4 = generate_text_from_prompt(prompt_4, max_length=80)
print(f"提示詞:\n{prompt_4}\n\n生成結果:\n{output_4}")
# 範例 5: Few-shot Learning (提供範例)
print("\n=== 範例 5: Few-shot Learning (提供範例) ===")
prompt_5 = """將以下句子改寫為更專業的語氣。
輸入:我很喜歡這個產品。
輸出:我對這項產品深感滿意。
輸入:我覺得這個報告寫得不好。
輸出:這份報告的撰寫尚有改進空間。
輸入:這個軟體很好用。
輸出:
"""
output_5 = generate_text_from_prompt(prompt_5, max_length=50)
print(f"提示詞:\n{prompt_5}\n\n生成結果:\n{output_5}")
透過這些範例,可以看到不同提示策略如何引導LLM產生多樣化的、更符合期望的輸出。提示工程是一個不斷學習和實踐的領域,熟練掌握它將幫助充分釋放LLM強大潛力。