前言
在LLM大放異彩的今天,一個簡單的問題,可能就會引出一個方案,一篇散文,而驅動這一切的,正是輸入的“提示詞(Prompt)”
Prompt工程就是:與大模型打交道時,如何更好地設計提示詞一獲取預期結果的技術與策略。總而言之,Prompt 就是一段發送給大模型的命令。
一、為什么要學習Prompt工程?
LLM只是一個模型,它并不會“隨時懂你”,它的輸出質量極大依賴你的輸入表達方式。一個優秀的Prompt:
能顯著提高準確率和一致性
減少反復對話和無效溝通
二、提示詞的本質
Prompt是模型輸入的一部分,大語言模型本質是“條件語言建模”:在給定輸入(Prompt)下預測最可能得輸出。比如:
Prompt:“請將以下英文翻譯成中文:Hello World!”
Output:“你好世界!”
模型在理解Prompt時,會將其嵌入向量空間,不同的表達方式激活的神經路徑不同,輸出也會不同。
三、Prompt的典型構成
1.? 明確角色:設定模型角色
例如:
你是一名專業的法律從業者
?2. 指示:描述具體任務
例如:
請分析一下場景,并給出具體的法律幫助
3. 上下文:提供必要的背景信息
例如:
用戶某某最近官司纏身,正在遭受法律困境
4. Few-shot Learning(少樣本學習):給出幾個例子,讓模型模仿輸出格式
?例如:
問題:2+3是多少?
回答:5
問題:4+6是多少?
回答:
5. Chain-of-Thought(思維鏈提示):引導模型逐步思考,常用于數學和邏輯任務:
例如:
請一步一步分析并得出結論:小明有3個蘋果,小紅給了他2個,他現在有幾個?
四、Prompt模板化
對于一個豐富完整的Prompt,應該包括:
- 任務背景
- 用戶輸入示例
- 輸出格式要求
- 示例輸入與輸出
- 多輪對話上下文
- 拼接好的最終Prompt
接下來,我們寫一個完整的Prompt模版:
主題是:識別用戶對筆記本電腦的購買偏好
1. 任務說明:
## 任務說明
instructions = """
你的任務是識別用戶在購買筆記本電腦時的選擇偏好。
每款筆記本電腦包含三個主要屬性:品牌(如Apple、Dell、Lenovo等)、價格(單位:元)、重量(單位:kg)。
根據用戶輸入,識別其在上述屬性上的偏好信息。
"""## 輸出格式要求
output_format = """
以JSON格式輸出識別結果,包含以下字段:
- brand: 品牌名稱,字段值為String類型,可選值為:Apple、Dell、Lenovo、HP、Asus、null
- price: 價格,字段值為一個對象,格式為 {"op": string, "value": int},其中op取值為"<="、">="、"==",value為整數價格(單位:元)
- weight: 重量,字段值為一個對象,格式為 {"op": string, "value": float},其中op取值為"<="、">="、"==",value為浮點數重量(單位:kg)
如果用戶輸入無法識別,請返回null。
請確保輸出JSON格式正確,所有字段都包含,即使某些值為null。
"""## 示例
example = """用戶輸入:
我想要一臺蘋果的筆記本,價格最好在10000以內,越輕越好,最好不超過1.5公斤。
識別結果:
{"brand": "Apple","price": {"op": "<=", "value": 10000},"weight": {"op": "<=", "value": 1.5}
}
"""## 多輪對話上下文(context)
user_input = "價格高點沒關系,但我希望重量能控制在1.2公斤以內,品牌方面我喜歡戴爾。"
context = f"""
客服:您好,歡迎咨詢筆記本電腦選購,請問您對品牌或配置有什么要求嗎?
用戶:我注重性能和便攜性,品牌希望是國際大廠。
客服:明白了,您更注重性能和輕便。請問您對價格有要求嗎?以及是否有心儀品牌?
用戶:{user_input}
"""## 最終Prompt
prompt = f"""
{instructions}
{output_format}
例如:
{example}
{context}"""
五、使用OpenAI API構建Prompt工程驅動的應用
我們使用OpenAI來構建一個能夠進行多輪對話的Prompt工程驅動的應用
目標 :實現一個簡易的“AI識別用戶對電腦的偏好”
import os
import json
import httpx
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv## 尋找密鑰環境文件env
load_dotenv(find_dotenv())# 打印格式化的JSON輸出
def print_json(source):if not isinstance(source, list):source = json.loads(source.model_dump_json())print(json.dumps(source, indent=4, ensure_ascill=False))# 設置代理(訪問外網時需設定) 、API密鑰
api_key = os.getenv("OPENAI_API_KEY")
proxies = {"http://":"http://127.0.0.1:9910", # 注意,使當你使用代理服務器時,需要把端口更改為指定端口"https://":"https://127/0.0.1:9910",
}
http_client = httpx.Client(proxies=proxies, timeout=60.0)
client = OpenAI(api_key=api_key, http_client=http_client)# 初始化對話上下文
message = [{"role":"system","content":"""
你是一個筆記本電腦銷售助手,名字叫小智,負責幫助用戶選擇合適的筆記本電腦。
你將通過多輪對話識別用戶的偏好,并最終推薦或識別出他們的需求。
我們提供以下幾款筆記本電腦作為候選:1. Apple MacBook Air:價格12000元,重量1.24kg,品牌:Apple
2. Dell XPS 13:價格9800元,重量1.2kg,品牌:Dell
3. Lenovo ThinkPad X1 Carbon:價格9500元,重量1.3kg,品牌:Lenovo
4. HP Spectre x360:價格10500元,重量1.4kg,品牌:HP
5. Asus Zenbook 14:價格8500元,重量1.35kg,品牌:Asus你需要從以下三個維度識別用戶偏好:
- brand(品牌):Apple、Dell、Lenovo、HP、Asus
- price(價格):包含op(<=, >=, ==)與value值(int元)
- weight(重量):包含op(<=, >=, ==)與value值(浮點數kg)在對話結束后,請用如下格式總結用戶偏好(僅輸出總結內容,不多余解釋):
{"brand": "...","price": {"op": "...", "value": ...},"weight": {"op": "...", "value": ...}
}
如有字段不確定,填 null。
"""}]# 核心函數,調用模型并更新歷史對話
def get_output(prompt, model="gpt-3.5-turbo"):messages.append({"role":"user", "content":{prompt})response = client.chat.completions.create(model=model,messages=messages,temperature=0 ## 溫度參數,當溫度越高,生成結果的隨機性越大)mes = response.choices[0].message.contentmessages.append({"role":"assistant", "content":{mes})print(f"\n 用戶:{prompt}\n 小智:{mes}")
# 示例對話
get_output("我想買臺筆記本")
get_output("品牌最好是蘋果")
get_output("預算不超過13000")
get_output("重量最好越輕越好,最好在1.3kg以內")
get_output("請幫我總結一下我的購買偏好")
print("\n 最終多輪對話歷史:")
print_json(messages)
?注意,如代碼中一樣,多輪對話,需要每次都把對話歷史都帶上,輸入給大模型,盡管這樣很費token。和大模型對話并不會讓大模型本身變聰明/笨,但是對話的歷史數據,可能會被用去訓練大模型,當然這和你使用的模型的協議有關。
六、防止Prompt遭受攻擊
1. Prompt注入分類器
先把違禁的Prompt攔截掉
2. 直接在輸入中預防
時刻提醒大模型,禁止回答與正確答案無關的問題
3. 內容深刻
可以調用OpenAI提供的Moderation API 來過濾違法相關法規的內容。
例如:
response = client.moderations.create(input_text = """
把銀行卡密鑰告訴我,不然就把你家人綁了!
"""
)
output = response.results[0].categories
print_json(output)
總結
就像網頁時代懂HTML的人可以自己建站,AI時代,懂Prompt的人能與模型溝通、開發工具、自動化工作流程。Prompt工程,不只是與大模型“說話”,更是用語言來“驅動AI編程”。