在前一天的分享中,我們掌握了「目標 + 約束 + 邊界」的三要素提示公式。然而在日常對話中,如果每次發問都要重複打上一大串限制規範,往往費時費力。
如果你直接問 ChatGPT:「這段 Java 代碼怎麼寫?」,它通常會給出一段「能跑但缺乏架構考量」的玩具代碼(Toy Code),甚至夾雜大量客套廢話。今天我們就來聊聊如何透過 System Prompt(系統提示詞) 與 角色扮演(Role-playing),讓 AI 一秒化身為對代碼品質挑剔的「資深後端技術專家」。
一、為什麼需要「角色扮演」?
大型語言模型在訓練時學習了全網各種類型的文字,包含新手寫的範例代碼、論壇討論、以及頂級開源專案。
當你不給予明確角色定位時,模型傾向給出「最通用、平均水準」的解答。但當我們在 System Prompt 中明確賦予它身分時:
收斂解題範圍:激活模型內部關於高併發、乾淨架構(Clean Architecture)與設計模式的權重。
精準語氣輸出:減少冗長寒暄,以簡短、切中要害的 Code Review 格式呈現。
主動考量安全與擴展性:代碼會自動帶入執行緒安全(Thread-safety)、防注入與例外處理。
二、打造你的專屬「資深 Java 架構師」System Prompt
你可以將以下這段內容儲存在 ChatGPT 的 Custom Instructions(自訂指示),或在每次新對話的第一句發送:
【System Prompt 範本】
你是一位具備 10 年以上經驗的資深 Java 後端架構師。請依循以下準則協助我:
回答風格:開門見山,直擊核心邏輯,非必要請勿寒暄。
代碼標準:使用 Java 17+ 現代語法,嚴格遵守物件導向原則、SOLID 與 Clean Code 規範。
防禦性設計:代碼必須妥善處理空指標、執行緒安全與邊界例外。
審查回饋(Code Review):提供代碼後,簡短列出 2~3 個該設計在「效能、安全性或擴展性」上的考量點。
三、實測對比:一般提問 vs 角色扮演
我們以常見的「產生全局唯一 ID 或訂單編號產生器」為例,看看兩者產出的差異。
普通提問產出的初階代碼
很多時候 AI 會直接給出單純使用 UUID.randomUUID() 或沒有考量併發的計數器:
// 普通提問常見的產出:缺乏業務語意且可能在併發下出錯
public class OrderService {
private int counter = 0;
public String generateOrderId() {
counter++;
return "ORDER-" + System.currentTimeMillis() + "-" + counter;
}
}
問題:在多執行緒環境下 counter++ 不是原子操作,會引發競爭條件(Race Condition)導致訂單編號重複。
套用「資深架構師」提示詞後的產出
設定好 System Prompt 後,AI 給出的是兼顧時間排序、執行緒安全與格式規範的實踐:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;
/**
執行緒安全的訂單編號產生工具
格式:PREFIX + yyyyMMddHHmmss + 4位原子序號 (重置循環)
*/
public final class OrderIdGenerator {
private static final String PREFIX = "ORD";
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private static final AtomicInteger SEQUENCE = new AtomicInteger(1);
private static final int MAX_SEQUENCE = 9999;
private OrderIdGenerator() {
// 工具類別防止外部實例化
}
public static String nextId() {
String timestamp = LocalDateTime.now().format(FORMATTER);
int currentSeq = SEQUENCE.getAndUpdate(val -> (val >= MAX_SEQUENCE) ? 1 : val + 1);
return String.format("%s%s%04d", PREFIX, timestamp, currentSeq);
}
}
四、架構師角度的 Code Review 剖析
套用角色設定後,AI 還會主動附上專業的架構審查理由:
執行緒安全(Thread-Safety):使用 AtomicInteger 搭配 getAndUpdate() 確保在百萬級併發請求下,序號遞增仍然具備原子性,杜絕重複 ID。
私有建構子(Private Constructor):符合 Utility Class 規範,避免被無謂 new 出物件造成記憶體垃圾。
不可變常數抽取:將時間格式化與固定前綴抽成 static final,降低重複建立物件的開銷。
今日小結與預告
今天我們驗證了 System Prompt 的威力:只要賦予 AI 明確的專家角色與規範約束,就能瞬間將「拼裝代碼」提升為「符合生產環境標準」的穩健代碼。
明天的 Day 05,我們將探討另一項關鍵技能:「精準控制:Few-shot Prompting 實踐,給範例讓 AI 輸出固定風格與型別規範的代碼」,教大家如何透過少量範例完全鎖死 AI 的輸出格式!