API 開發

控制 Claude 輸出的三個旋鈕:system prompt、temperature 與 stop sequence

控制 Claude 輸出有三個常用手段:system prompt 設定角色與行為準則,讓回應符合特定用途;temperature 在 0 到 1 之間調整輸出的隨機程度,事實型任務調低、創意型任務調高;預填 assistant 訊息搭配 stop sequence,則能拿到不帶多餘說明的乾淨結構化資料。
控制 Claude 輸出的三個旋鈕:system prompt、temperature 與 stop sequence:文章重點卡

控制 Claude 輸出的三個旋鈕:system prompt、temperature 與 stop sequence

會送請求只是起點,真正決定應用品質的,是你能不能讓 Claude 用你要的方式回答。同一個模型,可以是有問必答的百科,也可以是循循善誘的家教;可以每次都給一樣的答案,也可以每次都給你驚喜。

這篇整理三個最實用的輸出控制手段:system prompt、temperature,以及預填回應搭配 stop sequence 的組合技。

你將學到什麼

system prompt 是什麼

用一段角色描述改變 Claude 的語氣、風格與行為準則。

temperature 怎麼調

0 到 1 的創意旋鈕,不同任務有不同的建議區間。

預填回應的技巧

先替 Claude 起個頭,引導它直接輸出你要的格式。

stop sequence 的用法

設定停止字串,在多餘內容出現前就結束生成。

system prompt:先給 Claude 一個角色

想像你在做一個數學家教機器人。學生問「5x + 2 = 3 怎麼解」,你希望 Claude 像真正的家教:先給提示、一步一步引導學生自己想,而不是直接把答案丟出來,更不能叫學生去按計算機。

system prompt 就是為此而生:一段純文字的行為指引,透過 system 參數傳進 create 呼叫。它有三個作用:給 Claude 回應方式的指引、讓它以指定角色的口吻與思路回應、幫助它不偏離任務。

system_prompt = """
You are a patient math tutor.
Do not directly answer a student's questions.
Guide them to a solution step by step.
"""

client.messages.create(
    model=model,
    messages=messages,
    max_tokens=1000,
    system=system_prompt
)

效果差多少?沒有 system prompt 時,Claude 直接給出完整的解題步驟;加上之後,它改問引導性的問題,例如「你覺得第一步該怎麼把 x 孤立出來」。同一個模型,行為完全不同。對學生來說,被引導著自己想出答案,遠比直接抄一份解答學得多,這正是產品價值的差別。

讓共用函式保持彈性API 不接受 system=None,所以寫共用的 chat 函式時,只在真的有 system prompt 時才把參數放進去。下面的寫法順便把 temperature 也接上了。
def chat(messages, system=None, temperature=1.0):
    params = {
        "model": model,
        "max_tokens": 1000,
        "messages": messages,
        "temperature": temperature,
    }

    if system:
        params["system"] = system

    message = client.messages.create(**params)
    return message.content[0].text

temperature:輸出的創意旋鈕

Claude 生成文字時,每一步都在計算「下一個 token 是誰」的機率,再從中抽選。舉一個簡單的例子:送出「What do you think」這樣的開頭,Claude 內部先斷詞,再對下一個詞算出機率分布,例如 about 佔 30%、would 佔 20%、of 佔 10%,然後從中抽選一個接上去,再重複整個流程。

temperature 是 0 到 1 之間的小數,動的就是這個分布的形狀:接近 0 時,Claude 幾乎永遠選機率最高的詞,輸出穩定可預測;接近 1 時,機率攤得比較平,比較冷門的詞也有機會被選中,輸出更多變、更有創意。

低:0.0 到 0.3中:0.4 到 0.7高:0.8 到 1.0事實問答、程式、抽取摘要、教學、解題腦力激盪、創意寫作01越往右越有創意
temperature 光譜:往左是穩定與一致,往右是變化與創意。

什麼任務配什麼溫度

溫度區間適合的任務
低(0.0 到 0.3)事實回答、程式輔助、資料抽取、內容審核
中(0.4 到 0.7)摘要、教學內容、問題解決、有框架的創意寫作
高(0.8 到 1.0)腦力激盪、創意寫作、行銷文案、笑話生成

