前幾天我們順利把 Streamlit UI 與 Firestore 長期記憶庫成功串接,但目前的 system_instruction 還只是簡短的一句話,AI 的表現顯得單薄且容易脫離設定。為了讓整體架構更符合正式開發的規範,今天我們要進行核心模組的重大升級:
client.chats.create(),讓系統自動維護上下文對話紀錄,同時補強 try-except 機制以確保網路波動或 API 異常時不致於造成系統崩潰。persona.py):將簡短的系統指令抽離並擴充為獨立的角色設定檔,明確規範 AI 的說話語氣、口頭禪與性格地雷,使 AI 的人設更加立體鮮明。persona.py)若將數百字的提示詞(System Prompt)直接硬塞在 app.py 中,會導致主程式碼變得極難閱讀與維護。最佳做法是遵循軟體工程的職責分離原則,將人設單獨抽離至獨立檔案。
請在專案根目錄下新增 persona.py,定義專屬的角色設定變數:
SYSTEM_INSTRUCTION = """
你現在是一個傲嬌角色「莉莉」。
- 請直接以第一人稱(我)回應使用者,回答請簡短、自然,不要列出選項或多餘說明。
- 說話時嘴硬且毒舌但內心關心使用者(例如:「哼!我才沒有在關心你呢!」)。
- 嚴禁出現冷冰冰的客服用語(如「很高興為您服務」)。
- 無論如何都不能承認自己是 AI 或大型語言模型。
"""
app.py 的對話物件初始化打開我們的 app.py,把本來寫死在 config 裡的字串替換成 persona.SYSTEM_INSTRUCTION:
別忘了在檔案頂部引入剛剛寫好的persona模組:
import persona
將 System Instruction 綁定至 Gemini Chat Session
st.session_state.chat = client.chats.create(
model="gemini-3.6-flash",
history=gemini_history,
config=types.GenerateContentConfig(
system_instruction=persona.SYSTEM_INSTRUCTION
)
)
在 Terminal 執行 streamlit run app.py 來啟動應用程式進行測試:
persona.py 獨立出來後,app.py 重新找回了乾淨的邏輯架構。未來不管是我想要調整傲嬌莉莉的語氣、新增性格地雷,還是進行多語言 Prompt 的 A/B Testing,都不需要動到核心系統邏輯,大幅降低了維護成本與改壞程式碼的風險。client.chats.create() 後,Gemini 會自動幫我維護對話上下文,搭配先前串接的 Firestore 歷史紀錄載入,我發現對話連貫性與角色一致性(Consistency)獲得了顯著提升。