iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
AI & Data

來都來了,那就做一個GCP從0到100的AI助理系列 第 13

讓 AI 認識你:用 Python 實作 Prompt 個人化(角色、口吻、限制條件)

  • 分享至 

  • xImage
  •  

昨天 的程式碼示範,讓我們成功呼叫 Gemini API 並得到第一個回應。這等同於完成了 Hello World of LLM

但現實專案裡,我們需要的不只是「AI 可以說話」,而是能讓它根據上下文、角色定位、輸出規格去生產可直接落地使用的結果。這就是 Prompt Engineering + Python Code Structure 結合的關鍵。

今天我們的目標是:

  1. 模組化 Prompt:讓程式結構對後續擴展更有彈性。
  2. 掌握三大技巧:角色 (Role)、口吻 (Tone)、限制條件 (Constraints)。
  3. 從 Demo 到 Utility:理解怎麼把 Prompt 設計思路轉化成可維護的程式模式。

步驟一:程式碼結構優化 — Prompt 抽離

最初版程式碼將字串直接寫在 generate_content() 裡:


response = model.generate_content("用一句話介紹你自己")

這樣雖然能跑,但對專案開發來說不夠彈性。最佳實務:將 Prompt 抽出成變數,甚至未來可存放在 YAML/JSON 檔資料庫 供版本控管。

技巧一:角色 (Role) — 定義專業身份

AI 本質上是條件反應系統。若沒有角色定位,它的回答會偏向通用型,不符合場景需求。

Example 1 : 自動產生 Conventional Commits 格式的 Git 訊息。

role = "你是一位資深軟體工程師,擅長撰寫符合 Conventional Commits 的 Git Commit 訊息。"
task = "我修復了一個使用者登入時,因密碼錯誤導致程式崩潰的 Bug。"
prompt = f"{role} {task}"

response = model.generate_content(prompt)
print(response.text)

輸出範例:

fix(auth): 處理因密碼不正確引發的異常,防止應用程式崩潰

技巧二:口吻 (Tone) — 控制風格

Example : 行銷文案

role = "你是一位社群媒體行銷專家"
tone = "請用活潑、有趣、充滿咖啡香氣的口吻"
task = "幫我為一款耶加雪菲日曬豆寫一篇 80 字左右的 IG 貼文。"

prompt = f"{role},{tone}。{task}"

response = model.generate_content(prompt)
print(response.text)

輸出範例:

☀️ 一口喝下衣索比亞的陽光!☀️ ... #咖啡豆推薦

技巧三:限制條件 (Constraints)

角色 + 口吻決定「風格」,但沒有約束就會失控。限制條件才是把 LLM 從「靈感工具」拉進「生產工具」的關鍵。

Example : 履歷優化

role = "你是一位專業的英文求職教練"
tone = "請用專業、鼓勵的口吻"
task = "針對軟體工程師職位,幫我優化履歷自我介紹"
constraints = """
請遵循以下規則:
1. 必須包含技能:Python, AWS, React。
2. 全文請用英文撰寫。
3. 嚴格限制在 100 字以內。
4. 最後條列 2 個改進建議。
"""

prompt = f"{role}。{tone}。{task}。{constraints}"

response = model.generate_content(prompt)
print(response.text)

輸出範例:

A results-driven Software Engineer...  
- Add quantifiable achievements  
- Tailor intro to target company  

進階思考:將 Prompt 結構化

為了更工程化地管理 Prompt,可以考慮把 Prompt 拆成 多維度物件

prompt_template = {
    "role": "Software Engineer",
    "tone": "Formal, concise",
    "task": "Generate an API error response",
    "constraints": [
        "Follow RFC 7807 Problem Details format",
        "Output must be valid JSON",
        "Message length < 50 words"
    ]
}

def build_prompt(template: dict) -> str:
    return f"""
    You are {template['role']} with {template['tone']} style.
    Task: {template['task']}
    Constraints:
    {"; ".join(template['constraints'])}
    """

prompt = build_prompt(prompt_template)
response = model.generate_content(prompt)

這樣的結構有幾個優勢:

  • 易於維護:每個維度單獨調整,不用硬改字串。
  • 可版本化:能夠存放在配置檔或資料庫。
  • 可擴展:未來支援多語系、角色庫、不同業務場景。

今天 的內容本質上是「單純透過使用者 Prompt 讓模型回答得更貼近需求」,還不算進入「系統層級的控制 (System Prompt / Model Configuration)」。下一章會介紹「System Prompt 與模型護欄 (Guardrails) 設計」專題,讓開發者理解如何從「使用者請求字串層級的提示工程」進階到「系統級輸入策略與安全限制」。


上一篇
建立第一個 Gemini API 專案-新手體驗
系列文
來都來了,那就做一個GCP從0到100的AI助理13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言