用「生成電影點子」來示範:溫度 0.0 時,你會反覆拿到幾乎一樣的劇情;溫度 1.0 時,主題、角色與情節的變化就豐富得多。記住一個原則:溫度改變的是機率,不是保證。要穩定就調低,要發散就調高,一般任務取中間。

另外提醒一個實作細節:溫度是跟著請求走的參數,同一個應用裡的不同功能可以用不同溫度,例如摘要功能取中段、標題發想調高。

預填回應+stop sequence:拿到乾淨的結構化資料

換一個場景:你做了一個產生 JSON 設定的網頁工具,使用者按下產生,就想直接複製整段結果。但 Claude 天性熱心,預設會把 JSON 包在 markdown 程式碼區塊裡,前後再加幾句說明。JSON 本身是對的,使用者卻得手動框選中間那段,體驗差了一截。

解法是兩招合體:預填 assistant 訊息加上 stop sequence。所謂預填,就是在對話歷史的最後,替 Claude 先放上一則它「已經說了一半」的訊息,Claude 收到後會順著這個開頭接下去寫。

messages = []

add_user_message(messages, "Generate a very short event bridge rule as json")
add_assistant_message(messages, "```json")

text = chat(messages, stop_sequences=["```"])

它的運作原理是這樣的:

  1. user 訊息告訴 Claude 要生成什麼
  2. 預填的 assistant 訊息是程式碼區塊的開頭記號,讓 Claude 以為自己已經開好了區塊
  3. Claude 接著只寫 JSON 內容
  4. 當它想輸出區塊結尾記號時,stop sequence 立刻結束生成

換句話說,你不是拜託 Claude 別加說明,而是從結構上讓說明沒有出現的空間。這比在提示裡寫一百次「不要多話」都可靠。

user 訊息請生成 JSON預填 assistant區塊開頭記號Claude 續寫純 JSON 內容stop sequence撞到結尾就停
預填開頭、擋住結尾,中間留下的就是乾淨的 JSON。

拿到的字串前後可能帶幾個換行,用 json.loads(text.strip()) 清一下就能解析。這招不限於 JSON:Python 程式碼片段、條列清單、CSV,任何「只要內容、不要解說」的場景都適用。訣竅是找出 Claude 天生想把內容包在什麼裡面,那就是你的預填內容與停止字串。

三個旋鈕,合起來用

回到開頭的數學家教機器人,三個旋鈕可以這樣配:system prompt 設定家教角色與引導原則;temperature 調在中段,讓提問方式有點變化又不至於天馬行空;之後若要讓它輸出結構化的練習題資料,再用預填加 stop sequence 把格式鎖住。

三個手段的層次不同:system prompt 管「用什麼身分與原則回應」,temperature 管「同一個問題下輸出的變化幅度」,預填與 stop sequence 管「輸出的起點與終點」。分開理解、合併使用,你對 Claude 輸出的掌控會立刻上一個檔次,而這一切都不需要換模型,只是幾個參數與訊息的安排。

參考出處本文取材自 Anthropic 官方 Claude Academy 免費課程「Building with the Claude API」,由酒Ann 消化後以自己的視角重新編寫。想看英文原版課程,可到 Claude Academy 修習。

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

system prompt 跟一般 user 訊息差在哪?
system prompt 是行為準則,告訴 Claude「你是誰、該怎麼回應」,對整段對話持續生效;user 訊息則是當下要處理的具體內容。
temperature 設 0 就每次輸出都一樣嗎?
溫度接近 0 時 Claude 幾乎總是選機率最高的詞,輸出非常穩定;但溫度改變的是機率而不是保證,高溫度時偶爾也會出現相似的回應。
怎麼讓 Claude 只回 JSON、不要多餘解釋?
預填一則內容是 markdown 程式碼區塊開頭的 assistant 訊息,再把區塊結尾記號設為 stop sequence。Claude 會接著只寫 JSON 內容,想關閉區塊時就被停住。
API 可以不帶 system prompt 嗎?
可以,不帶就是預設行為。但注意 API 不接受 system=None,要嘛給字串,要嘛整個參數不要傳。