提示工程

生成式 AI 課程中,您瞭解到生成式 AI 模型的輸入空間幾乎不受限制。如要生成符合使用者期望的輸出內容,請建構提示。提示是應用程式與模型之間的結構化合約。

撰寫得當的提示:

  • 說明 LLM 應如何生成回覆。
  • 包含多個可隨時間進行版本控管、測試及改良的元件。
  • 可做為共用構件,供跨團隊協作。

本單元將說明如何撰寫有效提示。我們會說明提示的結構,以及提示元件在系統和使用者之間的分配方式。您也會學到基本的提示技巧,以及各種技巧的適用情境。

在本單元中,我們將使用一個共用範例:BlogBuddy,這是一款 AI 輔助寫作工具,靈感來自 CyberAgent 使用 Prompt API 的方式

返回生成式 AI 模組的 BlogBuddy 系統藍圖

提示元件

每個提示元件在引導模型行為方面都扮演特定角色。

  • 脈絡:建立模型的角色和網域,讓模型瞭解該如何運作。
  • 指令:指派特定工作給模型。
  • 輸入變數:應用程式即時提供的特定情境內容。
  • 輸出格式:定義預期的輸出結構。舉例來說,您可能需要 JSON 輸出內容。
  • 範例:示範如何針對一或多個其他輸入內容執行工作。
  • 限制:設定明確限制,確保輸出內容一致、安全且符合品牌形象。

提示可以包含部分或所有這些元件。以下範例說明 BlogBuddy 寫作助理功能中的這些元件。

### Context

You are a writing assistant for blog authors.
Your job is to generate helpful, concise, and engaging content.

### Instruction

Generate 3 alternative titles for the user's blog post with a given style.

### Input variables

Here is the content of the blog post:
${blogPostContent}

Here is the desired style:
${titleStyle}

### Output format

Return valid JSON ONLY, in the following exact structure:
{
  "titles": ["Title option 1", "Title option 2", "Title option 3"]
}

### Examples

Example input:
{
  "blogPostContent": "I finally visited the small neighborhood café I've been eyeing for months...",
  "titleStyle": "friendly"
}

Example output:
{
  "titles": [
    "A First Visit to the Neighborhood Café",
    "Trying the Café I've Wanted to Visit for Months",
    "My Experience at a Long-Awaited Local Spot"
  ]
}
### Constraints

- Each title must be under 128 characters.
- Titles must be original, not copied verbatim from the draft.
- Keep the tone natural and human. Avoid emojis unless explicitly requested.
- Avoid sensationalism or clickbait.
- If the draft includes multiple topics, choose the most prominent topic.

第一次使用提示時,請先從基本要素開始:指令和輸出格式。接著,在分析結果並判斷成功需要哪些更精細的控制項時,反覆新增更多元件。

系統提示與使用者提示

部分提示元件是硬式編碼,其他元件則可由使用者提供:

  • 系統提示由應用程式開發人員提供,用於定義模型的整體行為。您可以設定模型的角色、預期語氣、輸出格式 (例如嚴格的 JSON 結構定義) 和任何全域限制。您也可以在系統提示中編碼安全和責任要求。這項設定在所有要求中都保持一致,為模型的行為提供穩定的基礎。

  • 使用者提示包含直接要求,可產生輸出內容。 使用者要求執行特定工作,其中可能包含特定變數。 例如:「為這篇文章提供三個標題」、「繼續撰寫這段文字」或「讓這段文字聽起來更正式」。

大多數生成式 AI API 都允許您將提示詞建構為訊息陣列,每則訊息都有角色 (系統或使用者) 和內容。這樣一來,您就能更輕鬆地將穩定且全域的指令,與動態的每個要求輸入內容分開。

如何決定系統提示中應包含哪些元件,以及應由使用者指定哪些元件?答案取決於使用者體驗的彈性程度,以及模型的效能。

受限用途

如果是高度特定的用途,大部分的提示詞都可以在系統提示中預先定義。舉例來說,在 BlogBuddy 中,使用者可以點選「顯示標題」,查看系統為草稿生成的標題建議清單。

工作已修正、輸出格式已知,且使用者無須提供額外背景資訊即可取得預期結果。在這種情況下,您會將所有穩定規則、語氣指南、輸出結構定義和範例放在系統提示中。

如要使用 Prompt API 建構這項功能,我們會使用 initialPrompts 為整個工作階段定義系統層級的行為:

// Defines stable behavior for the entire session
const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: "system",
      content: `You are a blog-writing assistant.
      Your task is to generate high-quality titles for blog posts.
      Always respond in concise, friendly language.
      Return exactly 3 alternative titles.
      Produce valid JSON with a "titles" array of strings.`
    }
  ]
});

使用者點選「顯示標題」時,系統會針對目前內容叫用提示:

// The only variable input is the blog content
const result = await session.prompt(blogContent);

隨著時間推移,使用者可能會要求更多彈性和控制權。在這種情況下,您可以將特定元件移至使用者提示,並搭配介面控制項。例如風格或語氣規格的下拉式選單。

不過,結構化動作過多可能會造成使用者體驗混亂。發生這種情況時,您可能需要改用更開放式的設計,讓使用者自行指定大部分的提示。 如要進一步瞭解如何最佳化這項設計,請參閱 UX 模式單元

