deepseek-prompt-engineering-foolproof-output-formats


title: "DeepSeek 提示詞工程:如何打造百分之百不穿幫的輸出格式" description: "探討 DeepSeek API 回應格式不一致問題,提供一套系統化提示詞工程策略,助開發者透過角色設定、結構化指令及後處理技術,確保輸出結果百分百符合預期格式要求。" date: 2026-09-07 generated: true tags: ["posts"] layout: "layouts/post.njk" permalink: "/posts/2026-09-07-deepseek-prompt-engineering-foolproof-output-formats-443/index.html"

在 DeepSeek API 應用開發中,確保模型輸出的格式始終如一,是實現自動化流程和穩定用戶體驗的關鍵。許多開發者都曾面臨 AI 模型輸出「穿幫」——即輸出結果未能嚴格遵循預設格式——的挑戰。本文將深入探討如何運用提示詞工程技術,結合 DeepSeek 模型特性,打造百分之百不穿幫的輸出格式。

理解 DeepSeek 的「理解力」與「生成力」界限

DeepSeek 模型在理解自然語言指令方面表現出色,但當涉及精確的、機器可讀的輸出格式時,僅僅使用模糊的指令往往不夠。模型會優先考慮內容生成,而非格式的嚴格遵守。要解決這個問題,我們必須在提示詞中為 DeepSeek 設置清晰的「護欄」和「藍圖」。這意味著不僅要告訴它「做甚麼」,更要明確指導它「如何做」以及「以甚麼形式做」。

一個常見的誤區是認為只需一句「請以 JSON 格式輸出」便足以。實際上,如果沒有明確定義 JSON 結構,模型可能會生成不符合預期的鍵值對或數據類型。

基礎格式約束術:從簡單標點到結構化輸出

要確保 DeepSeek 輸出格式的穩定性,可以從以下基礎技巧開始:

1. 明確的起始與結束標記

在提示詞中指定清晰的開頭與結尾標記,能幫助模型區分有效輸出內容與冗餘說明。

示例:

請提取以下文本中的產品名稱和價格。
---OUTPUT_START---
產品名稱:
價格:
---OUTPUT_END---

文本:最新款智能手機,性能卓越,現正以港幣 7999 元發售。

2. 精確的關鍵詞與分隔符

對於簡單的列表或配對信息,使用特定的關鍵詞和分隔符可以有效引導模型。

示例:

請列出以下文章中提到的所有國家和其首都,格式為「國家:首都」並以逗號分隔。

文章:法國的首都是巴黎,而德國的首都是柏林。日本東京是科技中心,但其國家是日本。

期望輸出:法國:巴黎,德國:柏林,日本:東京

3. 多模態指令輔助(視覺化)

雖然我們主要討論文字提示詞,但思考格式時,在腦海中對其進行視覺化,有助於更清晰地描述。例如,如果需要表格輸出,可以在提示詞中簡要描述表格結構。

進階格式化策略:JSON Schema 與正規表達式

當輸出格式變得複雜,例如需要嵌套結構、特定數據類型或嚴格的字元模式時,基礎方法便顯得力不從心。此時,引入 JSON Schema 和正規表達式(Regex)是更可靠的選擇。

1. 利用 JSON Schema 定義輸出結構

JSON Schema 是一種強大的工具,用於描述 JSON 數據的結構。雖然 DeepSeek 並不直接「執行」JSON Schema,但我們可以將其作為一個「藍圖」嵌入到提示詞中,告知模型輸出的精確結構要求。

步驟:

  1. 定義你的 JSON Schema: 詳細說明每個字段的名稱、類型、是否為必須、允許的值範圍等。
  2. 將 Schema 嵌入提示詞:systemuser 提示詞中清晰地呈現這個 Schema。
  3. 明確指示模型遵循 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)

DeepSeek API 程式碼與結構化輸出

2. 將正規表達式嵌入指令

對於需要特定字元模式的字段,例如郵政編碼、電話號碼或特定編號格式,可以直接在提示詞中指定正規表達式。

示例:訂單號提取

請提取以下文本中的訂單號,訂單號必須以 "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 輸出格式的可靠性,但在生產環境中,仍應增加一道「後處理」防線。這是因為模型偶爾會出現「幻覺」或未能完全遵循最複雜的指令。

辦公桌上的電腦屏幕與鍵盤

1. JSON 解析與 Schema 驗證

對於 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}")
        # 在此處可以觸發重試機制、人工審核或錯誤日誌記錄

2. Regex 匹配檢查

對於需要遵循特定字元模式的字段,即使 JSON 解析成功,也應該用正規表達式再次檢查這些字段的值。

3. 容錯機制與重試策略

如果後處理階段發現格式不符合要求,可以實施以下策略:

總結

打造 DeepSeek 百分之百不穿幫的輸出格式,是一項結合藝術與科學的提示詞工程實踐。從基礎的標記與分隔符,到進階的 JSON Schema 與正規表達式,再到關鍵的 system 角色設定和最終的後處理驗證,每一步都旨在為模型提供清晰、無歧義的指引。透過這些策略的綜合運用,您將能大幅提升 DeepSeek API 應用的穩定性和可靠性,確保數據流的順暢與高效。