🎯 什麼情境該想到我

當你「想控制 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(identifier scenario),位置由 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 NoteDepth 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 TokensAuto-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。

🧪 我實際套用的紀錄

  • (尚無)

🔗 相關