deepseek-prompt-engineering-foolproof-output-formats
在 DeepSeek API 應用開發中,確保模型輸出的格式始終如一,是實現自動化流程和穩定用戶體驗的關鍵。許多開發者都曾面臨 AI 模型輸出「穿幫」——即輸出結果未能嚴格遵循預設格式——的挑戰。本文將深入探討如何運用提示詞工程技術,結合 DeepSeek 模型特性,打造百分之百不穿幫的輸出格式。
DeepSeek 模型在理解自然語言指令方面表現出色,但當涉及精確的、機器可讀的輸出格式時,僅僅使用模糊的指令往往不夠。模型會優先考慮內容生成,而非格式的嚴格遵守。要解決這個問題,我們必須在提示詞中為 DeepSeek 設置清晰的「護欄」和「藍圖」。這意味著不僅要告訴它「做甚麼」,更要明確指導它「如何做」以及「以甚麼形式做」。
一個常見的誤區是認為只需一句「請以 JSON 格式輸出」便足以。實際上,如果沒有明確定義 JSON 結構,模型可能會生成不符合預期的鍵值對或數據類型。
要確保 DeepSeek 輸出格式的穩定性,可以從以下基礎技巧開始:
在提示詞中指定清晰的開頭與結尾標記,能幫助模型區分有效輸出內容與冗餘說明。
示例:
請提取以下文本中的產品名稱和價格。
---OUTPUT_START---
產品名稱:
價格:
---OUTPUT_END---
文本:最新款智能手機,性能卓越,現正以港幣 7999 元發售。
對於簡單的列表或配對信息,使用特定的關鍵詞和分隔符可以有效引導模型。
示例:
請列出以下文章中提到的所有國家和其首都,格式為「國家:首都」並以逗號分隔。
文章:法國的首都是巴黎,而德國的首都是柏林。日本東京是科技中心,但其國家是日本。
期望輸出:法國:巴黎,德國:柏林,日本:東京
雖然我們主要討論文字提示詞,但思考格式時,在腦海中對其進行視覺化,有助於更清晰地描述。例如,如果需要表格輸出,可以在提示詞中簡要描述表格結構。
當輸出格式變得複雜,例如需要嵌套結構、特定數據類型或嚴格的字元模式時,基礎方法便顯得力不從心。此時,引入 JSON Schema 和正規表達式(Regex)是更可靠的選擇。
JSON Schema 是一種強大的工具,用於描述 JSON 數據的結構。雖然 DeepSeek 並不直接「執行」JSON Schema,但我們可以將其作為一個「藍圖」嵌入到提示詞中,告知模型輸出的精確結構要求。
步驟:
system 或 user 提示詞中清晰地呈現這個 Schema。示例:產品信息提取
假設我們需要提取產品名稱、價格、庫存狀態及相關標籤。
{
"type": "object",
"properties": {
"product_name": {
"type": "string",
"description": "產品的完整名稱"
},
"price_hkd": {
"type": "number",
"description": "產品以港幣計價的價格"
},
"in_stock": {
"type": "boolean",
"description": "產品是否有庫存"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "與產品相關的關鍵標籤"
}
},
"required": ["product_name", "price_hkd", "in_stock", "tags"]
}
DeepSeek API 提示詞示例:
import deepseek
# 設定你的 DeepSeek API Key
deepseek.api_key = "YOUR_DEEPSEEK_API_KEY"
schema = """
{
"type": "object",
"properties": {
"product_name": {
"type": "string",
"description": "產品的完整名稱"
},
"price_hkd": {
"type": "number",
"description": "產品以港幣計價的價格"
},
"in_stock": {
"type": "boolean",
"description": "產品是否有庫存"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "與產品相關的關鍵標籤"
}
},
"required": ["product_name", "price_hkd", "in_stock", "tags"]
}
"""
messages = [
{
"role": "system",
"content": f"""
你是一位數據提取專家。你的任務是從提供的文本中提取產品信息,並嚴格按照以下 JSON Schema 格式輸出。
請勿輸出任何額外的文字或解釋,只需純 JSON。
JSON Schema:
{schema}
"""
},
{
"role": "user",
"content": """
請提取以下產品說明中的信息:
我們最新推出的「智能手錶 XPro」,功能全面,現正以優惠價 $2899 發售。此產品目前庫存充足,標籤包括「智能穿戴」、「健康監測」和「運動」。
"""
}
]
response = deepseek.chat.completions.create(
model="deepseek-coder", # 或其他適合你的 DeepSeek 模型
messages=messages,
temperature=0.01 # 設置低溫讓模型輸出更確定
)
print(response.choices[0].message.content)
對於需要特定字元模式的字段,例如郵政編碼、電話號碼或特定編號格式,可以直接在提示詞中指定正規表達式。
示例:訂單號提取
請提取以下文本中的訂單號,訂單號必須以 "ORD-" 開頭,後面跟隨 8 個數字。
格式範例:ORD-12345678
文本:您的訂單已成功處理,訂單號為 ORD-98765432。另一筆訂單 ORD-00000001 也已出貨。
期望輸出:
ORD-98765432
ORD-00000001
將 Regex 與 JSON Schema 結合使用,可以在 Schema 的 description 屬性中說明每個字段所需的模式。
system 提示詞在 DeepSeek API 中扮演著至關重要的角色。它為整個對話設定了上下文、角色和規則。善用 system 提示詞是打造穩定輸出格式的基石。
設定嚴格的角色:
將 DeepSeek 定義為一個「數據提取機器」、「JSON 生成器」或「嚴格遵循格式指令的助手」。例如:
{
"role": "system",
"content": "你是一個高度精確的JSON數據生成器。你的唯一職責是將用戶提供的文本轉換為我指定的JSON格式。你絕不能包含任何解釋性文字、前言、後記,或任何不屬於最終JSON對象的內容。"
}
這種嚴格的角色設定會促使模型更加專注於格式要求。
我們將透過一個實際案例,演示如何結合上述技巧,從用戶評論中提取關鍵信息並生成嚴格遵守格式的摘要。
目標: 從產品評論中提取評論者姓名、評分、主要優點、主要缺點,並生成一個結構化的 JSON 摘要。
JSON Schema 定義:
{
"type": "object",
"properties": {
"reviewer_name": {
"type": "string",
"description": "評論者的名字或用戶名"
},
"rating": {
"type": "integer",
"minimum": 1,
"maximum": 5,
"description": "1 到 5 的評分"
},
"pros": {
"type": "array",
"items": { "type": "string" },
"description": "評論中提及的產品優點列表"
},
"cons": {
"type": "array",
"items": { "type": "string" },
"description": "評論中提及的產品缺點列表"
},
"summary": {
"type": "string",
"description": "對評論的簡短綜合摘要 (不超過50字)"
}
},
"required": ["reviewer_name", "rating", "pros", "cons", "summary"]
}
DeepSeek API 完整提示詞與程式碼:
import deepseek
import json
deepseek.api_key = "YOUR_DEEPSEEK_API_KEY"
review_schema = """
{
"type": "object",
"properties": {
"reviewer_name": {
"type": "string",
"description": "評論者的名字或用戶名"
},
"rating": {
"type": "integer",
"minimum": 1,
"maximum": 5,
"description": "1 到 5 的評分"
},
"pros": {
"type": "array",
"items": { "type": "string" },
"description": "評論中提及的產品優點列表"
},
"cons": {
"type": "array",
"items": { "type": "string" },
"description": "評論中提及的產品缺點列表"
},
"summary": {
"type": "string",
"description": "對評論的簡短綜合摘要 (不超過50字)"
}
},
"required": ["reviewer_name", "rating", "pros", "cons", "summary"]
}
"""
user_review = """
評論者:陳大文
評分:4 星
這款耳機音質絕佳,續航力也很棒,幾乎可以聽一整天。唯一的問題是戴久了耳朵會有點不舒服,而且價格對學生來說稍貴。但總體來說非常滿意!
"""
messages = [
{
"role": "system",
"content": f"""
你是一位專業的產品評論分析師。你的任務是從提供的用戶評論中提取關鍵信息,並將結果嚴格地格式化為 JSON 對象。
請務必遵循以下 JSON Schema 的結構、數據類型和約束。
禁止在 JSON 之外添加任何文字、引言或解釋。
對於 'summary' 字段,請確保長度不超過50個字元。
JSON Schema:
{review_schema}
"""
},
{
"role": "user",
"content": f"請分析以下評論並生成 JSON 摘要:\n\n{user_review}"
}
]
response = deepseek.chat.completions.create(
model="deepseek-chat", # 或 deepseek-v2
messages=messages,
temperature=0.1 # 保持較低溫度以獲得穩定輸出
)
try:
# 嘗試解析 JSON 輸出
output_json = json.loads(response.choices[0].message.content)
print("成功解析的 JSON 輸出:")
print(json.dumps(output_json, indent=2, ensure_ascii=False))
except json.JSONDecodeError as e:
print(f"JSON 解析錯誤:{e}")
print("模型原始輸出:")
print(response.choices[0].message.content)
預期輸出:
{
"reviewer_name": "陳大文",
"rating": 4,
"pros": ["音質絕佳", "續航力很棒"],
"cons": ["戴久耳朵不舒服", "價格稍貴"],
"summary": "音質佳、續航力強的耳機,但佩戴舒適度及價格有待改進,總體滿意。"
}
儘管提示詞工程能大幅提升 DeepSeek 輸出格式的可靠性,但在生產環境中,仍應增加一道「後處理」防線。這是因為模型偶爾會出現「幻覺」或未能完全遵循最複雜的指令。
對於 JSON 輸出,在接收到 DeepSeek 的響應後,立即嘗試解析它。如果解析失敗(json.JSONDecodeError),說明輸出不是有效的 JSON。進一步,可以使用 Python 的 jsonschema 庫對解析後的數據進行 Schema 驗證。
import jsonschema
# ... (接續上面的 DeepSeek API 調用和 json.loads) ...
if 'output_json' in locals(): # 確保 output_json 已經被成功解析
try:
jsonschema.validate(instance=output_json, schema=json.loads(review_schema))
print("JSON 輸出通過 Schema 驗證。")
except jsonschema.exceptions.ValidationError as e:
print(f"JSON 輸出未能通過 Schema 驗證:{e.message}")
# 在此處可以觸發重試機制、人工審核或錯誤日誌記錄
對於需要遵循特定字元模式的字段,即使 JSON 解析成功,也應該用正規表達式再次檢查這些字段的值。
如果後處理階段發現格式不符合要求,可以實施以下策略:
打造 DeepSeek 百分之百不穿幫的輸出格式,是一項結合藝術與科學的提示詞工程實踐。從基礎的標記與分隔符,到進階的 JSON Schema 與正規表達式,再到關鍵的 system 角色設定和最終的後處理驗證,每一步都旨在為模型提供清晰、無歧義的指引。透過這些策略的綜合運用,您將能大幅提升 DeepSeek API 應用的穩定性和可靠性,確保數據流的順暢與高效。