🎯 什麼情境該想到我
當你「想控制 AI 角色扮演的劇情往哪走——開場怎麼定調、中途怎麼帶方向、走歪了怎麼修、爛回覆怎麼自動擋」的時候。
⚙️ 怎麼用
核心認知:引導劇情=在 prompt 的不同位置放不同資訊
模型不會「記得」劇情計畫,它每一輪只看得到這次 prompt 裡的文字。所以「控制故事走向」在工程上等於:決定哪些引導文字、何時、放在 prompt 的哪個位置。SillyTavern 把工具分成四層,由靜到動:
| 層 | 性質 | 工具 |
|---|---|---|
| 1. 靜態基礎 | 角色卡作者預先寫好 | scenario、first_mes、description、personality |
| 2. 動態引導 | 持續、條件式影響 | Author’s Note、World Info、Depth Prompt |
| 3. 即時修正 | 使用者當下介入 | 場景覆蓋、Swipe 分支、旁白/系統訊息 |
| 4. 自動化 | 系統自動把關 | Quick Replies、Auto-Swipe、Banned Tokens |
第 1 層:靜態基礎
Scenario(場景) 告訴模型「故事在什麼情境下發生」。解析優先級:chat_metadata['scenario'] > character.scenario——每個聊天可以覆蓋,角色卡的值只是預設。取得後做宏替換({{user}}、{{char}})再注入:
- Chat Completion:套
scenario_format(預設{{scenario}}),成為一條獨立 system message(identifierscenario),位置由 PromptManager 排序決定。 - Text Completion:在 Story String 的 Handlebars 模板裡
{{#if scenario}}Scenario: {{scenario}}{{/if}},與 description、personality 合併成一段。
scenario 也被放進 World Info 的全局掃描資料(WIGlobalScanData),所以場景寫「中世紀城堡」就能自動激活城堡相關條目。
First Message(首條訊息) 是開幕演出。★ 模型會強烈模仿既有對話的風格——首條訊息的動作描寫方式、對白格式、語氣、長度,會直接複製到之後的每一則回覆。這是角色卡作者最有效的風格控制點,比在指令裡寫「請詳細描寫動作」更有用。
| 類型 | 用途 |
|---|---|
first_mes | 預設開場 |
alternate_greetings[n] | 不同的起點(初見 / 重逢 / 衝突) |
group_only_greetings[n] | 群組聊天專用的多角色開場 |
Description / Personality 不直接決定劇情,但定義「角色會怎麼回應劇情」,間接限縮了故事可能的方向。
第 2 層:動態引導
Author’s Note(AN)——最常用的方向盤。一段持續注入的文字,例如「氣氛越來越緊張,暴風雨正在逼近」。
- 頻率:每 N 條使用者訊息注入一次(其他輪跳過)。
- 位置:
after(場景之後,0)、in-chat(聊天歷史指定深度,1)、before(場景之前,2)。 - 深度:預設 depth 4=從末尾往回數第 4 層。
★ 為什麼 depth 關鍵:模型對離生成點最近的文字最敏感。depth 0 貼在最後一則訊息旁、影響最強;depth 4 有影響力又不會蓋過最近對話的脈絡。
角色專屬 AN 與全域 AN 的合併模式:replace(取代全域)、before(放全域前)、after(放全域後)。例如全域「著重情感深度」+角色「Alice 藏著一個秘密」。
World Info——條件觸發的背景知識,讓故事「有機展開」:提到某地點,那個地點的設定才出現。
| 技巧 | 例 |
|---|---|
| 場景觸發 | 關鍵字 tavern → 注入酒館氛圍與 NPC |
| 事件觸發 | the war → 注入戰爭歷史 |
| 人物知識 | mother → 注入母親設定 |
| constant 條目 | 永遠注入「這個世界的魔法正在消失」 |
| 遞迴觸發 | dark forest 條目內提到 ancient ruins → 連鎖激活 |
時間性控制:sticky 觸發後持續 N 輪、cooldown 之後停 N 輪、delay 被提到 N 次後才觸發——可用來做「伏筆」與「事件節奏」。
Depth Prompt——角色卡自帶的深度注入(extensions.depth_prompt,預設 depth 4、role system),以 IN_CHAT 方式注入。
| Author’s Note | Depth Prompt | |
|---|---|---|
| 歸屬 | 使用者、per-chat | 角色卡 |
| 換角色時 | 不變 | 跟著角色走 |
| 用途 | 使用者引導當下劇情 | 作者設定的行為指引 |
第 3 層:即時修正
場景覆蓋(per-chat override):每個聊天可獨立覆蓋 scenario、mes_example(影響回覆風格)、system_prompt(影響整體行為),寫進 chat_metadata,下一次生成即生效(getCharacterCardFieldsLazy() 中 metadata 優先)。★ 這讓同一張角色卡跑多條故事線成為可能:一個聊天是校園日常,另一個是末日冒險。
Swipe 分支:同一時間點生成多個版本,挑一個繼續。
message = {
mes: "當前顯示的文字",
swipes: ["版本0", "版本1", "版本2"],
swipe_id: 2, // 目前指向的版本
swipe_info: [...] // 各版本 metadata
}
好處:探索不同走向、回覆不滿意可重來而不刪歷史、所有版本保留可隨時切回(非破壞性)。後續劇情從被選中的版本繼續。
旁白與系統訊息:
| 指令 | 模型看得到 | 用途 |
|---|---|---|
/narrator | 是(type NARRATOR) | 插入劇情轉折、環境變化;可 at= 插到歷史任意位置、compact 小樣式,支援 {{bias "…"}} |
/comment | 否(is_system: true) | 使用者自己的筆記,不影響模型 |
/sys | 是 | 以系統訊息送出(文件描述為會觸發回應) |
第 4 層:自動化
Quick Replies 事件觸發:可綁在啟動、使用者送出後、AI 回覆後、切換聊天、新聊天、生成前等時機自動執行 STscript(例如 AI 回覆後自動 /note 更新 AN)。★ World Info 條目與 Quick Reply 都有 automationId,WI 激活時會自動執行對應的 QR,形成「知識被觸發 → 自動行為」的鏈(如 battle 條目激活就跑戰鬥腳本)。
Auto-Swipe(事後過濾):回覆長度 < auto_swipe_minimum_length,或命中黑名單詞數 ≥ threshold(用 \b 詞邊界 regex 比對,避免誤判),就自動重生成。
Banned Tokens(生成中禁止):三個來源——API 預設的 banned_tokens、全域 global_banned_tokens、宏 {{banned "word"}}(可寫在角色卡或 WI 裡動態禁詞)——合併去重後解析:[1,2,3] 視為 token ID;word 先 tokenize 成 ID;"exact string" 當 banned string(部分 API 支援)。最後以 bad_words_ids / banned_tokens 參數送進請求。
| Banned Tokens | Auto-Swipe 黑名單 | |
|---|---|---|
| 作用層級 | API 請求參數 | 回覆後處理 |
| 時機 | 生成過程中(根本不會產出) | 生成完才檢查 |
| 支援 | Text Generation 類(KoboldAI、llama.cpp 等) | 所有 API |
| 精度 | token 級 | 詞級(regex) |
各機制落在 prompt 的哪裡
Main Prompt
World Info (Before)
Persona Description
Character Description / Personality
Scenario ← 第 1 層
World Info (After)
Dialogue Examples
聊天歷史(含首條訊息、旁白、被選中的 swipe)
← 深度注入點:Author's Note / Depth Prompt / 記憶摘要
Jailbreak(Post-History Instructions)
一個典型流程:作者設 scenario「中世紀奇幻酒館」、酒館開場 first_mes、Character Book 放 NPC 與地點、depth_prompt「Alice 有個秘密」→ 使用者設 AN「暴風雨即將來襲」、說「我走向吧台」→ WI 因「吧台」注入酒保 NPC → 不滿意就 swipe → 劇情轉折時改場景覆蓋「Alice 恢復了記憶」並 /narrator 暴風雨突然停了。
⚠️ 注意 / 什麼時候不適用
- 越靠近末尾越強,也越容易「搶戲」:AN depth 設太淺(0~1),模型可能每一則都硬塞那個方向,劇情變得刻意;先用預設 4 再調。
- 首條訊息的風格會被放大:開場寫得又長又華麗,後面回覆也會一直又長又華麗;想要短回覆,開場就要短。
- Auto-Swipe 不是嚴格禁止:只是重抽,且可能陷入一直重抽的循環;需要回覆非空才有意義,也會多花生成成本。
- Banned Tokens 只適用 Text Generation 類 API;Chat Completion 類(OpenAI 等)要改用 logit bias 或事後過濾。以單字禁掉 token 也可能誤傷含該 token 的其他字詞。
- 場景覆蓋是 per-chat:改的是這個聊天的 metadata,不會回寫角色卡;想永久改要改卡本身。
- WI 關鍵字觸發只看字面,對話沒提到關鍵字就不會出現——需要語義觸發請見 長期記憶三層架構 的向量化 WI。
🧪 我實際套用的紀錄
- (尚無)
🔗 相關
- Authors Note與深度注入 — AN 與 Depth Prompt 的注入細節
- World Info世界書 — 條件觸發、sticky / cooldown / delay、遞迴
- 提示覆蓋與系統提示預設 — per-chat 覆蓋機制
- 生成類型 — Swipe 與重生成
- 宏系統 —
{{banned}}、{{bias}}等宏 - Prompt設計哲學 — 為什麼越靠近末尾影響越大