LLM 提示工程最佳實踐:寫出真正有效的 Prompt
LLM 提示工程最佳實踐:寫出真正有效的 Prompt
在使用大型語言模型(LLM)開發應用程式的過程中,Prompt 的品質往往決定了輸出結果的好壞。一個精心設計的 Prompt 可以讓模型的表現大幅提升,而一個粗糙的 Prompt 則可能讓你得到毫無用處的回答。這篇文章整理了實際開發中最常用的提示工程技巧。
為什麼提示工程很重要?
LLM 通過預測下一個 Token 來工作,對輸入的措辭方式非常敏感。同樣的問題,用不同方式表達,可能得到截然不同的結果。提示工程就是利用這種特性,引導模型產生我們想要的輸出。
核心原則一:明確性優先
模糊的指令會導致模糊的輸出。
不好的 Prompt:
幫我寫一篇文章好的 Prompt:
請用繁體中文寫一篇針對初學者的 Docker 入門文章,
長度約 800 字,包含以下內容:
1. Docker 是什麼
2. 為什麼要使用 Docker(對比傳統部署方式)
3. 安裝 Docker 的步驟
4. 一個實際的 Hello World 範例
使用 Markdown 格式,加入適當的程式碼區塊。核心原則二:角色扮演(Role Prompting)
給模型一個明確的角色,可以大幅改善輸出品質:
system_prompt = """
你是一位擁有 10 年經驗的 TypeScript 高級工程師,
專精於 Node.js 後端開發和系統架構設計。
回答風格:
- 直接指出問題所在
- 提供可執行的程式碼範例
- 說明為什麼這樣做比其他方式更好
- 如果有安全隱患,一定要明確指出
"""核心原則三:少樣本學習(Few-Shot Prompting)
提供幾個範例讓模型理解你期望的輸出格式:
請將英文錯誤訊息翻譯成對開發者友善的繁體中文說明。
範例:
輸入:TypeError: Cannot read property 'name' of undefined
輸出:【類型錯誤】嘗試讀取一個 undefined 物件的 'name' 屬性。
常見原因:物件未正確初始化,或非同步操作尚未完成就嘗試存取資料。
輸入:ECONNREFUSED 127.0.0.1:5432
輸出:【連線拒絕】無法連線到本機 5432 埠(通常是 PostgreSQL)。
常見原因:資料庫服務未啟動,或連線設定有誤。
請翻譯:
輸入:SyntaxError: Unexpected token < in JSON at position 0核心原則四:思維鏈(Chain-of-Thought)
對於複雜的推理任務,引導模型一步一步思考:
請分析這段程式碼是否存在 SQL Injection 風險。
請按以下步驟分析:
1. 找出所有用到使用者輸入的地方
2. 確認這些輸入是否有被適當處理
3. 如果有風險,說明攻擊者如何利用它
4. 提供修復方案
程式碼:
```python
def get_user(username):
query = f"SELECT * FROM users WHERE username = '{username}'"
return db.execute(query)
## 結構化輸出技巧
開發應用時通常需要 JSON 格式的結構化輸出:
```python
prompt = """
分析以下產品評論,以 JSON 格式輸出(只輸出 JSON,不要有其他文字):
評論:「這款耳機音質很棒,但電池續航只有 4 小時,戴久了耳朵會痛,客服回應很快。」
{
"sentiment": "positive|negative|mixed",
"score": 1-5,
"pros": ["優點1", "優點2"],
"cons": ["缺點1", "缺點2"],
"aspects": {
"sound_quality": "positive|negative|neutral",
"battery_life": "positive|negative|neutral",
"comfort": "positive|negative|neutral",
"customer_service": "positive|negative|neutral"
}
}
"""避免常見陷阱
陷阱一:負面指示效果差
❌ 不要用技術術語解釋
✅ 請用一個 10 歲小孩能理解的方式解釋陷阱二:過於籠統的角色
❌ 你是一個助手
✅ 你是一位專注於效能優化的 React 開發者,關注 bundle size、渲染效能和使用者體驗陷阱三:忽略輸出格式
總是明確指定你想要的輸出格式、長度和語言。
進階技巧:多步驟分解
對於複雜任務,拆成多個 Prompt 比一個大 Prompt 更可靠:
# 步驟一:分析需求
step1 = llm.complete("分析以下需求,列出功能點:" + requirements)
# 步驟二:設計架構
step2 = llm.complete(f"根據以下功能點設計資料庫結構:{step1}")
# 步驟三:生成程式碼
step3 = llm.complete(f"根據以下資料庫結構生成 TypeScript 型別定義:{step2}")Temperature 設定
# 需要確定性輸出(JSON、程式碼)
response = client.complete(prompt, temperature=0.0)
# 需要創意輸出(文案、故事)
response = client.complete(prompt, temperature=0.8)
# 一般對話
response = client.complete(prompt, temperature=0.3)實際應用:程式碼審查機器人
def code_review_prompt(code: str, language: str) -> str:
return f"""
你是一位嚴格但公正的資深工程師,正在進行 Code Review。
請審查以下 {language} 程式碼,按重要性排序指出問題:
審查重點(按優先級):
1. 安全性問題(SQL Injection、XSS、未授權存取)
2. 潛在的 Bug(邊界條件、空值處理、並發問題)
3. 效能問題(不必要的迴圈、N+1 查詢)
4. 程式碼品質(命名、可讀性、DRY 原則)
程式碼:
```{language}
{code}對每個問題,請說明:
- 嚴重程度:🔴 嚴重 / 🟡 中等 / 🟢 建議
- 問題位置(行號)
- 問題說明
- 修復方案(附程式碼) """
## 總結
提示工程是一門需要實踐的技藝。核心原則是:清晰、具體、有結構。給模型明確的角色、清晰的任務描述、期望的輸出格式,並通過迭代不斷優化。隨著積累的經驗越來越多,你會逐漸培養出對模型行為的直覺,寫出越來越精準的 Prompt。分享這篇文章