彈性工作需要詳細的使用者提示

這項開放式互動體驗可協助使用者從頭撰寫網誌文章,提供更多彈性。他們可能會要求提供點子、大綱、重寫內容、改變語氣或發想點子,或是具體說明如何執行工作。這類應用程式可能需要更強大的伺服器端模型。

由於彈性工作可用的選項範圍更廣,使用者需要指定更多資訊。系統提示仍會控管整體行為。

最佳做法如下:

  • 將穩定的規則、結構和範例放入系統提示。在使用者提示中加入動態內容和特定工作要求。
  • 使用者體驗越開放,使用者提示就越需要彈性,才能因應無法預測的輸入內容。
  • 使用者提示需要執行的工作越多,模型就越需要具備能力,因為模型必須處理更多變化,但內建結構較少。

您可以運用這些規則,逐步調整產品情境中控制權與使用者彈性之間的取捨。密切觀察使用者偏好和行為。更靈活的設定不一定能帶來實際價值。使用者也需要有時間、技能和認知頻寬,才能製作更詳盡的提示。

常見的提示詞撰寫技巧

開發人員通常會嘗試多種提示詞撰寫技巧,找出最適合自己用途和模型的技巧。

零樣本提示

您為模型說明工作,並祈禱能獲得最佳結果。例如:

"What is the capital of France?"

零樣本提示是許多 AI 工作的高效率基準。如果是查詢百科全書知識等不複雜的要求,您可能最好還是使用這項技術。不過,在大多數實際應用程式中,您需要使用額外的條件和邏輯擴充提示。

少量樣本提示

少量樣本提示會提供範例,示範正確的行為、風格、結構和其他重要變數。以下是情緒分類的提示範例:

You classify user messages into one of the following categories:
- "positive"
- "negative"
- "neutral"
Here are examples to guide your classifications:
Input: "I love this product! It works perfectly."
Output: { "label": "positive" }

Input: "This is terrible. I want a refund."
Output: { "label": "negative" }

少量樣本提示適用於這類偽預測工作。 這項技術也適用於遵循可辨識結構的任務,例如圖 1 中的標題生成。

如果輸出空間非常寬廣 (例如開放式或長篇內容),少樣本提示可能不是最佳技術。難以或甚至無法提供有意義的空間涵蓋範圍範例。

思維鏈提示

您會鼓勵模型先逐步推論,再產生答案。 您可以明確說明步驟,也可以交由模型定義。例如:

"Think step-by-step to identify the main idea of this paragraph. Then produce a
short heading under 60 characters."

連鎖思考法非常適合需要多步驟推論和執行的工作,例如擬定網誌文章大綱或輔助複雜決策。這項技術是所謂推論模型背後的主要技術。

這項作業可能所費不貲。生成逐步推理追蹤記錄會增加運算量、費用和延遲時間。只有在您的使用案例需要複雜的推理和規劃時,才使用這項功能。

自我反思提示

在初始生成後,要求模型自行評論並修訂輸出內容。例如:

"Review your previous output.
Identify unclear phrasing and rewrite it more concisely."

自我反思特別適合用於需要反覆修正的作業,例如編輯或重寫工具。這項功能實作快速,且能大幅提升品質。如果提示成效良好,建議採用自我反思迴圈。首先,請修正輸出內容,讓結果更清楚或更符合使用者需求。

重點摘要

在本單元中,您已瞭解如何從結構化元件建構提示。實務上,提示工程是高度實驗性的工作。經過多輪修正後,才能獲得清楚且可靠的結果。

下一個單元將探討以評估結果為依據的提示開發作業。這項做法有助於系統性地改善提示,並找出最適合產品和使用者的提示。

資源

這些技術各有不同的變體和最佳做法。有許多詳細的外部資源可供參考,例如:

請查看所選模型的說明文件,因為當中可能提供具體建議,協助您獲得最佳結果。

隨堂測驗

系統提示中可以指定哪些類型的規則?

特定輸入變數 (例如使用者輸入內容)、預期輸出結構、模型角色和字元數上限。
答對了,做得很好!
這裡只會顯示使用者輸入內容。
不完全正確,請再試一次。
建立模型的角色和領域,讓模型瞭解如何運作。
不完全正確,請再試一次。
使用的模型類型和模型大小。
不對,請再試一次。

如要讓模型先逐步推論,再產生答案,應使用哪種技術?

零樣本提示
答錯了。
少量樣本提示
答錯了。
思維鏈提示
答對了,做得很好!
自我反思提示
答錯了。

少量樣本提示最適合用於哪些情況?

要求模型執行工作時未提供任何背景資訊。
答錯了。
工作遵循可辨識的結構 (例如產生標題),或需要特定格式。
答對了,做得很好!
當輸出空間非常大時,例如開放式創意寫作。
答錯了。
希望模型自行評論自己的作品。
答錯了。

什麼是自我反思提示技巧?

要求模型自行評論及修正輸出內容,以提升清晰度或品質。
答對了,做得很好!
多次執行提示並計算結果平均值。
答錯了。
如果結果不佳,請要求使用者重新撰寫提示。
答錯了。
允許模型動態變更系統提示。
答錯了。