本節課你將學到
- 理解提示詞工程的核心原理
- 掌握5種實用的Prompt設計模式
- 學會優化提示詞的評估方法
- 實現一個智能問答系統優化案例
開始之前
環境要求
- Python 3.8+
- 安裝包:
pip install openai tiktoken
- OpenAI API密鑰(免費注冊:https://platform.openai.com)
前置知識
- GPT模型基礎(第36講內容)
- 基本的API調用概念
核心概念
什么是提示詞工程?
提示詞工程就像與AI溝通的"魔法語言":
- 傳統編程:寫精確的代碼指令
- Prompt工程:用自然語言"引導"AI產生預期輸出
Prompt設計的三層結構
1. **角色設定**(30%效果)"你是一位資深機器學習工程師"2. **任務描述**(50%效果)"用通俗易懂的方式解釋Transformer架構"3. **輸出規范**(20%效果)"分三點說明,每點不超過2句話,使用類比手法"
五大核心技巧(附案例對比)
技巧1:角色設定
# ? 普通提示
"解釋機器學習"# ? 角色設定提示
"""你是一位有10年經驗的AI教授,正在給大一新生上課。
用最通俗易懂的方式解釋機器學習,要求:
1. 使用生活類比
2. 不超過3句話
3. 最后提一個思考問題"""
技巧2:分步思考
# ? 直接提問
"巴黎是浪漫之都嗎?"# ? 分步推理
"""請按以下步驟分析:
1. 定義'浪漫之都'的標準
2. 列舉巴黎符合標準的證據
3. 給出最終結論"""
技巧3:示例示范
# ? 單純指令
"生成產品描述"# ? 示例引導
"""按以下格式生成耳機產品描述:
示例1:[產品] 采用[技術],帶來[ benefit ]
示例2:...
現在為'無線降噪耳機'生成3個版本"""
技巧4:負面約束
# ? 開放生成
"寫一篇科技文章"# ? 負面約束
"""寫一篇關于AI的科普文章,要求:
- 不要使用專業術語
- 不超過300字
- 避免討論倫理問題"""
技巧5:格式控制
# ? 自由輸出
"總結這篇文章"# ? 格式限定
"""用以下結構總結:
【核心觀點】...
【關鍵數據】3條
【行動建議】..."""
代碼實戰
1. 基礎API調用
import openai
import tiktoken# 配置API密鑰
openai.api_key = "你的API密鑰"def count_tokens(text):"""計算文本的token數量"""encoder = tiktoken.get_encoding("cl100k_base")return len(encoder.encode(text))def ask_gpt(prompt, model="gpt-3.5-turbo"):"""發送Prompt到OpenAI API"""response = openai.ChatCompletion.create(model=model,messages=[{"role": "user", "content": prompt}],temperature=0.7,max_tokens=500)return response.choices[0].message.content# 測試調用
prompt = "用一句話解釋量子計算"
print(ask_gpt(prompt))
2. Prompt優化評估器
def evaluate_prompt(prompt, test_cases):"""評估Prompt效果的量化工具返回平均得分(1-5分)和改進建議"""total_score = 0feedback = []for case in test_cases:response = ask_gpt(prompt + "\n" + case["question"])score = min(5, case["expected"].lower().count(response.lower()))total_score += scorefeedback.append(f"Q: {case['question']}\nA: {response}\nScore: {score}/5")avg_score = total_score / len(test_cases)analysis = f"""評估結果:
平均分:{avg_score:.2f}/5
建議改進方向:
1. {'增加角色設定' if avg_score <3 else '?'}
2. {'添加示例' if '示例' not in prompt else '?'}
3. {'明確輸出格式' if '格式' not in prompt else '?'}"""return avg_score, analysis, "\n\n".join(feedback)# 測試案例
test_cases = [{"question": "解釋神經網絡", "expected": "神經網絡就像人腦神經元網絡..."},{"question": "Python的lambda是什么","expected": "lambda是匿名函數..."}
]# 評估示例Prompt
sample_prompt = "請回答以下技術問題"
score, analysis, details = evaluate_prompt(sample_prompt, test_cases)
print(f"評估報告:\n{analysis}\n\n詳細反饋:\n{details}")
3. 智能問答系統優化
class QASystem:def __init__(self, knowledge_base):self.knowledge = knowledge_baseself.prompt_template = """基于以下知識庫回答問題:
{knowledge}
---
問題:{question}
要求:
1. 如果答案在知識庫中,直接引用
2. 否則標注"推測答案"
3. 用中文回答
4. 不超過100字"""def answer(self, question):prompt = self.prompt_template.format(knowledge=self.knowledge,question=question)return ask_gpt(prompt)# 初始化知識庫
ai_knowledge = """
1. 機器學習分為監督學習、無監督學習、強化學習
2. GPT-3有1750億參數
3. 過擬合是指模型在訓練集表現太好但泛化能力差
"""qa = QASystem(ai_knowledge)# 測試問答
questions = ["什么是過擬合?","GPT-4有多少參數?" # 知識庫中沒有的問題
]for q in questions:print(f"Q: {q}\nA: {qa.answer(q)}\n")
完整項目
項目結構
lesson_37_prompt/
├── prompt_engineer.py # 主程序
├── evaluator.py # 評估工具
├── qa_system.py # 問答系統
├── requirements.txt
└── README.md
requirements.txt
openai==0.27.8
tiktoken==0.4.0
python-dotenv==1.0.0 # 用于管理API密鑰
prompt_engineer.py 完整代碼
import openai
import tiktoken
from dotenv import load_dotenv
import osload_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")class PromptOptimizer:def __init__(self):self.encoder = tiktoken.get_encoding("cl100k_base")def analyze_prompt(self, prompt):"""深度分析Prompt問題"""analysis_prompt = f"""請分析以下Prompt的問題:
{prompt}
---
按以下格式反饋:
1. 清晰度評分(1-5分):
2. 主要問題:
3. 改進建議:"""return openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "user", "content": analysis_prompt}],temperature=0).choices[0].message.contentdef optimize_prompt(self, prompt, iterations=3):"""迭代優化Prompt"""current_prompt = promptfor i in range(iterations):print(f"\n優化迭代 {i+1}/{iterations}")analysis = self.analyze_prompt(current_prompt)print(f"分析結果:\n{analysis}")optimization_prompt = f"""根據以下分析優化Prompt:
分析:
{analysis}
原Prompt:
{current_prompt}
---
請輸出:
1. 優化后的Prompt
2. 優化說明"""result = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "user", "content": optimization_prompt}],temperature=0.7).choices[0].message.contentcurrent_prompt = result.split("\n")[1] # 提取優化后的Promptprint(f"優化版本:\n{current_prompt}")return current_promptif __name__ == "__main__":optimizer = PromptOptimizer()sample_prompt = "幫我寫一篇關于AI的文章"print("原始Prompt:", sample_prompt)optimized = optimizer.optimize_prompt(sample_prompt)print("\n最終優化結果:")print(optimized)
運行效果
優化過程示例
原始Prompt: 幫我寫一篇關于AI的文章優化迭代 1/3
分析結果:
1. 清晰度評分(1-5分):2分
2. 主要問題:主題過于寬泛,缺乏具體方向和要求
3. 改進建議:明確文章類型、目標讀者、長度和核心要點優化版本:
請寫一篇面向科技愛好者的800字科普文章,介紹AI在醫療領域的三大應用,要求:
1. 每部分配示意圖描述
2. 包含實際案例
3. 使用通俗語言
問答系統輸出
Q: 什么是過擬合?
A: 過擬合是指模型在訓練集表現太好但泛化能力差的現象。Q: GPT-4有多少參數?
A: (推測答案)GPT-4的具體參數規模未公開,但預計比GPT-3的1750億更多。
常見問題
Q1: 如何減少API調用費用?
- 使用
max_tokens
限制響應長度 - 對相似問題做本地緩存
- 先用小模型(gpt-3.5-turbo)測試Prompt
Q2: 為什么有時響應不符合要求?
- 檢查temperature值是否過高(建議0.3-0.7)
- 確認Prompt中是否有明確的約束條件
- 嘗試用更高級模型(gpt-4)
Q3: 如何處理超長上下文?
- 用
tiktoken
計算token數 - 關鍵信息放在Prompt開頭
- 對長文檔采用"分塊處理+摘要"策略
課后練習
- 為你的專業領域設計3個角色Prompt模板
- 用評估器測試"解釋區塊鏈"的5種不同Prompt
- 擴展問答系統:添加追問功能
擴展閱讀
- OpenAI官方Prompt指南
- Prompt Engineering課程
- AI提示詞大全