<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.xn--lzsp9b997b.fun/</id>
  <title type="text">莉莉宝</title>
  <subtitle type="text">demo</subtitle>
  <updated>2026-10-26T00:00:00.000Z</updated>
  <author><name>Aalily</name></author>
  <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/"/>
  <link rel="self" href="https://blog.xn--lzsp9b997b.fun/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/about-this-site/</id>
      <title type="text">关于本站</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/about-this-site/"/>
      <summary type="text">这个网站使用 Astro 框架构建，采用了 Firefly 模板，Firefly 是基于 Fuwari 的二次开发。</summary>
      <content type="html"><![CDATA[<section><h2>🛠️ 关于本站<a href="#️-关于本站"><span>#</span></a></h2><p>这个网站使用 <strong>Astro</strong> 框架构建，采用了 <a href="https://github.com/CuteLeaf/Firefly" target="_blank">Firefly</a> 模板，Firefly 是基于 <a href="https://github.com/saicaca/fuwari" target="_blank">Fuwari</a> 的二次开发。</p><p><strong>Firefly</strong> 是一款基于 Astro 框架和 Fuwari 模板开发的清新美观且现代化个人博客主题模板，专为技术爱好者和内容创作者设计。该主题融合了现代 Web 技术栈，提供了丰富的功能模块和高度可定制的界面，让您能够轻松打造出专业且美观的个人博客网站。</p><p><strong>🖥️在线预览： <a href="https://firefly.cuteleaf.cn/" target="_blank">Firefly - Demo site</a></strong></p><p><strong>📝Firefly使用文档： <a href="https://docs-firefly.cuteleaf.cn" target="_blank">https://docs-firefly.cuteleaf.cn</a></strong></p><p><strong>⭐Firefly开源地址：<a href="https://github.com/CuteLeaf/Firefly" target="_blank">https://github.com/CuteLeaf/Firefly</a></strong></p><p><strong>⭐Fuwari开源地址：<a href="https://github.com/saicaca/fuwari" target="_blank">https://github.com/saicaca/fuwari</a></strong></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/advanced-misc/</id>
      <title type="text">进阶技巧</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/advanced-misc/"/>
      <summary type="text">宏、EJS 模板、去 AI 味与内容安全扫描</summary>
      <content type="html"><![CDATA[<section><h2>宏：{{user}} 和 {{char}}<a href="#宏user-和-char"><span>#</span></a></h2><p>宏是写在卡里的占位符。酒馆在<strong>发给 AI 之前</strong>（以及显示消息时）把它们换成实际内容。最常用的是 <code>{{user}}</code> 和 <code>{{char}}</code>。</p></section>
<section><h2>常用宏<a href="#常用宏"><span>#</span></a></h2>

<table><thead><tr><th>宏</th><th>换成什么</th><th>例子</th></tr></thead><tbody><tr><td><code>{{user}}</code></td><td>玩家当前用的名字</td><td>「{{user}}推开门」→「小明推开门」</td></tr><tr><td><code>{{char}}</code></td><td>当前角色的名字</td><td>「{{char}}抬起头」</td></tr><tr><td><code>{{random::晴::雨::雪}}</code></td><td>每次随机取一个</td><td>天气随机</td></tr><tr><td><code>{{pick::晴::雨::雪}}</code></td><td>随机取一个，但同一个聊天里固定不变</td><td>开局随机身份</td></tr><tr><td><code>{{roll::1d20}}</code></td><td>掷骰子</td><td>判定</td></tr><tr><td><code>{{getvar::名字}}</code></td><td>读聊天变量</td><td>好感度</td></tr><tr><td><code>{{time}}</code>、<code>{{date}}</code></td><td>现在的时间、日期</td><td>现实时间问候</td></tr><tr><td><code>{{// 这是注释}}</code></td><td>什么都不输出</td><td>给自己写备注</td></tr></tbody></table><p>MVU 变量卡还会用 <code>{{get_message_variable::stat_data.路径}}</code> 读变量，见 <strong>mvu-statusbar</strong>。</p></section>
<section><h2>为什么一定要用 {{user}}<a href="#为什么一定要用-user"><span>#</span></a></h2><p>角色卡是给所有人用的。如果你在卡里写死「小明」，别人用时 AI 就会管他叫小明。所以：</p><ul>
<li>指代玩家，一律写 <code>{{user}}</code>；</li>
<li>指代角色本身，可以写名字，也可以写 <code>{{char}}</code>。多角色卡（一张卡里好几个人）里 <code>{{char}}</code> 只是卡名，<strong>具体人物还是写名字</strong>更清楚。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>尖括号写法也会被替换</strong>：酒馆把 <code>&lt;USER&gt;</code>、<code>&lt;BOT&gt;</code>、<code>&lt;CHAR&gt;</code>（不分大小写）当成旧式宏，自动换成名字。你在界面代码里写了 <code>&lt;user&gt;</code> 这类标签，会被吃掉，见 <strong>pit-macro-escape</strong>。</li>
<li><strong>反斜杠被去掉</strong>：新版宏引擎会把 <code>\{</code>、<code>\}</code> 前面的反斜杠删掉（这是给「想原样写出双花括号」准备的转义）。代码里的 <code>\{</code> 会变成 <code>{</code>。</li>
<li><strong>花括号连写</strong>：代码里两个花括号紧挨着（比如 <code>{{a:1}}</code> 这种嵌套写法），可能被当成宏处理。中间加个空格最保险。</li>
<li><strong>宏在正则替换结果里也会执行</strong>：正则的「替换为」内容在显示前也会做一次宏替换。</li>
<li><strong>AI 自己写出的 {{user}}</strong>：反过来 AI 输出里出现字面的 <code>{{user}}</code>，通常是卡里示例写法教坏了它。</li>
</ul><hr /></section>
<section><h2>不想被替换的文字被当成了宏<a href="#不想被替换的文字被当成了宏"><span>#</span></a></h2><p><strong>现象</strong>：界面里的 <code>&lt;user&gt;</code> 标签变成了玩家名字；规则里写的「<code>{{user}}</code>」示例被替换掉了；代码里的双花括号莫名其妙变了样。</p></section>
<section><h2>为什么<a href="#为什么"><span>#</span></a></h2><p>酒馆会在很多地方做宏替换：角色描述、开场白、世界书、预设，以及<strong>正则替换后的结果</strong>。除了 <code>{{user}}</code>、<code>{{char}}</code> 这类宏，还有几个老写法也会被替换：</p>

<table><thead><tr><th>写法（不分大小写）</th><th>被替换成</th></tr></thead><tbody><tr><td><code>&lt;USER&gt;</code></td><td>玩家名</td></tr><tr><td><code>&lt;BOT&gt;</code>、<code>&lt;CHAR&gt;</code></td><td>角色名</td></tr><tr><td><code>&lt;GROUP&gt;</code>、<code>&lt;CHARIFNOTGROUP&gt;</code></td><td>群聊成员 / 角色名</td></tr></tbody></table><p>所以界面标签起名叫 <code>&lt;user&gt;</code>、<code>&lt;char&gt;</code>，会被直接换成名字。</p></section>
<section><h2>常见中招场景<a href="#常见中招场景"><span>#</span></a></h2><ul>
<li>让 AI 输出 <code>&lt;User&gt;...&lt;/User&gt;</code> 这样的标签：标签名被换掉，正则匹配不到；</li>
<li>在规则里想给 AI 看「<code>{{user}}</code> 这个写法」：AI 看到的是名字；</li>
<li>界面代码里有双花括号（模板语法、嵌套对象）：可能被当成宏处理；</li>
<li>用了 <code>{{random::...}}</code> 却希望每次结果固定：random 每次都重新抽，固定的要用 <code>{{pick::...}}</code>。</li>
</ul></section>
<section><h2>怎么办<a href="#怎么办"><span>#</span></a></h2><ul>
<li><strong>标签别用这几个名字</strong>：改成 <code>&lt;玩家&gt;</code>、<code>&lt;主角&gt;</code>、<code>&lt;player_info&gt;</code> 等；</li>
<li><strong>想原样显示花括号</strong>：写成 <code>\{\{user\}\}</code>，酒馆会去掉反斜杠，保留花括号；</li>
<li><strong>代码里的双花括号</strong>：中间加个空格，写成 <code>{ {</code> 或拆开写，最保险；</li>
<li><strong>查找规则里有宏</strong>：正则设置里的「正则表达式查找时的宏」决定查找内容里的宏是否先替换，一般选「不替换」。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>只在某些地方被替换</strong>：开场白里被替换、AI 回复里不被替换，同一个标签表现不一致，很难查；</li>
<li><strong>正则替换内容里的宏最后才替换</strong>：替换内容里写 <code>{{user}}</code> 会变成名字，这通常是想要的，但写在代码里就要小心；</li>
<li><strong>未知的宏一般原样保留</strong>：拼错的宏不会报错，只是没效果，检查一下有没有拼错。</li>
</ul><hr /></section>
<section><h2>EJS 模板<a href="#ejs-模板"><span>#</span></a></h2><p>EJS 是一种「带条件的文字」写法：同一个世界书条目，可以根据变量输出不同的内容。比如好感度低时发「她对你很戒备」，高了才发「她开始信任你」。</p></section>
<section><h2>需要什么<a href="#需要什么"><span>#</span></a></h2><p>酒馆本身不认识 EJS，要装<strong>提示词模板</strong>扩展（ST-Prompt-Template）。没装的话，<code>&lt;% %&gt;</code> 会原样发给 AI，既没效果又浪费 token。</p></section>
<section><h2>基本写法<a href="#基本写法"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;% if (getvar('stat_data.沈清.好感度') &gt;= 60) { %&gt;</span></div></div><div><div><div>2</div></div><div><span>沈清已经把{{user}}当成可以托付的人，会主动说起家里的事。</span></div></div><div><div><div>3</div></div><div><span>&lt;% } else { %&gt;</span></div></div><div><div><div>4</div></div><div><span>沈清对{{user}}仍有防备，只谈铺子里的事。</span></div></div><div><div><div>5</div></div><div><span>&lt;% } %&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>&lt;% %&gt;</code> 里写判断，不会输出；</li>
<li>中间的普通文字按条件输出；</li>
<li><code>getvar('路径')</code> 读变量，MVU 卡的变量在 <code>stat_data</code> 下，见 <strong>mvu-schema</strong>。</li>
</ul></section>
<section><h2>适合做什么<a href="#适合做什么"><span>#</span></a></h2><ul>
<li><strong>阶段解锁</strong>：好感度、章节到了才放出的剧情、秘密；</li>
<li><strong>按状态切换描述</strong>：受伤 / 健康、白天 / 夜晚；</li>
<li><strong>省 token</strong>：不满足条件的大段内容根本不发。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>语法错一点，整条报错</strong>：括号、<code>%&gt;</code> 少一个，整条内容都会出问题。改完一定在酒馆里试；</li>
<li><strong>变量路径写错</strong>：路径不存在时读到的是空，条件永远不成立。路径要和变量结构一字不差；</li>
<li><strong>别人没装扩展</strong>：卡用了 EJS，要在创作者注释里写明需要装提示词模板，见 <strong>card-creator-notes</strong>；</li>
<li><strong>简单需求不必用 EJS</strong>：「到第几轮才出现」可以用世界书的延迟，见 <strong>worldbook-timed</strong>。</li>
</ul><hr /></section>
<section><h2>去 AI 味<a href="#去-ai-味"><span>#</span></a></h2><p>「AI 味」就是一读就知道是 AI 写的那种文风。卡里的文字会成为 AI 模仿的范本，所以<strong>卡本身没有 AI 味，聊天时 AI 味才会少</strong>。</p></section>
<section><h2>常见的 AI 味<a href="#常见的-ai-味"><span>#</span></a></h2>

<table><thead><tr><th>毛病</th><th>例子</th></tr></thead><tbody><tr><td>高频套话</td><td>「仿佛」「不禁」「一丝」「嘴角勾起一抹弧度」「眼中闪过一丝」</td></tr><tr><td>比喻堆砌</td><td>一段话三个「像……一样」</td></tr><tr><td>总结升华</td><td>每段结尾都来一句「这一刻，他终于明白了……」</td></tr><tr><td>对话工整</td><td>每个人说话都是完整书面句，没有口头禅、没有打断</td></tr><tr><td>情绪直说</td><td>「她感到非常难过」而不是写她做了什么</td></tr><tr><td>结构八股</td><td>环境描写 → 动作 → 对话 → 心理，每段都一样</td></tr><tr><td>万能温柔</td><td>不管什么人设，最后都变得体贴、包容、治愈</td></tr></tbody></table></section>
<section><h2>怎么去掉<a href="#怎么去掉"><span>#</span></a></h2><ul>
<li><strong>写具体，不写形容词</strong>：「她很冷淡」不如「她看都没看你，把账本翻过一页」；</li>
<li><strong>给说话方式</strong>：口头禅、方言、句子长短、爱不爱用敬语，最好配示例，见 <strong>card-example-dialogue</strong>；</li>
<li><strong>开场白就定好文风</strong>：AI 会模仿开场白的篇幅和写法，开场白写得干净，后面就干净，见 <strong>greeting-forms</strong>；</li>
<li><strong>允许角色有缺点</strong>：冷淡就一直冷淡，不要写「但内心其实很温柔」，除非这是你想要的；</li>
<li><strong>禁词表</strong>：在 App 的设置 →「禁词表」里加词，写卡时会要求模型避开，检查时会统计出现次数。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>禁词加太多</strong>：几百个禁词会让模型束手束脚，写得别扭。只放最刺眼的几十个；</li>
<li><strong>在卡里写「不要有 AI 味」</strong>：模型不知道什么是 AI 味，要说具体的「不要用比喻」「对话用短句」；</li>
<li><strong>反例写进卡里</strong>：「不要写『嘴角勾起一抹弧度』」反而会让模型更容易写出这句。尽量用正面描述。</li>
</ul><hr /></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>把自己的密钥写进卡</strong>：测试时在代码里填了 API 密钥，导出分享就泄露了。扫描会报「疑似 API 密钥」；</li>
<li><strong>远程资源被墙或失效</strong>：CDN 链接在国内可能打不开，见 <strong>pit-cdn</strong>。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/card-writing/</id>
      <title type="text">角色卡编写</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/card-writing/"/>
      <summary type="text">从零写一张高质量角色卡：描述、示例对话、系统提示词与版本格式</summary>
      <content type="html"><![CDATA[<section><h2>创作者注释：写给玩家的说明书<a href="#创作者注释写给玩家的说明书"><span>#</span></a></h2><p>「创作者的注释」是写给<strong>玩家</strong>看的，<strong>不会发给 AI</strong>。玩家导入卡后在角色信息里能看到。好的说明能省掉一大半「怎么用不了」的提问。</p></section>
<section><h2>建议写这些<a href="#建议写这些"><span>#</span></a></h2><ul>
<li><strong>一句话简介</strong>：这张卡玩什么；</li>
<li><strong>需要什么</strong>：要不要酒馆助手、提示词模板等扩展，推荐什么模型；</li>
<li><strong>导入后要做的事</strong>：允许局部正则和脚本、导入世界书、开新聊天；</li>
<li><strong>玩法提示</strong>：有哪些开场白、变量怎么用、有什么隐藏内容；</li>
<li><strong>已知问题</strong>：哪些预设或美化主题会冲突；</li>
<li><strong>版本记录</strong>：改了什么，旧聊天要不要重开。</li>
</ul></section>
<section><h2>一个模板<a href="#一个模板"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>【简介】民国经营 + 慢热恋爱，你扮演沈家铺子新来的账房。</span></div></div><div><div><div>2</div></div><div><span>【需要】酒馆助手（状态栏、选项按钮）。</span></div></div><div><div><div>3</div></div><div><span>【导入后】</span></div></div><div><div><div>4</div></div><div><span>1. 弹窗问是否允许正则、脚本时选「是」；</span></div></div><div><div><div>5</div></div><div><span>2. 弹窗问是否导入世界书时选「是」；</span></div></div><div><div><div>6</div></div><div><span>3. 开新聊天，左右滑动第一条消息可以选开局。</span></div></div><div><div><div>7</div></div><div><span>【推荐】Claude / Gemini，预设不要禁止覆盖主要提示词。</span></div></div><div><div><div>8</div></div><div><span>【更新】v1.1 修复状态栏不显示，请开新聊天。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>把规则写在这里</strong>：这里的内容 AI 看不到，写了也没用；</li>
<li><strong>只写简介不写用法</strong>：玩家最常卡在「允许脚本」和「导入世界书」这两步，一定要写，见 <strong>pit-allow-scripts</strong> 和 <strong>pit-embedded-book</strong>；</li>
<li><strong>用了特殊排版</strong>：不同版本酒馆显示效果不同，用简单的文字和换行最稳。</li>
</ul><hr /></section>
<section><h2>角色描述怎么写<a href="#角色描述怎么写"><span>#</span></a></h2><p>角色描述是卡里<strong>最重要、每轮都发</strong>的部分。它决定 AI 把这个角色演成什么样。</p></section>
<section><h2>该写什么<a href="#该写什么"><span>#</span></a></h2>

<table><thead><tr><th>项目</th><th>写什么</th><th>例子</th></tr></thead><tbody><tr><td>基本信息</td><td>姓名、年龄、身份</td><td>沈清，二十二岁，沈家绸缎庄的大小姐</td></tr><tr><td>外貌</td><td>两三个有辨识度的特征</td><td>总穿旧了的月白旗袍，左手戴一只银镯</td></tr><tr><td>性格</td><td>用行为表现，写清矛盾面</td><td>嘴上刻薄，但伙计生病会偷偷塞钱</td></tr><tr><td>说话方式</td><td>语气、口头禅、句子长短</td><td>说话短，爱用反问；生气时反而更客气</td></tr><tr><td>过去</td><td>只写影响现在行为的部分</td><td>父亲破产后自杀，她不信任任何「好心人」</td></tr><tr><td>和 {{user}} 的关系</td><td>怎么认识、现在怎么看对方</td><td>认为{{user}}是债主派来的眼线</td></tr><tr><td>目标 / 动机</td><td>角色现在想要什么</td><td>想在年底前保住铺子</td></tr></tbody></table></section>
<section><h2>写法建议<a href="#写法建议"><span>#</span></a></h2><ul>
<li><strong>写行为，不写形容词</strong>：「温柔」AI 只会演成万能好人；「会记得你随口说过不吃葱」才是具体的温柔；</li>
<li><strong>写清边界</strong>：她绝对不会做什么？什么话题会让她翻脸？</li>
<li><strong>结构化更稳</strong>：可以用标签包起来的条目式写法，模型更好区分，见 <strong>worldbook-format</strong>；</li>
<li><strong>控制长度</strong>：一般几百到一千多字。更多的背景、配角、地点放进世界书，提到才发。</li>
</ul></section>
<section><h2>描述和世界书怎么分<a href="#描述和世界书怎么分"><span>#</span></a></h2><ul>
<li><strong>描述</strong>：每轮都要用到的核心人设；</li>
<li><strong>世界书</strong>：配角、地点、组织、历史事件等「提到才需要」的内容。</li>
</ul><p>有的卡把人设也全放进世界书（常驻条目），描述留空或只放一句摘要。效果差不多，关键是<strong>不要两边各写一遍</strong>，重复内容既占 token 又可能前后矛盾。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>写成小说</strong>：大段抒情描写对 AI 没用，它需要的是「怎么演」；</li>
<li><strong>用固定名字指代玩家</strong>：一律用 <code>{{user}}</code>，见 <strong>macros</strong>；</li>
<li><strong>自相矛盾</strong>：前面写「从不说谎」，后面写「为了保护家人撒过谎」，AI 会随机选一个演；</li>
<li><strong>全是优点</strong>：没有缺点的角色很无聊，而且 AI 会越演越「圣母」，见 <strong>de-ai</strong>。</li>
</ul><hr /></section>
<section><h2>示例对话<a href="#示例对话"><span>#</span></a></h2><p>示例对话是给 AI 看的「说话样本」：角色在什么情况下会怎么说话。比起在描述里写「说话刻薄」，给两段真实对话效果好得多。</p></section>
<section><h2>格式<a href="#格式"><span>#</span></a></h2><p>每一段以 <code>&lt;START&gt;</code> 开头，下面一行一句，用 <code>{{user}}:</code> 和 <code>{{char}}:</code> 标出谁在说：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;START&gt;</span></div></div><div><div><div>2</div></div><div><span>{{user}}: 账我对完了，去年少了三百块。</span></div></div><div><div><div>3</div></div><div><span>{{char}}: 少了？（她终于抬起头）你知道上一个这么说的人现在在哪吗？</span></div></div><div><div><div>4</div></div><div><span>&lt;START&gt;</span></div></div><div><div><div>5</div></div><div><span>{{user}}: 你吃饭了吗？</span></div></div><div><div><div>6</div></div><div><span>{{char}}: ……关你什么事。（停顿）厨房还有半碗粥，自己去热。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><code>&lt;START&gt;</code> 表示「这是一段新的示例」，酒馆发送时会换成对应的分隔格式。</p></section>
<section><h2>怎么写好<a href="#怎么写好"><span>#</span></a></h2><ul>
<li><strong>覆盖不同情绪</strong>：平时、生气、害羞、示弱，各给一小段；</li>
<li><strong>短而准</strong>：每段两三个来回就够，重点是语气；</li>
<li><strong>写出角色独有的东西</strong>：口头禅、断句方式、爱用的动作；</li>
<li><strong>{{user}} 的台词尽量简单</strong>：示例是给角色立规矩的，玩家的话只是引子。</li>
</ul></section>
<section><h2>什么时候发给 AI<a href="#什么时候发给-ai"><span>#</span></a></h2><p>酒馆的「用户设置 → 聊天/消息处理 → 示例消息行为」有三个选项：</p>

<table><thead><tr><th>选项</th><th>效果</th></tr></thead><tbody><tr><td>逐渐推出（默认）</td><td>上下文够就发；聊天记录长了会把示例挤出去</td></tr><tr><td>始终包含</td><td>一直发</td></tr><tr><td>永不包含</td><td>不发</td></tr></tbody></table><p>所以默认情况下，示例对话<strong>主要影响开头的几十轮</strong>，后面聊天记录本身就成了样本。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>在示例里替 {{user}} 做很多事</strong>：AI 会学着抢话；</li>
<li><strong>示例太长</strong>：占上下文，而且挤掉聊天记录；</li>
<li><strong>写成剧情</strong>：示例里的事件 AI 可能当成「发生过的事」，在聊天里提起。示例要通用，别写具体剧情；</li>
<li><strong>和开场白风格不一致</strong>：AI 会摇摆不定。</li>
</ul><hr /></section>
<section><h2>卡里的系统提示与历史后置指令<a href="#卡里的系统提示与历史后置指令"><span>#</span></a></h2><p>角色卡的「高级定义 → 提示词覆盖」里有两个框：</p><ul>
<li><strong>主要提示词</strong>（卡里的系统提示）：替换预设里的「主要提示词」；</li>
<li><strong>历史后置指令</strong>：替换预设里同名的那一块，它在聊天记录<strong>之后</strong>，离最新消息最近。</li>
</ul></section>
<section><h2>什么情况下会生效<a href="#什么情况下会生效"><span>#</span></a></h2><p>卡里写了主要提示词，酒馆默认会用它替换预设的主要提示词。<strong>但以下任一情况，卡里的就不生效</strong>：</p><ol>
<li>「用户设置 → 角色处理 → 角色卡提示词优先」被关掉了（历史后置指令对应「首选角色卡指令」）；</li>
<li>预设里「主要提示词」这一块勾了 <strong>「禁止覆盖」</strong>；</li>
<li>预设里「主要提示词」这一块被关掉了。</li>
</ol><p>很多流行预设会禁止覆盖或者干脆不用主要提示词，所以<strong>别把关键设定只放在这里</strong>，见 <strong>pit-char-prompt</strong>。</p></section>
<section><h2>保留预设原文<a href="#保留预设原文"><span>#</span></a></h2><p>在卡的主要提示词里写 <code>{{original}}</code>，会在那个位置放回预设原来的主要提示词。这样你可以在预设的基础上追加，而不是整个替换：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{{original}}</span></div></div><div><div><div>2</div></div><div><span>本卡为多人群像，每次回复聚焦一到两个角色。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>适合写什么<a href="#适合写什么"><span>#</span></a></h2><ul>
<li><strong>主要提示词</strong>：这张卡的整体玩法说明，比如「这是一个经营类故事，{{user}}是账房」；</li>
<li><strong>历史后置指令</strong>：短小、每次都必须遵守的要求，比如「回复末尾必须输出 <code>&lt;options&gt;</code> 标签」「不要替{{user}}说话」。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>写太长</strong>：历史后置指令紧贴最新消息，写一大段会严重干扰 AI 的回复；</li>
<li><strong>和预设打架</strong>：预设要求第三人称，卡要求第二人称，AI 会摇摆。卡里明确写出你的要求，并在创作者注释里提示玩家；</li>
<li><strong>把世界观放这里</strong>：设定应该放描述或世界书，这里只放「怎么写」的要求。</li>
</ul><hr /></section>
<section><h2>V2 / V3 卡与 PNG 内嵌<a href="#v2--v3-卡与-png-内嵌"><span>#</span></a></h2><p>角色卡有两种通行格式：V2 和 V3。你平时不用管它们的区别，但遇到「导入失败」「导入后内容不对」时，知道一点会好排查。</p></section>
<section><h2>V2 和 V3<a href="#v2-和-v3"><span>#</span></a></h2><ul>
<li><strong>V2</strong>（格式名 <code>chara_card_v2</code>）：用得最久、最通用。所有内容放在 <code>data</code> 里，卡内世界书叫 <code>character_book</code>。</li>
<li><strong>V3</strong>（格式名 <code>chara_card_v3</code>）：在 V2 基础上扩展，加了资源列表、多语言创作者注释等。新版酒馆都能读。</li>
</ul><p>两者的核心字段（描述、开场白、世界书……）基本一样，V3 卡在不支持它的旧工具里通常也能当 V2 读。</p></section>
<section><h2>PNG 里怎么藏一张卡<a href="#png-里怎么藏一张卡"><span>#</span></a></h2><p>PNG 图片除了像素，还能带「文字附件」（技术上叫文本块）。角色卡把整份内容编码后放进文字附件：</p><ul>
<li>V2 的附件名叫 <code>chara</code>；</li>
<li>V3 的附件名叫 <code>ccv3</code>。</li>
</ul><p>酒馆读卡时<strong>优先读 <code>ccv3</code></strong>，没有才读 <code>chara</code>。酒馆自己保存卡时两个都写。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>图片被压缩，卡就没了</strong>：QQ、微信、很多网盘和图床会「优化」图片，顺手把文字附件删掉。别人收到的只是一张普通头像，导入时报错或变成空卡。发卡时用「原图」或「文件」方式发，或者干脆发 JSON，见 <strong>pit-png-compress</strong>。</li>
<li><strong>两份内容不一致</strong>：有些工具只改了 <code>chara</code> 没改 <code>ccv3</code>，酒馆读的是 <code>ccv3</code>，于是「怎么改了不生效」。用正规工具重新导出一次即可。</li>
<li><strong>用看图软件编辑后保存</strong>：很多修图软件另存时会丢掉文字附件。要换头像，在酒馆里换。</li>
</ul></section>
<section><h2>想确认导出没丢东西<a href="#想确认导出没丢东西"><span>#</span></a></h2><p>卡片页「更多操作」里有 <strong>「往返校验」</strong>：把卡导出再读回来，逐个字段对比，见 <strong>app-export</strong>。</p><hr /></section>
<section><h2>卡片前端是怎么工作的<a href="#卡片前端是怎么工作的"><span>#</span></a></h2><p>聊天里的状态栏、选项按钮、信息面板、彩色对白，统称「卡片前端」。它们<strong>不是 AI 画出来的</strong>，而是酒馆用正则把 AI 输出的文字「换装」成界面。</p></section>
<section><h2>三步原理<a href="#三步原理"><span>#</span></a></h2><ol>
<li><strong>说明条目</strong>（世界书）告诉 AI：什么时候输出什么标签。比如「每次回复末尾，用 <code>&lt;options&gt;</code> 列出三个行动选项」；</li>
<li><strong>显示正则</strong>把消息里的标签替换成一段界面代码。简单的直接是带样式的文字；复杂的是一个 HTML 代码块，由酒馆助手渲染成消息里的小网页；</li>
<li><strong>清理正则</strong>把这些标签从发给 AI 的聊天记录里删掉。不删的话浪费 token，AI 还会越写越乱。</li>
</ol><p>所以一个前端功能通常由「一条说明条目 + 一条显示正则 + 一条清理正则」组成。</p></section>
<section><h2>两种渲染方式<a href="#两种渲染方式"><span>#</span></a></h2>

<table><thead><tr><th>方式</th><th>是什么</th><th>需要什么</th></tr></thead><tbody><tr><td>直接替换成 HTML</td><td>正则把标签换成带样式的文字，酒馆直接显示</td><td>只要允许这张卡的正则</td></tr><tr><td>HTML 代码块</td><td>正则换成一个包含完整网页的代码块，酒馆助手把它渲染成小窗口</td><td>还要装酒馆助手，并且开着「启用渲染器」</td></tr></tbody></table><p>酒馆助手只渲染<strong>内容里含有 <code>&lt;html</code>、<code>&lt;head&gt;</code> 或 <code>&lt;body</code> 的代码块</strong>。代码块里没有这些标记，它就原样显示成代码。</p></section>
<section><h2>几点常识<a href="#几点常识"><span>#</span></a></h2><ul>
<li><strong>只改颜色不需要 HTML</strong>：对白、动作、心理用不同颜色，正则直接套样式就行，见 <strong>regex-groups</strong>；</li>
<li><strong>按钮通常是「填进输入框」</strong>：让玩家确认后再发，直接发送容易误触；</li>
<li><strong>面板要有数据来源</strong>：MVU 变量（<code>stat_data</code>）、文字状态栏或酒馆变量，见 <strong>mvu-statusbar</strong>；</li>
<li><strong>开局界面放在开场白里</strong>：开场白写一个占位标签，正则换成表单，玩家选完拼成第一句话；</li>
<li><strong>预览 ≠ 酒馆</strong>：App 里的预览是模拟的，酒馆还会受显示设置、其他扩展、美化主题影响，一定要实测。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-5"><span>#</span></a></h2><ul>
<li><strong>什么都不显示</strong>：多半是没允许这张卡的正则或脚本，见 <strong>pit-allow-scripts</strong>；</li>
<li><strong>显示成一堆代码</strong>：可能是代码块缺了 <code>&lt;body&gt;</code> 之类的标记，或者开了「在响应中显示标签」，见 <strong>pit-show-tags</strong>；</li>
<li><strong>排版错乱、多出空行</strong>：酒馆会把消息当 Markdown 处理，HTML 里的缩进和空行会出问题，见 <strong>pit-markdown-html</strong>；</li>
<li><strong>脚本报语法错误</strong>：代码里的 <code>&amp;#39;</code> 这类写法被酒馆提前还原了，见 <strong>pit-code-entity</strong>；</li>
<li><strong>旧消息里的界面不见了</strong>：酒馆助手有「渲染深度」，超过的楼层不渲染，这是正常的；</li>
<li><strong>网络图片不显示</strong>：酒馆默认禁止外部媒体，见 <strong>pit-external-media</strong>。</li>
</ul><hr /></section>
<section><h2>开场白怎么写<a href="#开场白怎么写"><span>#</span></a></h2><p>开场白是聊天的第一条消息。它的作用远不止「打个招呼」：<strong>AI 会照着开场白的文风、人称、篇幅往下写</strong>。开场白写成什么样，后面的聊天大概就是什么样。</p></section>
<section><h2>四种常见形态<a href="#四种常见形态"><span>#</span></a></h2><ol>
<li><strong>场景切入</strong>：直接从一个画面开始，最常见。「雨下了三天，沈家铺子的门板只卸了一半……」</li>
<li><strong>对话开头</strong>：角色先开口，一句话带出关系。「『新来的账房？』她没抬头，『先把去年的账对了。』」</li>
<li><strong>信件 / 文档</strong>：日记、短信、委托书，用文本交代背景，适合悬疑和群像；</li>
<li><strong>多选开局</strong>：列出几个身份或开局让玩家选，常配合开局表单界面。</li>
</ol></section>
<section><h2>写好开场白的要点<a href="#写好开场白的要点"><span>#</span></a></h2><ul>
<li><strong>从具体场景开始</strong>：时间、地点、正在发生什么，比一段背景介绍强；</li>
<li><strong>给 {{user}} 留出行动空间</strong>：结尾停在一个需要玩家回应的点上，比如一个问题、一个选择、一个突发事件；</li>
<li><strong>不要替 {{user}} 说话或做决定</strong>：「你点点头，决定留下」会让玩家出戏，AI 也会学着抢话；</li>
<li><strong>篇幅就是示范</strong>：想要 AI 每次回三四百字，开场白就写三四百字；</li>
<li><strong>人称要和你想要的一致</strong>：开场白用第二人称「你」，AI 后面多半也用「你」。</li>
</ul></section>
<section><h2>备选开场白<a href="#备选开场白"><span>#</span></a></h2><p>一张卡可以有很多条开场白，玩家在聊天第一条消息上左右滑动切换。用途：</p><ul>
<li>不同开局（初遇 / 重逢 / 敌对）；</li>
<li>不同路线、不同时间点；</li>
<li>MVU 卡可以给每条开场白配不同的初始变量，见 <strong>mvu-initvar</strong>。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-6"><span>#</span></a></h2><ul>
<li><strong>改了开场白，旧聊天不变</strong>：开场白只在新开聊天时用，见 <strong>pit-old-chat</strong>；</li>
<li><strong>开场白里写设定说明</strong>：「（本卡设定：……）」这类话 AI 会以为是文风的一部分，说明请放创作者注释；</li>
<li><strong>太长</strong>：开场白也算聊天记录，太长会一直占上下文；</li>
<li><strong>重写开场白后界面没了</strong>：开局表单靠开场白里的占位标签，重写时别把它删掉。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/mvu-guide/</id>
      <title type="text">MVU 变量系统</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/mvu-guide/"/>
      <summary type="text">MVU 安装、Schema、initvar、JSONPatch、状态栏与变量更新规则全解</summary>
      <content type="html"><![CDATA[<section><h2>MVU 是什么<a href="#mvu-是什么"><span>#</span></a></h2><p>MVU（MagVarUpdate）是运行在酒馆助手上的<strong>变量框架</strong>。有了它，角色卡能「记住」好感度、金钱、时间、位置、物品这些数值和状态，而不是全靠 AI 从聊天记录里猜。</p></section>
<section><h2>没有变量会怎样<a href="#没有变量会怎样"><span>#</span></a></h2><p>AI 只能从聊天记录推断状态。聊久了，旧消息被挤出上下文，AI 就忘了「现在几点」「身上还有多少钱」，数值也会前后矛盾。</p><p>有了 MVU，状态被<strong>明确存起来</strong>，每轮都告诉 AI 当前是多少，AI 只需要说「变了多少」。</p></section>
<section><h2>一轮是怎么跑的<a href="#一轮是怎么跑的"><span>#</span></a></h2><ol>
<li><strong>开局</strong>：MVU 读取初始变量，存进第一条消息，见 <strong>mvu-initvar</strong>；</li>
<li><strong>发给 AI</strong>：常驻条目把当前变量和更新规则发给 AI，见 <strong>mvu-update-rules</strong>；</li>
<li><strong>AI 回复</strong>：正文写完后，末尾输出一段更新命令，见 <strong>mvu-jsonpatch</strong>；</li>
<li><strong>MVU 处理</strong>：读出命令，算出新变量，存到这一条消息上（存的位置叫 <code>stat_data</code>）；</li>
<li><strong>显示</strong>：状态栏读变量，显示在消息里，见 <strong>mvu-statusbar</strong>。</li>
</ol><p>变量是<strong>按楼层存</strong>的：每条 AI 消息都带着那一刻的变量。所以删掉、重新生成一条消息，变量会跟着回到上一楼的状态。</p></section>
<section><h2>需要什么<a href="#需要什么"><span>#</span></a></h2><ul>
<li>酒馆装了<strong>酒馆助手</strong>扩展；</li>
<li>卡里带着 MVU 脚本，并且导入时允许了脚本；</li>
<li>能访问 MVU 脚本所在的网络地址。</li>
</ul><p>详细见 <strong>mvu-install</strong>。</p></section>
<section><h2>两种写法<a href="#两种写法"><span>#</span></a></h2><p>zod 版（有变量结构校验）和经典版（没有校验），见 <strong>mvu-zod-vs-classic</strong>。</p></section>
<section><h2>适合什么卡<a href="#适合什么卡"><span>#</span></a></h2><ul>
<li>恋爱养成（好感度、关系阶段）；</li>
<li>经营、冒险（金钱、物品、属性）；</li>
<li>长篇剧情（时间、地点、章节、任务进度）。</li>
</ul><p>只是聊天陪伴、没有数值玩法的卡，不需要 MVU，加了反而让 AI 每轮多写一段命令。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>变量太多</strong>：几十个变量，AI 每轮都要分析一遍，又慢又容易错，见 <strong>mvu-design</strong>；</li>
<li><strong>状态栏一直「正在读取变量」</strong>：多半是脚本没启用或加载失败，见 <strong>mvu-errors</strong>；</li>
<li><strong>改了初始变量旧聊天没变</strong>：初始变量只在开局读一次，见 <strong>pit-old-chat</strong>。</li>
</ul><hr /></section>
<section><h2>MVU 卡在酒馆里跑起来需要什么<a href="#mvu-卡在酒馆里跑起来需要什么"><span>#</span></a></h2><p>MVU 卡比普通卡多依赖几样东西。缺一样，变量就不动、状态栏就不出来。</p></section>
<section><h2>1. 装酒馆助手<a href="#1-装酒馆助手"><span>#</span></a></h2><p>酒馆顶部「扩展程序」→「安装扩展程序」，填入酒馆助手的仓库地址：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://github.com/N0VI028/JS-Slash-Runner</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>装好后刷新页面，扩展面板里出现「酒馆助手」，确认它是开着的。</p></section>
<section><h2>2. 导入卡时允许脚本和正则<a href="#2-导入卡时允许脚本和正则"><span>#</span></a></h2><p>导入 MVU 卡后会弹两个窗口：</p><ul>
<li>酒馆的「是否启用局部正则」：选是；</li>
<li>酒馆助手的「角色卡中包含酒馆助手可用的嵌入式脚本，是否现在就启用它们?」：选是。</li>
</ul><p>点错了也能补救，见 <strong>pit-allow-scripts</strong>。</p></section>
<section><h2>3. 网络能访问脚本地址<a href="#3-网络能访问脚本地址"><span>#</span></a></h2><p>MVU 本体和变量结构工具不在卡里，卡里只有一行「去这个地址加载」。地址一般在 jsdelivr 上，加载失败 MVU 就不工作，见 <strong>pit-cdn</strong>。</p></section>
<section><h2>4. 开新聊天<a href="#4-开新聊天"><span>#</span></a></h2><p>MVU 在聊天开始时读取初始变量。旧聊天、没有 MVU 时开的聊天，变量是空的。</p></section>
<section><h2>检查是否跑起来了<a href="#检查是否跑起来了"><span>#</span></a></h2><ul>
<li>输入框上方出现「重新处理变量」等按钮：MVU 脚本已加载；</li>
<li>发一条消息，AI 回复末尾有更新命令，状态栏数值变了：整套都通了；</li>
<li>酒馆助手的「角色脚本库」里能看到 MVU 和变量结构脚本，且是启用状态。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>酒馆助手版本太旧</strong>：MVU 需要较新的酒馆助手，扩展面板里点更新；</li>
<li><strong>用了手机上的精简版酒馆</strong>：有的第三方客户端不支持酒馆助手，MVU 卡无法使用；</li>
<li><strong>脚本被关</strong>：酒馆助手设置里脚本总开关、角色脚本开关都要开着。</li>
</ul><hr /></section>
<section><h2>变量结构（zod Schema）<a href="#变量结构zod-schema"><span>#</span></a></h2><p>zod 版 MVU 卡多一个「变量结构」脚本，规定每个变量<strong>是什么类型、取值范围、默认值</strong>。每次 AI 更新变量后，MVU 都按它校验，写错的会被修正或拦下。</p></section>
<section><h2>长什么样<a href="#长什么样"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const Schema = z.object({</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>沈清: z.object({</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>好感度: z.coerce.number().transform(v =&gt; _.clamp(v, 0, 100)).prefault(20),</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>当前心情: z.string().prefault('戒备'),</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}).prefault({}),</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>主角: z.object({</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>金钱: z.coerce.number().prefault(0),</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>背包: z.array(z.string()).prefault([]),</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}).prefault({}),</span></div></div><div><div><div>10</div></div><div><span>})</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>常用写法<a href="#常用写法"><span>#</span></a></h2>

<table><thead><tr><th>写法</th><th>作用</th></tr></thead><tbody><tr><td><code>z.object({...})</code></td><td>一组变量</td></tr><tr><td><code>z.coerce.number()</code></td><td>数字；AI 写成 “12” 这样的文字也能转成数字</td></tr><tr><td><code>z.string()</code></td><td>文字</td></tr><tr><td><code>z.boolean()</code></td><td>真假</td></tr><tr><td><code>z.array(...)</code></td><td>列表</td></tr><tr><td><code>z.enum(['上午','下午','夜晚'])</code></td><td>只能是这几个值之一</td></tr><tr><td><code>.transform(v =&gt; _.clamp(v, 0, 100))</code></td><td>超出范围自动拉回 0～100</td></tr><tr><td><code>.prefault(值)</code></td><td>缺这个变量时用的默认值</td></tr></tbody></table></section>
<section><h2>只读变量<a href="#只读变量"><span>#</span></a></h2><p>以 <code>_</code> 开头的变量约定为只读，更新规则会告诉 AI 不要改，比如 <code>_最大体力</code>。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>结构和初始变量对不上</strong>：初始变量里有、结构里没有的键，可能被丢掉；</li>
<li><strong>用了 <code>z.number()</code> 不带 coerce</strong>：AI 偶尔写成字符串就校验失败；</li>
<li><strong>范围太严</strong>：比如心情用 enum 只给三个值，AI 写了第四种就被拦下，变量不更新；</li>
<li><strong>脚本没启用</strong>：变量结构脚本没开，校验和默认值都不生效，见 <strong>mvu-install</strong>。</li>
</ul><hr /></section>
<section><h2>初始变量 InitVar<a href="#初始变量-initvar"><span>#</span></a></h2><p>初始变量就是<strong>开局时变量的值</strong>。MVU 在聊天开始时读取它，存进第一条消息。</p></section>
<section><h2>写在哪<a href="#写在哪"><span>#</span></a></h2><p>一条世界书条目，标题里带 <code>[initvar]</code>，内容用 YAML 写：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>沈清:</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>好感度: 20</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>当前心情: 戒备</span></div></div><div><div><div>4</div></div><div><span>主角:</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>金钱: 300</span></div></div><div><div><div>6</div></div><div><span>世界:</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>时间: 第一天 上午</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>这条条目通常是<strong>禁用</strong>的：它只给 MVU 读，不需要发给 AI；</li>
<li>YAML 用<strong>空格</strong>缩进，同一层对齐，冒号后面有空格。</li>
</ul></section>
<section><h2>不同开场白，不同开局<a href="#不同开场白不同开局"><span>#</span></a></h2><p>开场白里可以写一段 <code>&lt;initvar&gt;</code> 块，只写需要不同的部分，覆盖条目里的初始值：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;initvar&gt;</span></div></div><div><div><div>2</div></div><div><span>世界:</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>时间: 第三天 夜晚</span></div></div><div><div><div>4</div></div><div><span>沈清:</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>好感度: 50</span></div></div><div><div><div>6</div></div><div><span>&lt;/initvar&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这样「初遇」和「重逢」两条开场白，就有各自的初始好感度。</p></section>
<section><h2>zod 版和经典版的区别<a href="#zod-版和经典版的区别"><span>#</span></a></h2><ul>
<li>zod 版：只写纯值，缺的键由变量结构的默认值补上，见 <strong>mvu-schema</strong>；</li>
<li>经典版：可以写成 <code>[值, "说明"]</code> 的形式，说明会一起给 AI 看。</li>
</ul></section>
<section><h2>改了初始变量怎么生效<a href="#改了初始变量怎么生效"><span>#</span></a></h2><ul>
<li><strong>新开聊天</strong>：自动用新的初始变量；</li>
<li><strong>旧聊天</strong>：点输入框上方的「重新读取初始变量」按钮，或开新聊天，见 <strong>pit-old-chat</strong>。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>用了 Tab 缩进</strong>：YAML 不认 Tab，解析失败；</li>
<li><strong>冒号是全角的</strong>：「好感度：20」解析不出来，要用半角冒号；</li>
<li><strong>数字写成了文字</strong>：<code>好感度: 二十</code> 不是数字，后面的加减就会出错；</li>
<li><strong>初始变量和变量结构对不上</strong>：zod 版会按结构校验，名字差一个字就会被丢掉或报错。</li>
</ul><hr /></section>
<section><h2>JSONPatch 与 _.set<a href="#jsonpatch-与-_set"><span>#</span></a></h2><p>AI 每轮在回复末尾输出一段<strong>更新命令</strong>，告诉 MVU 哪些变量变了。现在推荐的写法是 JSONPatch。</p></section>
<section><h2>完整的样子<a href="#完整的样子"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;UpdateVariable&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;Analysis&gt;</span></div></div><div><div><div>3</div></div><div><span>- time passed: half a day</span></div></div><div><div><div>4</div></div><div><span>- 沈清.好感度: user helped with accounts, +3</span></div></div><div><div><div>5</div></div><div><span>&lt;/Analysis&gt;</span></div></div><div><div><div>6</div></div><div><span>&lt;JSONPatch&gt;</span></div></div><div><div><div>7</div></div><div><span>[</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>{ "op": "delta", "path": "/沈清/好感度", "value": 3 },</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>{ "op": "replace", "path": "/世界/时间", "value": "第一天 下午" }</span></div></div><div><div><div>10</div></div><div><span>]</span></div></div><div><div><div>11</div></div><div><span>&lt;/JSONPatch&gt;</span></div></div><div><div><div>12</div></div><div><span>&lt;/UpdateVariable&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li><code>&lt;Analysis&gt;</code>：AI 先分析哪些变量该变，提高准确率；</li>
<li><code>&lt;JSONPatch&gt;</code>：真正的命令，一个 JSON 数组。</li>
</ul></section>
<section><h2>操作<a href="#操作"><span>#</span></a></h2>

<table><thead><tr><th>op</th><th>作用</th><th>例子</th></tr></thead><tbody><tr><td>replace</td><td>设成新值</td><td>时间改成「下午」</td></tr><tr><td>delta</td><td>数字加减，负数是减</td><td>金钱 -50</td></tr><tr><td>insert</td><td>加一个新键，或往列表里加一项</td><td>背包里加「钥匙」</td></tr><tr><td>remove</td><td>删掉一个键或列表里的一项</td><td>用掉了「钥匙」</td></tr><tr><td>move</td><td>把一个值挪到另一个路径</td><td>物品从背包移到仓库</td></tr></tbody></table></section>
<section><h2>path 怎么写<a href="#path-怎么写"><span>#</span></a></h2><ul>
<li>以 <code>/</code> 开头，一级一级写变量名：<code>/沈清/好感度</code>；</li>
<li>列表用数字下标，从 0 开始：<code>/主角/背包/0</code>；</li>
<li>往列表末尾追加用 <code>-</code>：<code>/主角/背包/-</code>。</li>
</ul></section>
<section><h2>老写法 _.set<a href="#老写法-_set"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>_.set('沈清.好感度', 20, 23);//帮忙对账</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>意思是「从 20 改成 23」。还能用，但容易写错，新卡建议用 JSONPatch。注意结尾的分号不能少。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>JSON 格式错</strong>：少逗号、多逗号、用了中文引号，整段命令都会失败；</li>
<li><strong>path 和变量名不一致</strong>：多一个字、少一个字都找不到；</li>
<li><strong>delta 用在文字上</strong>：只有数字能加减；</li>
<li><strong>每轮都输出所有变量</strong>：没变的不要写，规则里要强调「只写有变化的」；</li>
<li><strong>命令留在历史里</strong>：旧楼层的命令要用正则从发给 AI 的历史里删掉，否则又长又干扰，见 <strong>mvu-regex</strong>。</li>
</ul><hr /></section>
<section><h2>更新规则 [mvu_update]<a href="#更新规则-mvu_update"><span>#</span></a></h2><p>更新规则告诉 AI <strong>每个变量什么时候变、变多少</strong>。它是一条常驻的世界书条目，标题常带 <code>[mvu_update]</code>。规则写得越具体，AI 改得越稳。</p></section>
<section><h2>一个好规则的样子<a href="#一个好规则的样子"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>变量更新规则:</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>沈清.好感度:</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>范围: 0~100</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>含义: 0~30 戒备，31~60 熟悉，61~85 信任，86 以上 依赖</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>增加: 被认真倾听、帮她解决铺子的麻烦 +1~3</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>减少: 被敷衍、被冒犯、提起她父亲 -2~5</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>check: 只看本轮发生的事，单轮变化不超过 5</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>世界.时间:</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>格式: 第N天 上午/下午/夜晚</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>check: 按剧情推进，睡觉后进入下一天</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>每个变量写清这几件事<a href="#每个变量写清这几件事"><span>#</span></a></h2>

<table><thead><tr><th>项目</th><th>为什么</th></tr></thead><tbody><tr><td>范围</td><td>防止越界</td></tr><tr><td>含义</td><td>让 AI 知道数值对应的状态，演得出差别</td></tr><tr><td>增加 / 减少的条件</td><td>什么事件会改变它</td></tr><tr><td>幅度</td><td>防止一轮涨爆</td></tr><tr><td>格式</td><td>文字类变量要写清格式，不然每次写法都不一样</td></tr></tbody></table></section>
<section><h2>配套的几条条目<a href="#配套的几条条目"><span>#</span></a></h2><ul>
<li><strong>变量列表</strong>：常驻，每轮把当前变量值发给 AI；</li>
<li><strong>输出格式</strong>：常驻，规定 AI 用 JSONPatch 输出，见 <strong>mvu-jsonpatch</strong>；</li>
<li><strong>剧情推进</strong>：按变量解锁内容，见 <strong>mvu-plot</strong>。</li>
</ul><p>这几条最好放在 @D 浅深度，或者顺序设大，保证不被预算挤掉。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-5"><span>#</span></a></h2><ul>
<li><strong>只写「根据剧情变化」</strong>：AI 不知道该变多少，要么不变，要么乱变；</li>
<li><strong>增加条件太宽</strong>：「互动时 +1」等于每轮都加；</li>
<li><strong>规则被预算挤掉</strong>：常驻条目也可能被挤掉，变量就不更新了，见 <strong>worldbook-budget</strong>；</li>
<li><strong>规则和状态栏用的名字不同</strong>：规则里叫「好感」，状态栏读「好感度」，永远显示初始值。</li>
</ul><hr /></section>
<section><h2>全自动<a href="#全自动"><span>#</span></a></h2><p>先设计变量表，再依次写变量结构、初始变量、更新规则、状态栏，<strong>全部直接写进卡</strong>，中间不停。适合想快速出一个能玩的版本。</p></section>
<section><h2>半自动<a href="#半自动"><span>#</span></a></h2><p>变量表、规则、状态栏写完后<strong>先停下给你确认</strong>：在清单里点开看、可以改，满意再采用，见 <strong>app-drafts</strong>。变量结构和初始变量直接由变量表生成，不再问模型。适合变量多、想每步把关。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-6"><span>#</span></a></h2><ul>
<li><strong>改了变量名，规则没跟着改</strong>：改名后跑一次检查；</li>
<li><strong>按表重新生成会覆盖手改的部件</strong>：先确认再生成；</li>
<li><strong>模拟通过 ≠ 酒馆能跑</strong>：酒馆里还要看脚本和网络，见 <strong>mvu-install</strong>。</li>
</ul><hr /></section>
<section><h2>状态栏与 <a href="#状态栏与-"><span>#</span></a></h2><p>状态栏是显示在 AI 回复末尾、展示当前变量的小面板。</p></section>
<section><h2>怎么出来的<a href="#怎么出来的"><span>#</span></a></h2><ol>
<li>每条 AI 回复末尾都有一个占位 <code>&lt;StatusPlaceHolderImpl/&gt;</code>（MVU 会自动补上）；</li>
<li>「状态栏」正则把占位替换成一段 HTML 代码块（仅影响显示）；</li>
<li>酒馆助手把代码块渲染成一个小网页；</li>
<li>小网页里的脚本等 MVU 准备好后，读取这一楼的变量，填进界面。</li>
</ol><p>所以状态栏刚出来时会先显示「正在读取变量……」，一两秒后变成真实数值。</p></section>
<section><h2>两种状态栏<a href="#两种状态栏"><span>#</span></a></h2>

<table><thead><tr><th>类型</th><th>原理</th><th>优点</th><th>需要</th></tr></thead><tbody><tr><td>网页状态栏</td><td>代码块 + 脚本读变量</td><td>好看、能做进度条和标签页</td><td>酒馆助手</td></tr><tr><td>文字状态栏</td><td>正则直接用宏显示变量</td><td>简单、不依赖脚本渲染</td><td>只要正则</td></tr></tbody></table><p>文字状态栏里用 <code>{{get_message_variable::stat_data.沈清.好感度}}</code> 这样的宏读值。</p></section>
<section><h2>开场白也要有占位<a href="#开场白也要有占位"><span>#</span></a></h2><p>开场白（第 0 楼）末尾也要写 <code>&lt;StatusPlaceHolderImpl/&gt;</code>，否则第一屏没有状态栏。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-7"><span>#</span></a></h2><ul>
<li><strong>一直显示「正在读取变量」</strong>：MVU 没加载起来。检查酒馆助手和脚本是否启用、网络能否访问脚本地址，见 <strong>mvu-errors</strong>；</li>
<li><strong>显示一堆代码</strong>：酒馆助手没装或「启用渲染器」没开；</li>
<li><strong>状态栏脚本报语法错误</strong>：酒馆会把代码里的 <code>&amp;#39;</code> 这类写法提前还原，破坏代码，见 <strong>pit-code-entity</strong>；</li>
<li><strong>旧楼层的状态栏消失了</strong>：酒馆助手的「渲染深度」限制了只渲染最近几楼，这是为了性能，正常现象；</li>
<li><strong>数值一直是初始值</strong>：状态栏读的路径和变量名对不上，或 AI 没有输出更新命令。</li>
</ul><hr /></section>
<section><h2>MVU 的五条正则<a href="#mvu-的五条正则"><span>#</span></a></h2><p>MVU 卡通常带这几条正则，分工明确：</p>

<table><thead><tr><th>正则</th><th>作用</th><th>选项</th></tr></thead><tbody><tr><td>状态栏</td><td>把消息末尾的占位换成状态栏界面</td><td>仅影响显示</td></tr><tr><td>隐藏占位</td><td>发给 AI 时去掉占位</td><td>仅影响后端提示词</td></tr><tr><td>隐藏更新命令</td><td>发给 AI 时去掉历史里的更新命令</td><td>仅影响后端提示词</td></tr><tr><td>折叠更新（生成中）</td><td>显示时把正在输出的命令折起来</td><td>仅影响显示</td></tr><tr><td>折叠更新（已完成）</td><td>显示时把命令折成可展开的小块</td><td>仅影响显示</td></tr></tbody></table></section>
<section><h2>为什么要隐藏旧命令<a href="#为什么要隐藏旧命令"><span>#</span></a></h2><p>每条 AI 回复末尾都有一段更新命令，聊几十轮就是几十段。全发给 AI：</p><ul>
<li>浪费大量 token；</li>
<li>AI 会模仿旧命令，把过时的值抄回来。</li>
</ul><p>有的卡会把历史里的更新命令全部删掉（也有卡用最大深度只处理最近几楼）。当前变量已经由变量列表条目每轮发给 AI，不需要靠历史。</p></section>
<section><h2>为什么要折叠<a href="#为什么要折叠"><span>#</span></a></h2><p>更新命令是给程序看的，玩家看到一大段 JSON 很出戏。折叠后玩家想看可以点开。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-8"><span>#</span></a></h2><ul>
<li><strong>状态栏正则两个选项都没勾</strong>：占位被永久替换成 HTML，见 <strong>pit-regex-scope</strong>；</li>
<li><strong>隐藏命令的正则勾了「仅影响显示」</strong>：命令只是看不见，照样全部发给 AI；</li>
<li><strong>局部正则没被允许</strong>：状态栏不出来、命令全露在外面，见 <strong>pit-allow-scripts</strong>；</li>
<li><strong>正则标签名改了</strong>：输出格式里的标签和正则里的标签必须一致。</li>
</ul><hr /></section>
<section><h2>[mvu_plot]：剧情推进条目<a href="#mvu_plot剧情推进条目"><span>#</span></a></h2><p>标题带 <code>[mvu_plot]</code> 的条目放「根据变量推进剧情」的内容。变量只是数字，剧情推进条目让数字<strong>真正改变故事</strong>。</p></section>
<section><h2>能做什么<a href="#能做什么"><span>#</span></a></h2><ul>
<li><strong>阶段解锁</strong>：好感度到 60，沈清开始讲家里的事；</li>
<li><strong>事件触发</strong>：金钱低于 0，债主上门；</li>
<li><strong>结局分支</strong>：信任和好感都高，进入好结局路线。</li>
</ul></section>
<section><h2>两种写法<a href="#两种写法-1"><span>#</span></a></h2><section><h3>写给 AI 自己判断<a href="#写给-ai-自己判断"><span>#</span></a></h3><p>不需要额外扩展，直接写清条件，让 AI 看着当前变量决定：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>剧情推进:</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>- 当 沈清.好感度 &gt;= 60 且尚未发生时，安排她主动提起父亲的死</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>- 当 主角.金钱 &lt; 0 时，下一个场景债主上门</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>简单可靠，但 AI 偶尔会忘记或提前触发。</p></section><section><h3>用 EJS 按条件输出<a href="#用-ejs-按条件输出"><span>#</span></a></h3><p>装了提示词模板扩展后，可以用 EJS 让不满足条件的内容根本不发出去，见 <strong>ejs</strong>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;% if (getvar('stat_data.沈清.好感度') &gt;= 60) { %&gt;</span></div></div><div><div><div>2</div></div><div><span>沈清已经信任{{user}}，会在深夜主动说起父亲的事。</span></div></div><div><div><div>3</div></div><div><span>&lt;% } %&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>更精准、更省 token，但玩家必须装扩展。</p></section></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-9"><span>#</span></a></h2><ul>
<li><strong>条件一直满足，事件反复发生</strong>：要写「尚未发生时」，或者加一个真假变量记录「已发生」；</li>
<li><strong>EJS 卡没说明要装扩展</strong>：玩家没装就会看到 AI 收到一堆 <code>&lt;%</code> 代码；</li>
<li><strong>只靠时间推进</strong>：想要「第几轮后才出现」，世界书的「延迟」更简单，见 <strong>worldbook-timed</strong>。</li>
</ul><hr /></section>
<section><h2>变量怎么设计<a href="#变量怎么设计"><span>#</span></a></h2><p>变量设计好了，后面的规则、状态栏都顺；设计乱了，AI 改错、状态栏对不上、检查报一堆错。动手前花几分钟想清楚。</p></section>
<section><h2>先问：这个数值会推动玩法吗<a href="#先问这个数值会推动玩法吗"><span>#</span></a></h2><p>只做<strong>会影响剧情或玩法</strong>的变量：</p><ul>
<li>好感度到 60 解锁新剧情：要做；</li>
<li>金钱不够买不了东西：要做；</li>
<li>「今天穿什么衣服」只是描写：一般不用做，让 AI 自由发挥。</li>
</ul><p>一张卡 5～15 个变量比较合适。超过 20 个，AI 每轮分析都很吃力。</p></section>
<section><h2>按对象分组<a href="#按对象分组"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>沈清:</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>好感度: 20</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>信任: 10</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>当前心情: 戒备</span></div></div><div><div><div>5</div></div><div><span>主角:</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>金钱: 300</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>体力: 100</span></div></div><div><div><div>8</div></div><div><span>世界:</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>日期: 民国二十三年 三月初一</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>时间: 上午</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>地点: 沈家铺子</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>第一层是「谁」或「什么」：角色名、主角、世界；</li>
<li>第二层是具体的值；</li>
<li>层级别超过三层。</li>
</ul></section>
<section><h2>命名<a href="#命名"><span>#</span></a></h2><ul>
<li><strong>用中文、用聊天里会说的词</strong>：「好感度」比「affection_lv」更容易让 AI 写对；</li>
<li><strong>一个名字一个意思</strong>：别同时有「好感」和「好感度」；</li>
<li><strong>以 <code>_</code> 开头表示只读</strong>：比如 <code>_最大体力</code>，规则会告诉 AI 不要改。</li>
</ul></section>
<section><h2>类型怎么选<a href="#类型怎么选"><span>#</span></a></h2>

<table><thead><tr><th>类型</th><th>适合</th><th>注意</th></tr></thead><tbody><tr><td>数字</td><td>好感度、金钱、体力</td><td>写清范围，比如 0～100</td></tr><tr><td>文字</td><td>心情、地点、时间</td><td>写清可选值或格式，比如「上午 / 下午 / 夜晚」</td></tr><tr><td>真假</td><td>是否已结识、任务是否完成</td><td>写清什么时候变</td></tr><tr><td>列表</td><td>背包物品、已知线索</td><td>写清怎么加、怎么删</td></tr></tbody></table></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-10"><span>#</span></a></h2><ul>
<li><strong>数值没有含义</strong>：好感度 47 和 52 有什么区别？在规则里写清楚每个区间代表什么，见 <strong>mvu-update-rules</strong>；</li>
<li><strong>涨得太快</strong>：没写增减幅度，AI 一轮给 +20，几轮就满了；</li>
<li><strong>改名字没改全</strong>：初始变量、规则、状态栏三处都要改；</li>
<li><strong>把剧情写成变量</strong>：「剧情摘要」这种大段文字放变量里，每轮都改，又贵又乱。</li>
</ul><hr /></section>
<section><h2>MVU 常见报错与排查<a href="#mvu-常见报错与排查"><span>#</span></a></h2><p>MVU 卡出问题，按「从外到内」查：先看框架有没有跑起来，再看 AI 有没有输出命令，最后看命令对不对。</p></section>
<section><h2>状态栏一直「正在读取变量……」<a href="#状态栏一直正在读取变量"><span>#</span></a></h2><p>MVU 本体没加载起来。依次检查：</p><ol>
<li>酒馆助手装了吗？开着吗？</li>
<li>导入时脚本允许了吗？去酒馆助手「脚本库 → 角色脚本」看 MVU 脚本是否开着；</li>
<li>网络能访问 MVU 的脚本地址吗？见 <strong>pit-cdn</strong>；</li>
<li>是不是旧版 App 导出的？0.4.1 修过一个会导致这个现象的问题，重新导出试试，见 <strong>pit-code-entity</strong>。</li>
</ol></section>
<section><h2>变量不更新<a href="#变量不更新"><span>#</span></a></h2>

<table><thead><tr><th>现象</th><th>原因</th><th>办法</th></tr></thead><tbody><tr><td>回复末尾没有更新命令</td><td>输出格式条目没发出去</td><td>确认它常驻、没被预算挤掉</td></tr><tr><td>改了又被改回去</td><td>变量结构的范围或类型拦下了</td><td>放宽结构，或在规则里写清范围</td></tr><tr><td>只有部分变量更新</td><td>规则太笼统</td><td>写具体的触发条件</td></tr></tbody></table></section>
<section><h2>初始变量不对<a href="#初始变量不对"><span>#</span></a></h2><ul>
<li><strong>解析失败</strong>：YAML 用了 Tab、全角冒号、缩进不齐；</li>
<li><strong>旧聊天</strong>：初始变量只在开局读一次，点「重新读取初始变量」或开新聊天；</li>
<li><strong>开场白里的 <code>&lt;initvar&gt;</code> 写错</strong>：它会覆盖条目里的值。</li>
</ul></section>
<section><h2>输入框上方的按钮<a href="#输入框上方的按钮"><span>#</span></a></h2>

<table><thead><tr><th>按钮</th><th>用途</th></tr></thead><tbody><tr><td>重新处理变量</td><td>重新读最新一条回复的命令</td></tr><tr><td>重新读取初始变量</td><td>按当前初始变量重置</td></tr><tr><td>重试额外模型解析</td><td>用额外模型解析时重来一次</td></tr></tbody></table></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-11"><span>#</span></a></h2><ul>
<li><strong>只在 App 里模拟通过</strong>：模拟不经过酒馆的网络和设置，一定要在酒馆实测；</li>
<li><strong>删消息后变量回退</strong>：变量存在每一楼上，删掉最新一楼就回到上一楼的值，正常现象；</li>
<li><strong>一次改太多</strong>：出问题时一次只改一处，改完开新聊天试。</li>
</ul><hr /></section>
<section><h2>MVU：zod 版和经典版有什么区别<a href="#mvuzod-版和经典版有什么区别"><span>#</span></a></h2>

<table><thead><tr><th></th><th>zod 版</th><th>经典版</th></tr></thead><tbody><tr><td>写法</td><td>多一个「变量结构」脚本：<code>const Schema = z.object({...})</code></td><td>只有初始值和规则</td></tr><tr><td>校验</td><td>每次更新后按 Schema 校验，类型不对会被拦下</td><td>不校验，写错了就错着</td></tr><tr><td>数值钳制</td><td>Schema 里可写范围（如好感度 0~100），超出自动修正</td><td>只能靠规则里叮嘱模型</td></tr><tr><td>缺省值</td><td>初始值缺的键由 Schema 默认值补</td><td>全靠初始值写全</td></tr><tr><td>兼容性</td><td>需要较新的 MVU 与酒馆助手</td><td>老版本也能用</td></tr><tr><td>适合谁</td><td>新卡、变量多、在意稳定</td><td>改老卡、变量很少</td></tr></tbody></table><p>两种都要求模型用 <strong>mvu-jsonpatch</strong> 输出更新。</p></section>
<section><h2>怎么判断一张卡是哪种<a href="#怎么判断一张卡是哪种"><span>#</span></a></h2><ul>
<li>酒馆助手的角色脚本里有「变量结构」脚本、内容有 <code>registerMvuSchema</code>：zod 版；</li>
<li>初始变量里的值写成 <code>[值, "说明"]</code>：多半是经典版。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-12"><span>#</span></a></h2><ul>
<li><strong>把经典版的初始变量直接搬进 zod 版</strong>：<code>[值, "说明"]</code> 会被当成列表，类型对不上；</li>
<li><strong>zod 版结构太严</strong>：AI 写了范围外的文字值，整条更新被拦下，看起来像「变量不更新」；</li>
<li><strong>以为 zod 版不需要规则</strong>：结构只管校验，什么时候改、改多少还是要靠更新规则，见 <strong>mvu-update-rules</strong>。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/pitfalls/</id>
      <title type="text">避坑清单</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/pitfalls/"/>
      <summary type="text">酒馆常见坑点大合集：提示词、脚本、正则、媒体与性能</summary>
      <content type="html"><![CDATA[<section><h2>发卡前自查清单<a href="#发卡前自查清单"><span>#</span></a></h2><p>卡做完了，发出去之前在酒馆里走一遍这个清单。大部分「别人用不了」的问题都能提前发现。</p></section>
<section><h2>导入<a href="#导入"><span>#</span></a></h2><ul>
<li>用<strong>一个干净的酒馆</strong>（或者先删掉旧版本）导入导出的文件，模拟玩家第一次拿到卡；</li>
<li>弹出「导入世界书」：选是，见 <strong>pit-embedded-book</strong>；</li>
<li>弹出「启用局部正则」「启用嵌入式脚本」：选是，见 <strong>pit-allow-scripts</strong>。</li>
</ul></section>
<section><h2>开局<a href="#开局"><span>#</span></a></h2><ul>
<li><strong>开新聊天</strong>，不要用旧聊天测，见 <strong>pit-old-chat</strong>；</li>
<li>开场白显示正常，没有露出代码或标签；</li>
<li>有状态栏的卡：状态栏出来了，数值是初始值；</li>
<li>每条备选开场白都切过去看一眼。</li>
</ul></section>
<section><h2>聊三到五轮<a href="#聊三到五轮"><span>#</span></a></h2><ul>
<li>AI 的回复风格对不对，有没有串成第一人称、替玩家说话；</li>
<li>世界书该触发的触发了：点 AI 回复上的「提示词」按钮看实际发了什么；</li>
<li>变量有没有更新，状态栏数值有没有变；</li>
<li>选项、面板等界面能点、能用。</li>
</ul></section>
<section><h2>换个环境<a href="#换个环境"><span>#</span></a></h2><ul>
<li><strong>换个预设</strong>：用一个流行的预设再聊几轮，见 <strong>preset-vs-card</strong>；</li>
<li><strong>换手机看</strong>：界面在窄屏上排版正常；</li>
<li><strong>关掉代理或换网络</strong>：用了外部脚本的卡，看能不能加载，见 <strong>pit-cdn</strong>。</li>
</ul></section>
<section><h2>发出去<a href="#发出去"><span>#</span></a></h2><ul>
<li>发<strong>文件</strong>，不要当图片发，见 <strong>pit-png-compress</strong>；</li>
<li>在简介或创作者注释里写清：需要什么扩展、推荐什么预设、导入时弹窗要选是。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>只在自己的酒馆测</strong>：自己的酒馆早就允许过脚本、装好了扩展，问题全被掩盖；</li>
<li><strong>只测开场白</strong>：很多问题在第二、三轮才出现，比如变量不更新、正则吃掉内容；</li>
<li><strong>改完没重新导出</strong>：在酒馆里改的东西不会回到 App 里，反之亦然。</li>
</ul><hr /></section>
<section><h2>卡里的系统提示没生效<a href="#卡里的系统提示没生效"><span>#</span></a></h2><p><strong>现象</strong>：卡里写了系统提示（主要提示词）或历史后置指令，但点「提示词」按钮一看，发出去的还是预设里的内容。</p></section>
<section><h2>为什么<a href="#为什么"><span>#</span></a></h2><p>卡里的系统提示是用来<strong>替换</strong>预设里「主要提示词」的。替换要同时满足这几个条件，缺一个就不替换：</p>

<table><thead><tr><th>条件</th><th>在哪看</th></tr></thead><tbody><tr><td>用户设置开着「角色卡提示词优先」</td><td>用户设置 → 角色处理（默认开）</td></tr><tr><td>预设的主要提示词没有勾「禁止覆盖」</td><td>预设的提示词列表，编辑主要提示词</td></tr><tr><td>预设的主要提示词是开着的</td><td>预设的提示词列表，开关状态</td></tr></tbody></table><p>历史后置指令同理：对应「首选角色卡指令」设置，以及预设里的历史后置指令块。</p><p>很多流行预设为了保证自己的效果，会<strong>关掉主要提示词或勾上禁止覆盖</strong>，这时卡的系统提示就白写了。</p></section>
<section><h2>怎么办<a href="#怎么办"><span>#</span></a></h2><p><strong>玩家</strong>：在预设里取消「禁止覆盖」，或换一个不禁止的预设。</p><p><strong>写卡时</strong>：</p><ul>
<li><strong>关键规则别只放系统提示里</strong>：放进世界书常驻条目更稳，只要世界书块开着就能发出去，见 <strong>preset-vs-card</strong>；</li>
<li>系统提示里用 <code>{{original}}</code> 保留预设原来的内容，只在前后补充自己的，见 <strong>card-system-prompt</strong>；</li>
<li>系统提示只写「锦上添花」的东西，丢了也不影响基本能玩。</li>
</ul></section>
<section><h2>怎么确认<a href="#怎么确认"><span>#</span></a></h2><p>点 AI 回复上的「提示词」按钮，找最前面的系统消息，看是卡里的内容还是预设的。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>在自己的预设下测试一切正常</strong>：你的预设没禁止覆盖，玩家的可能禁止了；</li>
<li><strong>系统提示和预设打架</strong>：替换成功时，预设原来的主要提示词就没了，可能丢掉预设作者的关键设定；</li>
<li><strong>以为系统提示比世界书更「权威」</strong>：模型并不会因为它叫系统提示就更听话，位置和写法更重要。</li>
</ul><hr /></section>
<section><h2>正则和脚本没被允许<a href="#正则和脚本没被允许"><span>#</span></a></h2><p><strong>现象</strong>：状态栏不出来、标签和更新命令全露在外面、美化不生效、输入框上方没有 MVU 的按钮。</p></section>
<section><h2>为什么<a href="#为什么-1"><span>#</span></a></h2><p>卡里自带的<strong>正则</strong>和<strong>脚本</strong>有安全风险，酒馆和酒馆助手默认不会自动运行，导入时会弹窗问：</p>

<table><thead><tr><th>弹窗</th><th>管什么</th></tr></thead><tbody><tr><td>酒馆：是否启用这张卡的局部正则</td><td>卡里的正则</td></tr><tr><td>酒馆助手：「是否现在就启用它们?」</td><td>卡里的脚本（MVU、按钮等）</td></tr></tbody></table><p>点了「否」就不生效。正则的弹窗<strong>每个角色只问一次</strong>，群聊里不弹。</p></section>
<section><h2>怎么补救<a href="#怎么补救"><span>#</span></a></h2><p><strong>正则</strong>：</p><ul>
<li>扩展程序 → 正则 → 「局部正则」那一栏，打开「允许使用局部正则」开关；</li>
<li>确认列表里的每条正则没有被单独禁用。</li>
</ul><p><strong>脚本</strong>：</p><ul>
<li>酒馆助手 → 脚本库 → 角色脚本，打开开关；</li>
<li>同时确认酒馆助手本身、脚本库总开关是开着的。</li>
</ul><p>改完后刷新页面或重新进入聊天。</p></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免"><span>#</span></a></h2><ul>
<li>简介里写清：「导入时两个弹窗都选『是』」；</li>
<li>开场白里的状态栏如果没出来，玩家立刻能看出问题，可以在开场白里加一句提示：「如果看到一堆代码，请检查是否允许了正则和脚本」。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>只允许了正则，没允许脚本</strong>（或反过来）：网页状态栏需要两者都开；</li>
<li><strong>以为一次允许、所有卡都允许</strong>：每张卡单独允许；</li>
<li><strong>预设正则改完不生效</strong>：预设正则要重新加载聊天才生效；</li>
<li><strong>群聊</strong>：局部正则在群聊里的表现和单聊不同，群聊卡要单独测。</li>
</ul><hr /></section>
<section><h2>外部脚本加载失败<a href="#外部脚本加载失败"><span>#</span></a></h2><p><strong>现象</strong>：MVU 卡状态栏一直「正在读取变量……」，输入框上方没有 MVU 的按钮；有的界面一片空白。同一张卡，有人能用、有人不能用。</p></section>
<section><h2>为什么<a href="#为什么-2"><span>#</span></a></h2><p>有些代码不在卡里，而是卡里写了一个<strong>网络地址</strong>，用的时候临时下载：</p><ul>
<li>MVU 本体、变量结构工具：从 jsdelivr 这类公共加速地址加载；</li>
<li>一些界面引用了外部的样式库、字体、脚本。</li>
</ul><p>如果玩家的网络访问不了这个地址（网络限制、地址被墙、服务临时故障），代码就没下载下来，功能直接失效，而且<strong>通常不会有明显的报错提示</strong>。</p></section>
<section><h2>怎么判断<a href="#怎么判断"><span>#</span></a></h2><ul>
<li>同一张卡换个网络（开或关代理、换手机流量）就好了：基本就是网络问题；</li>
<li>电脑上用浏览器开发者工具看网络请求，有红色的失败请求。</li>
</ul></section>
<section><h2>玩家能做什么<a href="#玩家能做什么"><span>#</span></a></h2><ul>
<li>换网络或使用代理后，刷新酒馆页面；</li>
<li>在酒馆助手里把 MVU 脚本的地址换成能访问的镜像（按卡作者的说明操作）。</li>
</ul></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免-1"><span>#</span></a></h2><ul>
<li><strong>能不用外部资源就不用</strong>：界面的样式、脚本尽量直接写进卡里；</li>
<li><strong>必须用的（如 MVU）</strong>：在简介里写清楚依赖网络，并提供备用地址；</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>在自己的网络测试没问题</strong>：你有代理，玩家不一定有；</li>
<li><strong>外部地址失效</strong>：引用的项目改了文件路径或停止维护，卡就突然坏了；</li>
<li><strong>引用了来路不明的脚本</strong>：外部脚本可以读你的聊天、改你的设置，只用可信来源。</li>
</ul><hr /></section>
<section><h2>界面代码在酒馆里报错，预览却正常<a href="#界面代码在酒馆里报错预览却正常"><span>#</span></a></h2><p><strong>现象</strong>：状态栏、面板在 App 里预览一切正常，导入酒馆后却卡在「正在读取变量……」，或者一片空白；打开浏览器控制台能看到脚本语法错误。</p></section>
<section><h2>为什么<a href="#为什么-3"><span>#</span></a></h2><p>酒馆助手渲染的界面，代码是放在消息的<strong>代码块</strong>里的。酒馆在把消息转成网页时，会把代码块里的 HTML 转义写法<strong>提前还原一层</strong>：</p>

<table><thead><tr><th>代码里写的</th><th>被还原成</th></tr></thead><tbody><tr><td><code>&amp;#39;</code></td><td><code>'</code></td></tr><tr><td><code>&amp;quot;</code></td><td><code>"</code></td></tr><tr><td><code>&amp;lt;</code> / <code>&amp;gt;</code></td><td><code>&lt;</code> / <code>&gt;</code></td></tr><tr><td><code>&amp;amp;</code></td><td><code>&amp;</code></td></tr></tbody></table><p>如果代码里本来就有这些写法（比如一个 JS 字符串 <code>'&amp;#39;'</code>），还原后变成 <code>'''</code>，<strong>整段脚本语法错误</strong>，什么都不执行。</p><p>常见来源：转义函数、拼 HTML 的代码里经常需要写 <code>&amp;lt;</code>、<code>&amp;#39;</code>。</p></section>
<section><h2>怎么办<a href="#怎么办-1"><span>#</span></a></h2><ul>
<li>这是 App 0.4.1 修复的问题：导出时自动给代码多加一层转义，酒馆还原一层后正好是原样。<strong>用旧版导出的卡，用新版重新导出一次</strong>；</li>
<li>手写代码时，想在 JS 里表示这些实体，改用字符拼接或 JS 转义，比如 <code>'&amp;' + '#39;'</code>，或者 <code>'\x26#39;'</code>；</li>
<li>自己手动多写一层：想要最终得到 <code>&amp;#39;</code>，就写 <code>&amp;amp;#39;</code>。</li>
</ul></section>
<section><h2>怎么确认是这个问题<a href="#怎么确认是这个问题"><span>#</span></a></h2><ul>
<li>在酒馆里打开浏览器开发者工具，控制台有 <code>SyntaxError</code>；</li>
<li>用新版 App 重新导出、在酒馆里重新导入后问题消失，基本就是它。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>App 预览正常就以为没问题</strong>：App 的预览不经过酒馆的 Markdown 处理，一定要在酒馆里实测；</li>
<li><strong>在酒馆里手改了代码再导出</strong>：手改时如果又写了实体，问题会回来；</li>
<li><strong>只发生在代码块里</strong>：同样的写法放在普通 HTML 里不出错，所以很难想到是这个原因。</li>
</ul><hr /></section>
<section><h2>正则替换后美元符号和内容不见了<a href="#正则替换后美元符号和内容不见了"><span>#</span></a></h2><p><strong>现象</strong>：正则替换后，「$100」变成了空白或奇怪的数字；状态栏里的价格消失；界面代码里有一段莫名其妙变成了整段消息原文。</p></section>
<section><h2>为什么<a href="#为什么-4"><span>#</span></a></h2><p>在正则的「替换为」里，<code>$</code> 加数字表示捕获组：<code>$1</code> 是第一个括号里的内容，见 <strong>regex-groups</strong>。酒馆会把替换内容里<strong>所有</strong> <code>$数字</code> 和 <code>$&lt;名字&gt;</code> 都当成捕获组处理：</p><ul>
<li><code>$100</code> 被当成第 100 个捕获组，不存在，变成空；</li>
<li>编号超过实际组数时，结果不可预料：可能是空，也可能插进一个位置数字，甚至插进整段原文；</li>
<li>和一般编程语言不同，<code>$$</code> <strong>不会</strong>变成一个 <code>$</code>。</li>
</ul></section>
<section><h2>最容易中招的地方<a href="#最容易中招的地方"><span>#</span></a></h2><ul>
<li>价格、货币：「售价 $5」；</li>
<li>界面代码写在替换内容里，代码中正好有 <code>'$1'</code> 这样的字符串，比如 JS 的字符串替换 <code>s.replace(/(a)/, '$1')</code>；</li>
<li>从别处复制来的模板里有 <code>$</code> 开头的变量名，后面紧跟数字。</li>
</ul><p><code>${...}</code>、<code>$(...)</code> 这类写法不受影响，因为 <code>$</code> 后面不是数字。</p></section>
<section><h2>怎么办<a href="#怎么办-2"><span>#</span></a></h2><ul>
<li><strong>显示用的文字</strong>：把 <code>$</code> 写成 <code>&amp;#36;</code>，网页显示出来就是 <code>$</code>；</li>
<li><strong>或者换成全角 <code>＄</code> 或「美元」</strong>；</li>
<li><strong>代码里</strong>：避免 <code>$</code> 紧跟数字，比如 JS 字符串替换改用函数写法 <code>s.replace(/(a)/, (m, a) =&gt; a)</code>；</li>
<li>价格放进变量或捕获组里，而不是直接写在替换内容中。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-5"><span>#</span></a></h2><ul>
<li><strong>只在正则的替换内容里发生</strong>：同样的文字写在开场白、世界书里没问题，所以很难察觉；</li>
<li><strong>测试时没测到</strong>：替换后内容「少了一点」很容易看漏，用正则编辑器的「测试模式」逐字核对；</li>
<li><strong>查找里的 <code>$</code></strong>：在查找规则里 <code>$</code> 表示「结尾」，要匹配美元符号本身得写 <code>\$</code>。</li>
</ul><hr /></section>
<section><h2>卡里的世界书没生效<a href="#卡里的世界书没生效"><span>#</span></a></h2><p><strong>现象</strong>：导入卡后，设定好像都没起作用；打开世界书面板，找不到这张卡的世界书，或者角色没有绑定世界书。</p></section>
<section><h2>为什么<a href="#为什么-5"><span>#</span></a></h2><p>卡里自带的世界书，导入时酒馆会弹窗问要不要导入。<strong>点了「否」或者直接关掉</strong>，世界书就没有导入。而且这个弹窗<strong>每张卡只问一次</strong>，之后不会再问。</p><p>另外：</p><ul>
<li>在角色列表里批量导入时，可能没注意到弹窗；</li>
<li>用户设置里关掉了导入世界书的提示，也不会弹。</li>
</ul></section>
<section><h2>怎么补救<a href="#怎么补救-1"><span>#</span></a></h2><p>打开这个角色 → 角色面板上的「…」更多菜单 → 「导入角色卡的世界书」。导入后，酒馆会生成一本同名世界书，并绑成这个角色的主要世界书。</p><p>导入后检查：</p><ul>
<li>世界书面板里能找到这本书；</li>
<li>角色面板的地球图标亮着，点开能看到绑定的是这本。</li>
</ul></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免-2"><span>#</span></a></h2><ul>
<li>在创作者注释和简介里写：「导入时请在弹窗里选『是』导入世界书」；</li>
<li>关键的说明（比如变量规则）放在世界书里，世界书没导入时开场就会露馅，玩家能及时发现；</li>
<li>不要把同一本书再单独发一份让玩家手动绑定，容易绑重复。</li>
</ul></section>
<section><h2>更新卡时<a href="#更新卡时"><span>#</span></a></h2><p>玩家导入新版卡时，如果已经有同名世界书，酒馆会提示将覆盖同名世界书，选是就用新版替换旧版。所以：</p><ul>
<li>新版卡的世界书<strong>名字保持不变</strong>，玩家更新才顺利；</li>
<li>提醒玩家：自己在旧世界书里改过的内容，覆盖后会丢失，要先备份。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-6"><span>#</span></a></h2><ul>
<li><strong>在酒馆里改了世界书，以为卡里也改了</strong>：导入后的世界书是独立文件，和卡里那份没关系，要重新导出卡；</li>
<li><strong>新版改了世界书名字</strong>：旧书不会被覆盖，玩家手里同时有两本，角色绑的可能还是旧的；</li>
<li><strong>聊天里没生效但书已导入</strong>：检查预设的提示词列表里世界书块是否开着，见 <strong>preset-order</strong>。</li>
</ul><hr /></section>
<section><h2>消息里的外部图片、字体不显示<a href="#消息里的外部图片字体不显示"><span>#</span></a></h2><p><strong>现象</strong>：开场白或美化里引用的网络图片显示不出来，或者顶部提示「外部媒体被禁用」；用网络字体、背景图的样式没生效。</p></section>
<section><h2>为什么<a href="#为什么-6"><span>#</span></a></h2><p>酒馆的用户设置里有「禁止外部媒体」，<strong>默认开着</strong>。开着时：</p><ul>
<li>消息里引用网络地址的图片、音频、视频被拦截；</li>
<li>样式里带网络地址的部分（比如 <code>url(https://...)</code> 的背景图、字体）被去掉。</li>
</ul><p>这是为了防止卡片借图片偷偷访问外部网站（比如记录你的 IP）。</p></section>
<section><h2>玩家怎么放行<a href="#玩家怎么放行"><span>#</span></a></h2><ul>
<li><strong>只放行这张卡</strong>：打开角色编辑面板，「角色描述」标题旁边有个链接图标，点它可以允许或禁止这个角色使用外部媒体；</li>
<li><strong>全部放行</strong>：用户设置里关掉「禁止外部媒体」（不太推荐）。</li>
</ul></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免-3"><span>#</span></a></h2><ul>
<li><strong>图片尽量少用</strong>：必须用的，在简介里提醒玩家点那个链接图标放行；</li>
<li><strong>颜色、边框、渐变用纯样式写</strong>：不依赖任何外部文件；</li>
<li><strong>字体用系统自带的</strong>：外部字体加载不了时，要有备选字体；</li>
<li><strong>酒馆助手渲染的小网页</strong>：它的规则和普通消息不同，也可能受网络影响，见 <strong>pit-cdn</strong>；以玩家实测为准。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-7"><span>#</span></a></h2><ul>
<li><strong>你自己早就放行了</strong>：在自己的酒馆里看一切正常，玩家那边全是空白；</li>
<li><strong>图床失效</strong>：免费图床的图片过段时间就没了，卡就「破相」了；</li>
<li><strong>图片太大</strong>：几 MB 的背景图在手机上加载很慢，每条消息都加载一次更慢；</li>
<li><strong>把图片转成超长的 base64 写进卡</strong>：能绕开拦截，但卡会变得非常大，每次显示都拖慢酒馆，慎用。</li>
</ul><hr /></section>
<section><h2>消息里的 HTML 排版乱了<a href="#消息里的-html-排版乱了"><span>#</span></a></h2><p><strong>现象</strong>：开场白或正则里写的 HTML 排版全乱：多出空白、一半变成代码框、文字变成斜体、点击按钮没反应、样式不生效。</p></section>
<section><h2>为什么<a href="#为什么-7"><span>#</span></a></h2><p>消息显示前，酒馆会先把文字当 <strong>Markdown</strong> 处理，再做<strong>安全过滤</strong>。直接写在消息里的 HTML 会被这两步改动：</p>

<table><thead><tr><th>写法</th><th>结果</th></tr></thead><tbody><tr><td>HTML 中间有空行</td><td>被拆成几段，结构断开</td></tr><tr><td>行首缩进 4 个空格</td><td>变成代码框</td></tr><tr><td>文字里有 <code>*</code>、<code>_</code></td><td>可能变成斜体、粗体</td></tr><tr><td><code>&lt;script&gt;</code></td><td>被删掉</td></tr><tr><td><code>onclick</code> 这类事件属性</td><td>被删掉</td></tr><tr><td><code>&lt;style&gt;</code> 里的规则</td><td>被限制在消息范围内，<code>body</code> 这类选择器不按预期生效</td></tr><tr><td>外部图片、字体</td><td>默认被拦截，见 <strong>pit-external-media</strong></td></tr></tbody></table><p>另外酒馆默认开着「自动修复 Markdown」，可能给没配对的星号补上配对。</p></section>
<section><h2>怎么办<a href="#怎么办-3"><span>#</span></a></h2><p><strong>简单的装饰</strong>（颜色、边框、折叠块）：</p><ul>
<li>HTML 写成紧凑的一段，中间不留空行；</li>
<li>不要用缩进；</li>
<li>只用内联 <code>style="..."</code>，不要依赖脚本。</li>
</ul><p><strong>需要交互的界面</strong>（按钮、标签页、读变量）：</p><ul>
<li>放进代码块，代码里要有 <code>&lt;html&gt;</code>、<code>&lt;head&gt;</code> 或 <code>&lt;body&gt;</code>，由酒馆助手渲染成独立的小网页；</li>
<li>在小网页里脚本、样式都能正常工作，不受上面的规则影响；</li>
<li>但代码块有自己的坑，见 <strong>pit-code-entity</strong>。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-8"><span>#</span></a></h2><ul>
<li><strong>App 预览正常、酒馆里乱了</strong>：预览不经过酒馆的 Markdown 处理，一定要在酒馆里实测；</li>
<li><strong>AI 输出的 HTML 也一样</strong>：让 AI 直接输出 HTML，很容易因为空行、缩进而乱掉，宁可让 AI 输出标签，再用正则换成 HTML；</li>
<li><strong>「在响应中显示标签」开着</strong>：所有 HTML 都会显示成代码文字，见 <strong>pit-show-tags</strong>。</li>
</ul><hr /></section>
<section><h2>改了卡，旧聊天里没变化<a href="#改了卡旧聊天里没变化"><span>#</span></a></h2><p><strong>现象</strong>：改了开场白、初始变量、状态栏，导入酒馆后，在原来的聊天里还是旧的样子。</p></section>
<section><h2>为什么<a href="#为什么-8"><span>#</span></a></h2><p>聊天开始时，有些内容会<strong>复制一份存进聊天记录</strong>，之后和卡就没关系了；有些内容则是每次发送时<strong>现读</strong>卡里的。</p>

<table><thead><tr><th>内容</th><th>旧聊天里会不会变</th></tr></thead><tbody><tr><td>角色描述、性格、情景、示例对话</td><td>会，每次发送都现读</td></tr><tr><td>系统提示、历史后置指令</td><td>会</td></tr><tr><td>开场白</td><td><strong>不会</strong>，开局时已经存成第一条消息</td></tr><tr><td>初始变量</td><td><strong>不会</strong>，开局时已经读进第一条消息</td></tr><tr><td>世界书</td><td>看你改的是哪份，见下文</td></tr><tr><td>正则、脚本</td><td>重新导入并刷新后会</td></tr><tr><td>已经存在的消息、变量</td><td><strong>不会</strong>，按当时的样子存着</td></tr></tbody></table></section>
<section><h2>世界书改了没生效<a href="#世界书改了没生效"><span>#</span></a></h2><p>导入后的世界书是独立文件。重新导入卡时，如果世界书没有跟着更新，用角色面板「…」→「导入角色卡的世界书」再导入一次，会覆盖同名的旧书。</p></section>
<section><h2>更新卡的正确做法<a href="#更新卡的正确做法"><span>#</span></a></h2><ol>
<li>在酒馆里选中旧角色，用角色面板「…」里的「替换 / 更新」导入新文件，保留聊天记录；</li>
<li>或者删掉旧角色和旧世界书，重新导入；</li>
<li><strong>开新聊天测试</strong>。</li>
</ol></section>
<section><h2>旧聊天还想继续玩<a href="#旧聊天还想继续玩"><span>#</span></a></h2><ul>
<li><strong>初始变量</strong>：点输入框上方的「重新读取初始变量」，见 <strong>mvu-initvar</strong>。注意这会按新的初始值重置；</li>
<li><strong>开场白</strong>：手动编辑第一条消息，或者干脆开新聊天；</li>
<li><strong>改了变量名</strong>：旧消息上存的还是旧名字，状态栏可能读不到，最好开新聊天。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-9"><span>#</span></a></h2><ul>
<li><strong>在旧聊天里测新版</strong>：看到的是新旧混合的效果，结论不可信；</li>
<li><strong>直接再导入一次同一张卡</strong>：可能多出一个同名角色，你在旧的那个里测，当然没变化；</li>
<li><strong>玩家反馈「更新没用」</strong>：在更新说明里提醒玩家开新聊天。</li>
</ul><hr /></section>
<section><h2>卡发出去变成了普通图片<a href="#卡发出去变成了普通图片"><span>#</span></a></h2><p><strong>现象</strong>：你发出去的卡，别人导入时报错，或者导入后只有一张图、什么设定都没有。</p></section>
<section><h2>为什么<a href="#为什么-9"><span>#</span></a></h2><p>角色卡的所有内容（描述、开场白、世界书、正则、脚本）都<strong>藏在 PNG 图片的附加数据里</strong>，图片本身只是封面。</p><p>很多软件发送、保存图片时会<strong>压缩或转格式</strong>，附加数据就被扔掉了：</p><ul>
<li>聊天软件当「图片」发送（不勾原图）；</li>
<li>部分图床、社交平台上传后重新压缩；</li>
<li>用修图软件打开再保存，或者截图；</li>
<li>有的相册「优化存储」会转成 JPG、HEIC 等格式。</li>
</ul></section>
<section><h2>怎么办<a href="#怎么办-4"><span>#</span></a></h2><ul>
<li><strong>当「文件」发送</strong>：聊天软件里选「文件」而不是「图片」；</li>
<li><strong>打包成压缩包</strong>再发；</li>
<li><strong>同时附一份 JSON</strong>：JSON 格式的卡只有数据没有图，不会被压缩；</li>
<li>发到网盘、论坛附件，而不是图片区。</li>
</ul></section>
<section><h2>怎么判断文件是否完好<a href="#怎么判断文件是否完好"><span>#</span></a></h2><ul>
<li>文件大小：带世界书的卡通常比同尺寸的普通图片大；</li>
<li>最直接：自己用酒馆导入一次收到的文件。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-10"><span>#</span></a></h2><ul>
<li><strong>改封面时用了别的软件</strong>：先在别的软件里改好图，再在 App 或酒馆里换封面，而不是直接改导出后的卡；</li>
<li><strong>从网上「另存为」下载的卡</strong>：网站可能给的是压缩后的预览图，要找原文件下载按钮；</li>
<li><strong>以为 JPG 也能当卡</strong>：角色卡只能是 PNG 或 JSON。</li>
</ul><hr /></section>
<section><h2>标签或代码原样露在消息里<a href="#标签或代码原样露在消息里"><span>#</span></a></h2><p><strong>现象</strong>：消息里出现 <code>&lt;options&gt;...&lt;/options&gt;</code>、<code>&lt;UpdateVariable&gt;</code> 这类标签原文，或者整段 HTML、代码以文字形式显示，而不是变成界面。</p></section>
<section><h2>先看是哪一种<a href="#先看是哪一种"><span>#</span></a></h2>

<table><thead><tr><th>表现</th><th>最可能的原因</th></tr></thead><tbody><tr><td>所有卡、所有美化都变成代码文字</td><td>「在响应中显示标签」开着</td></tr><tr><td>只有这张卡的标签露出来</td><td>局部正则没被允许</td></tr><tr><td>大部分时候正常，偶尔露出来</td><td>AI 这次把标签写错了</td></tr><tr><td>生成过程中露出来，生成完就好</td><td>流式输出时标签还没闭合，正常现象</td></tr><tr><td>显示一整块代码框</td><td>酒馆助手没装或「启用渲染器」没开</td></tr></tbody></table></section>
<section><h2>「在响应中显示标签」<a href="#在响应中显示标签"><span>#</span></a></h2><p>用户设置里的这个选项（默认关）打开后，酒馆会把消息里的所有尖括号都当文字显示。正则生成的 HTML 也一起变成了代码文字。玩家关掉它就好。</p></section>
<section><h2>局部正则没被允许<a href="#局部正则没被允许"><span>#</span></a></h2><p>见 <strong>pit-allow-scripts</strong>。</p></section>
<section><h2>AI 写错了标签<a href="#ai-写错了标签"><span>#</span></a></h2><p>正则只认它规定的写法，AI 稍微写偏一点就匹配不到：</p><ul>
<li>大小写不同：<code>&lt;Options&gt;</code> 和 <code>&lt;options&gt;</code>；</li>
<li>用了全角尖括号：<code>＜options＞</code>；</li>
<li>漏了结束标签，或者结束标签写错；</li>
<li>标签里多了空格、属性。</li>
</ul><p>办法：</p><ul>
<li>世界书里的格式要求写清楚，给一个完整示例；</li>
<li>正则查找时加 <code>i</code> 标志忽略大小写，见 <strong>regex-flags</strong>；</li>
<li>做一条兜底正则，把没闭合的标签也隐藏掉。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-11"><span>#</span></a></h2><ul>
<li><strong>只看了一两轮</strong>：AI 写错标签是偶发的，多聊几轮才会遇到；</li>
<li><strong>在格式要求里用了 <code>&lt;user&gt;</code> 当标签名</strong>：会被替换成玩家名字，见 <strong>pit-macro-escape</strong>；</li>
<li><strong>温度太高</strong>：格式更容易乱，见 <strong>preset-params</strong>。</li>
</ul><hr /></section>
<section><h2>世界书条目触发了却没发出去<a href="#世界书条目触发了却没发出去"><span>#</span></a></h2><p><strong>现象</strong>：条目明明是常驻的，或者关键词明明出现了，可「提示词」里就是找不到它；有时生效，有时不生效。</p></section>
<section><h2>为什么<a href="#为什么-10"><span>#</span></a></h2><p>世界书有预算，默认最多占上下文的 25%。这一轮触发的条目按「顺序」从大到小排队进预算，<strong>满了之后的全部丢掉</strong>，见 <strong>worldbook-budget</strong>。</p><p>很多人以为常驻条目一定会发，其实<strong>常驻也要排队</strong>。下面几种情况最容易超预算：</p><ul>
<li>预设里的上下文长度设得小（比如 8k），25% 只有 2000 token 左右；</li>
<li>世界书条目多、每条都很长；</li>
<li>递归开着，一个条目带出一串，见 <strong>worldbook-recursion</strong>；</li>
<li>玩家同时开着全局世界书，和卡的世界书共用预算。</li>
</ul></section>
<section><h2>怎么确认<a href="#怎么确认-1"><span>#</span></a></h2><ul>
<li>点 AI 回复上的「提示词」按钮，看这条是不是真的发了；</li>
<li>世界书设置里打开「溢出警报」，超预算时会提示。</li>
</ul></section>
<section><h2>怎么办<a href="#怎么办-5"><span>#</span></a></h2><ul>
<li><strong>最关键的条目勾「无视回复限额」</strong>：比如 MVU 的变量列表、更新规则、输出格式，少了它们卡就不能玩；</li>
<li><strong>重要条目顺序设大</strong>：先进预算；</li>
<li><strong>精简内容</strong>：删重复、删废话，长条目拆成按关键词触发的短条目；</li>
<li><strong>大段设定别常驻</strong>：常驻的只放每轮都必须知道的。</li>
</ul></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免-4"><span>#</span></a></h2><p>按「玩家的上下文只有 16k」来估算：世界书常驻部分控制在 2000～3000 token 以内，比较安全。在简介里写明推荐的上下文长度。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-12"><span>#</span></a></h2><ul>
<li><strong>在自己的大上下文环境测试没问题</strong>：玩家的上下文更小，就出事了；</li>
<li><strong>「无视回复限额」勾太多</strong>：等于没有预算，可能把聊天记录挤得太少；</li>
<li><strong>以为顺序小的先进</strong>：是<strong>顺序数字大的</strong>先进预算，见 <strong>worldbook-order</strong>。</li>
</ul><hr /></section>
<section><h2>关键词条目总是触发或从不触发<a href="#关键词条目总是触发或从不触发"><span>#</span></a></h2><p><strong>现象 A</strong>：一个按关键词触发的条目，几乎每轮都在。</p><p><strong>现象 B</strong>：一个条目，聊天里明明提到了，就是不触发。</p></section>
<section><h2>总是触发的原因<a href="#总是触发的原因"><span>#</span></a></h2>

<table><thead><tr><th>原因</th><th>说明</th></tr></thead><tbody><tr><td>用了角色名、玩家名当关键词</td><td>酒馆扫描时会把说话人的名字一起扫（「包括名称」默认开），每条消息都带名字</td></tr><tr><td>关键词太短太泛</td><td>单个汉字、「他」「门」「刀」这种词处处都有</td></tr><tr><td>关键词出现在开场白或 AI 的口头禅里</td><td>AI 自己每轮都说，自己触发自己</td></tr><tr><td>递归</td><td>别的条目内容里提到了它，见 <strong>worldbook-recursion</strong></td></tr></tbody></table></section>
<section><h2>从不触发的原因<a href="#从不触发的原因"><span>#</span></a></h2>

<table><thead><tr><th>原因</th><th>说明</th></tr></thead><tbody><tr><td>玩家用的词和关键词不一样</td><td>只写了全名「沈清」，玩家说「清儿」「沈小姐」</td></tr><tr><td>英文名被「匹配整个单词」拦住</td><td>关键词 <code>Tom</code> 匹配不到 <code>Tommy</code>，新装酒馆默认开着这个选项</td></tr><tr><td>关键词之间用了全角逗号</td><td>「沈清，清儿」被当成一个关键词</td></tr><tr><td>扫描深度太小</td><td>提到的那句已经不在扫描范围里，见 <strong>worldbook-scan-depth</strong></td></tr><tr><td>条目被禁用，或世界书没导入</td><td>见 <strong>pit-embedded-book</strong></td></tr><tr><td>次要关键词逻辑设错</td><td>比如「与所有」要求次要关键词全都出现</td></tr></tbody></table></section>
<section><h2>怎么办<a href="#怎么办-6"><span>#</span></a></h2><ul>
<li>角色本人的设定直接写进角色描述，或者做成常驻，不要用名字触发；</li>
<li>关键词写多个别称，用半角逗号分隔；</li>
<li>避免单字关键词，至少两个字；</li>
<li>测试时点「提示词」按钮看触发了哪些条目。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-13"><span>#</span></a></h2><ul>
<li><strong>中文不受「匹配整个单词」影响</strong>：不用担心中文关键词被它拦住；</li>
<li><strong>大小写</strong>：默认不区分，英文名一般不用担心；</li>
<li><strong>正则关键词</strong>：写成 <code>/.../</code> 后完全按正则匹配，写错了不会报错，只是不触发。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/preset-guide/</id>
      <title type="text">预设配置</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/preset-guide/"/>
      <summary type="text">预设结构、instruct 模式、注入顺序与参数调优</summary>
      <content type="html"><![CDATA[<section><h2>什么写进卡，什么留给预设<a href="#什么写进卡什么留给预设"><span>#</span></a></h2><p>写卡时常纠结：文风要求、输出格式该写在卡里，还是让玩家的预设来管？原则是：<strong>和这张卡有关的写进卡，通用的留给预设。</strong></p></section>
<section><h2>分工表<a href="#分工表"><span>#</span></a></h2>

<table><thead><tr><th>内容</th><th>放哪</th><th>原因</th></tr></thead><tbody><tr><td>人设、世界观、配角、地点</td><td>卡（描述 + 世界书）</td><td>只属于这张卡</td></tr><tr><td>开场白、示例对话</td><td>卡</td><td>只属于这张卡</td></tr><tr><td>变量规则、状态栏输出格式</td><td>卡（世界书常驻或 @D 条目）</td><td>卡的功能靠它，不能指望玩家预设</td></tr><tr><td>选项、面板等界面标签的输出要求</td><td>卡（世界书）</td><td>同上</td></tr><tr><td>这张卡特有的文风（古风、公文体、日记体）</td><td>卡</td><td>是卡的特色</td></tr><tr><td>通用文风（少用比喻、不要总结）</td><td>预设</td><td>每张卡都适用</td></tr><tr><td>破限</td><td>预设</td><td>和模型有关，不和卡有关</td></tr><tr><td>回复长度、人称</td><td>预设为主，卡里可以建议</td><td>玩家各有偏好</td></tr><tr><td>思维链格式</td><td>预设</td><td>和模型有关</td></tr></tbody></table></section>
<section><h2>为什么卡的关键规则要写进世界书<a href="#为什么卡的关键规则要写进世界书"><span>#</span></a></h2><p>玩家用的预设千差万别。卡里的系统提示可能被预设禁止覆盖，见 <strong>card-system-prompt</strong>。而世界书条目只要世界书块没被关，都会发出去，最稳。</p><p>所以常见做法是把 MVU 规则、界面说明都放在世界书条目里，而不是系统提示里。</p></section>
<section><h2>和预设兼容的写法<a href="#和预设兼容的写法"><span>#</span></a></h2><ul>
<li><strong>不要在卡里写破限</strong>：和玩家的预设叠加，容易起反作用；</li>
<li><strong>不要规定太多通用格式</strong>：「每次回复 800 字」这类要求和预设冲突时，AI 会摇摆；</li>
<li><strong>把必需的东西说清楚</strong>：「本卡需要 AI 在回复末尾输出 <code>&lt;options&gt;</code>」，这类要求写在世界书里，不依赖预设；</li>
<li><strong>在创作者注释里写推荐预设</strong>：见 <strong>card-creator-notes</strong>。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>只在自己的预设下测试</strong>：换个流行预设试试，卡的功能是否还正常；</li>
<li><strong>预设自带的正则和卡的正则冲突</strong>：比如都在处理同一个标签，见 <strong>regex-cheatsheet</strong>；</li>
<li><strong>以为卡的系统提示一定生效</strong>：见 <strong>pit-char-prompt</strong>。</li>
</ul><hr /></section>
<section><h2>对话补全预设<a href="#对话补全预设"><span>#</span></a></h2><p>用 OpenAI、Claude、Gemini、DeepSeek 这类接口聊天时，用的是「对话补全」模式。这时<strong>预设</strong>决定了：</p><ul>
<li>发给模型的提示词由哪些块组成、按什么顺序拼，见 <strong>preset-order</strong>；</li>
<li>每块用什么身份发（系统 / 用户 / AI）；</li>
<li>温度、上下文长度、最大回复长度等参数，见 <strong>preset-params</strong>。</li>
</ul><p>预设在酒馆左上角第一个图标「AI 响应配置」里切换、导入、导出。</p></section>
<section><h2>预设和角色卡的分工<a href="#预设和角色卡的分工"><span>#</span></a></h2><p>一句话：<strong>角色卡管「演谁」，预设管「怎么演」</strong>。</p><ul>
<li>角色卡：人设、世界观、开场白、世界书；</li>
<li>预设：文风要求、叙事人称、回复长度、破限、思维链格式。</li>
</ul><p>同一张卡换个预设，效果可能天差地别。详细分工见 <strong>preset-vs-card</strong>。</p></section>
<section><h2>常见的预设内容<a href="#常见的预设内容"><span>#</span></a></h2>

<table><thead><tr><th>块</th><th>作用</th></tr></thead><tbody><tr><td>主要提示词</td><td>告诉模型「你在写一个角色扮演故事」</td></tr><tr><td>文风 / 写作要求</td><td>人称、篇幅、描写方式</td></tr><tr><td>破限</td><td>让模型放开写的提示词</td></tr><tr><td>思维链</td><td>要求模型先在标签里思考再回复</td></tr><tr><td>历史后置指令</td><td>紧贴最新消息的最终提醒</td></tr></tbody></table></section>
<section><h2>预设还能带别的东西<a href="#预设还能带别的东西"><span>#</span></a></h2><ul>
<li><strong>预设正则</strong>：新版酒馆的预设可以自带正则，切换预设时一起生效；</li>
<li><strong>酒馆助手的预设脚本库</strong>：脚本跟着预设走。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>预设和卡打架</strong>：预设规定第三人称、卡的开场白是第二人称，AI 会混乱；</li>
<li><strong>预设关掉了世界书块</strong>：卡的世界书就发不出去，见 <strong>preset-order</strong>；</li>
<li><strong>预设禁止覆盖主要提示词</strong>：卡里的系统提示不生效，见 <strong>card-system-prompt</strong>；</li>
<li><strong>预设自带的思维链和卡的正则冲突</strong>：思维链标签没被隐藏，或卡的正则把思维链也改了。测试时用你推荐的预设。</li>
</ul><hr /></section>
<section><h2>Instruct 与 Context 模板<a href="#instruct-与-context-模板"><span>#</span></a></h2><p>如果你用的是<strong>文本补全</strong>接口（本地跑的模型、KoboldCpp、部分中转），酒馆不会用对话补全预设，而是用下面两种模板。用 OpenAI、Claude 这类对话补全接口的话，<strong>可以跳过这条</strong>。</p></section>
<section><h2>Context 模板（上下文模板）<a href="#context-模板上下文模板"><span>#</span></a></h2><p>规定角色卡各部分怎么拼成开头的一大段文字：描述放哪、性格放哪、示例对话怎么标记。</p></section>
<section><h2>Instruct 模板（指令模板）<a href="#instruct-模板指令模板"><span>#</span></a></h2><p>规定每一条消息怎么包起来。不同模型有不同的格式，比如：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;|im_start|&gt;user</span></div></div><div><div><div>2</div></div><div><span>你好&lt;|im_end|&gt;</span></div></div><div><div><div>3</div></div><div><span>&lt;|im_start|&gt;assistant</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>模板选错，模型分不清谁在说话，会出现自问自答、输出乱码标记、停不下来等问题。</p></section>
<section><h2>怎么选<a href="#怎么选"><span>#</span></a></h2><ul>
<li>看模型说明里写的是什么格式（ChatML、Llama 3、Mistral 等），选同名模板；</li>
<li>酒馆有「自动选择」，大部分情况选对了；</li>
<li>不确定就去模型的发布页找推荐设置。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>用对话补全却在调 Instruct</strong>：对话补全模式下这两个模板不起作用，改了也没反应；</li>
<li><strong>卡里写了模型专用标记</strong>：比如在卡里写 <code>&lt;|im_start|&gt;</code>，换个模型就乱了。卡里只写普通文字。</li>
</ul><hr /></section>
<section><h2>提示词顺序（prompt_order）<a href="#提示词顺序prompt_order"><span>#</span></a></h2><p>对话补全预设的面板底部有一个「提示词」列表，列出组成提示词的每一块。这个列表的顺序和开关，就是预设里的 <code>prompt_order</code>。</p></section>
<section><h2>列表里有什么<a href="#列表里有什么"><span>#</span></a></h2><p>内置的块：</p><ul>
<li><strong>主要提示词</strong>、<strong>辅助提示</strong>、<strong>历史后置指令</strong>：预设作者写的指示；</li>
<li><strong>世界书（前）/ 世界书（后）</strong>：卡的世界书条目插入的位置；</li>
<li><strong>用户设定描述</strong>、<strong>角色描述</strong>、<strong>角色性格</strong>、<strong>情景</strong>：从卡和人设里取；</li>
<li><strong>示例对话</strong>、<strong>聊天记录</strong>：从卡和聊天里取。</li>
</ul><p>再加上预设作者自己添加的各种块（文风、破限、思维链……）。</p></section>
<section><h2>能做什么<a href="#能做什么"><span>#</span></a></h2><ul>
<li><strong>拖动</strong>：改顺序；</li>
<li><strong>开关</strong>：关掉的块不发送；</li>
<li><strong>编辑</strong>：点笔形图标改内容；</li>
<li><strong>新建块</strong>：位置可以选「相对」（按列表顺序）或「聊天中」（插在聊天记录的某个深度）；</li>
<li><strong>禁止覆盖</strong>：勾上后，角色卡里的系统提示不能替换这一块，见 <strong>card-system-prompt</strong>。</li>
</ul></section>
<section><h2>顺序的影响<a href="#顺序的影响"><span>#</span></a></h2><p>越靠后（越接近聊天记录末尾）的内容，模型越重视。所以：</p><ul>
<li>背景资料放前面；</li>
<li>格式要求、最终提醒放后面（历史后置指令、或「聊天中」深度 0～2）。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>世界书块被关或被删</strong>：卡的「角色定义前 / 后」条目全部发不出去，世界书像没生效一样。卡不生效时先检查这里；</li>
<li><strong>聊天记录块被关</strong>：AI 完全不知道之前聊了什么；</li>
<li><strong>角色描述块被关</strong>：有的预设为了「全部交给世界书」会关掉它，这时卡的描述字段白写。</li>
</ul><hr /></section>
<section><h2>常用参数：温度、上下文、回复长度<a href="#常用参数温度上下文回复长度"><span>#</span></a></h2><p>预设面板最上面是一排参数。大部分保持默认就行，下面几个最常需要调。</p></section>
<section><h2>上下文长度（Token）<a href="#上下文长度token"><span>#</span></a></h2><p>每次最多发多少 token 给模型。</p><ul>
<li>不能超过模型的实际上限，超了会报错；</li>
<li>酒馆默认把滑块限制在一个较小的范围，勾「解锁上下文上限」才能拉大；</li>
<li>设得太小：世界书预算（默认占 25%）和聊天记录都很紧，AI 健忘；</li>
<li>设得太大：每次请求更贵、更慢，而且很长的上下文模型也未必都用得上。</li>
</ul><p>一般 32k～64k 对角色扮演够用。</p></section>
<section><h2>最大回复长度（Token）<a href="#最大回复长度token"><span>#</span></a></h2><p>模型一次最多写多少。</p><ul>
<li>太小：回复写一半被截断；</li>
<li>有思维链的模型，思考过程也算在里面，要留够；</li>
<li>它也从上下文里预留，设得越大，能放的聊天记录越少。</li>
</ul></section>
<section><h2>温度<a href="#温度"><span>#</span></a></h2><p>控制随机程度。</p>

<table><thead><tr><th>温度</th><th>效果</th></tr></thead><tbody><tr><td>低（0.3～0.7）</td><td>稳定、保守，容易重复</td></tr><tr><td>中（0.8～1.0）</td><td>常用范围</td></tr><tr><td>高（1.2 以上）</td><td>更有创意，也更容易胡说、崩格式</td></tr></tbody></table><p>MVU、状态栏这类要求固定格式的卡，温度别太高，否则变量更新容易写错。</p></section>
<section><h2>其他<a href="#其他"><span>#</span></a></h2>

<table><thead><tr><th>参数</th><th>一句话</th></tr></thead><tbody><tr><td>Top P / Top K</td><td>另一种控制随机的方式，一般不用动</td></tr><tr><td>频率惩罚 / 存在惩罚</td><td>减少重复用词，太大会让文字变怪</td></tr><tr><td>流式传输</td><td>回复一个字一个字出来</td></tr><tr><td>请求思维链 / 推理强度</td><td>让支持的模型先思考，更聪明也更慢</td></tr><tr><td>压缩系统消息</td><td>把连续的系统消息合成一条，部分接口需要</td></tr></tbody></table></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>回复总是截断</strong>：调大最大回复长度；或者用「继续」按钮接着写；</li>
<li><strong>流式输出时界面闪烁、状态栏乱跳</strong>：流式时消息在不断变化，前端界面会反复刷新。酒馆助手有「允许流式渲染」开关可以关掉；</li>
<li><strong>温度很高还抱怨 AI 不听话</strong>：先降温度再改卡；</li>
<li><strong>有的模型不支持某些参数</strong>：比如部分推理模型会忽略温度。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/regex-guide/</id>
      <title type="text">正则表达式</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/regex-guide/"/>
      <summary type="text">酒馆正则速查、作用域、深度、分组与正反脚手架</summary>
      <content type="html"><![CDATA[<section><h2>常用正则速查<a href="#常用正则速查"><span>#</span></a></h2><p>写卡最常用的几条正则，直接抄，改改标签名就能用。每条都写明了该勾哪些选项。</p></section>
<section><h2>1. 隐藏思维链<a href="#1-隐藏思维链"><span>#</span></a></h2><p>模型在 <code>&lt;think&gt;</code> 标签里思考，不想看到也不想发回给 AI。</p><ul>
<li>查找：<code>/&lt;think&gt;[\s\S]*?&lt;\/think&gt;\s*/g</code></li>
<li>替换为：（留空）</li>
<li>作用范围：AI 输出</li>
<li>选项：仅影响显示 + 仅影响后端提示词（两个都勾）</li>
</ul><p>新版酒馆会把很多模型的思考过程单独放进「推理」区，这时不需要这条。</p></section>
<section><h2>2. 思维链折叠成可展开的块<a href="#2-思维链折叠成可展开的块"><span>#</span></a></h2><ul>
<li>查找：<code>/&lt;think&gt;([\s\S]*?)&lt;\/think&gt;/g</code></li>
<li>替换为：<code>&lt;details&gt;&lt;summary&gt;思考&lt;/summary&gt;$1&lt;/details&gt;</code></li>
<li>选项：仅影响显示</li>
</ul><p>再配一条「仅影响后端提示词」的第 1 条，把它从历史里删掉。</p></section>
<section><h2>3. 对白、心理上色<a href="#3-对白心理上色"><span>#</span></a></h2><ul>
<li>查找：<code>/「([^」\n]+)」/g</code></li>
<li>替换为：<code>&lt;span style="color:#c86"&gt;「$1」&lt;/span&gt;</code></li>
<li>选项：仅影响显示</li>
</ul><p>心理活动用其他括号的话，把两处「」换成对应的符号。</p></section>
<section><h2>4. 从历史里删掉界面标签<a href="#4-从历史里删掉界面标签"><span>#</span></a></h2><p>AI 输出了 <code>&lt;options&gt;...&lt;/options&gt;</code>，显示时变成按钮，但不希望它留在历史里。</p><ul>
<li>查找：<code>/&lt;options&gt;[\s\S]*?&lt;\/options&gt;/g</code></li>
<li>替换为：（留空）</li>
<li>选项：仅影响后端提示词</li>
</ul></section>
<section><h2>5. 只保留最近几条的状态栏<a href="#5-只保留最近几条的状态栏"><span>#</span></a></h2><ul>
<li>查找：<code>/&lt;StatusBlock&gt;[\s\S]*?&lt;\/StatusBlock&gt;/g</code></li>
<li>替换为：（留空）</li>
<li>选项：仅影响后端提示词，最小深度 2</li>
</ul><p>最近两条的状态还在，AI 知道当前状态；更早的删掉省 token。见 <strong>regex-depth</strong>。</p></section>
<section><h2>6. 删掉多余空行<a href="#6-删掉多余空行"><span>#</span></a></h2><ul>
<li>查找：<code>/\n{3,}/g</code></li>
<li>替换为：两个换行（在替换框里按两次回车）</li>
<li>选项：仅影响显示</li>
</ul></section>
<section><h2>7. 隐藏玩家输入里的指令括号<a href="#7-隐藏玩家输入里的指令括号"><span>#</span></a></h2><p>玩家用「（旁白：……）」给 AI 下指令，不想在聊天里看到。</p><ul>
<li>查找：<code>/（旁白：[^）]*）/g</code></li>
<li>替换为：（留空）</li>
<li>作用范围：用户输入</li>
<li>选项：仅影响显示</li>
</ul></section>
<section><h2>抄的时候注意<a href="#抄的时候注意"><span>#</span></a></h2><ul>
<li>标签名要和你世界书里要求 AI 输出的一模一样，包括大小写；</li>
<li>先在「测试模式」里粘一段真实消息试；</li>
<li>同一个标签别让两条正则都去改，顺序靠后的会拿到已经被改过的内容；</li>
<li>预设、全局正则里可能已经有类似的规则，重复处理会出怪事。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>界面正则选了都不勾</strong>：原文被永久替换，见 <strong>pit-regex-scope</strong>；</li>
<li><strong>美元符号</strong>：替换内容里的 <code>$</code> 后面跟数字会被当成捕获组，见 <strong>pit-dollar</strong>；</li>
<li><strong>作用范围没勾世界书</strong>：想处理世界书内容的正则要勾「世界书」，见 <strong>pit-regex-placement</strong>。</li>
</ul><hr /></section>
<section><h2>仅影响显示与仅影响后端提示词<a href="#仅影响显示与仅影响后端提示词"><span>#</span></a></h2><p>正则设置里有一组「表层替换」选项，决定这条正则<strong>改的是什么</strong>。这是正则最重要、也最容易弄错的设置。</p></section>
<section><h2>三种组合<a href="#三种组合"><span>#</span></a></h2>

<table><thead><tr><th>设置</th><th>你看到的</th><th>发给 AI 的</th><th>聊天记录原文</th></tr></thead><tbody><tr><td>仅影响显示（markdownOnly）</td><td>改了</td><td>不改</td><td>不改</td></tr><tr><td>仅影响后端提示词（promptOnly）</td><td>不改</td><td>改了</td><td>不改</td></tr><tr><td>两个都勾</td><td>改了</td><td>改了</td><td>不改</td></tr><tr><td><strong>两个都不勾</strong></td><td>改了</td><td>改了</td><td><strong>永久改掉</strong></td></tr></tbody></table><p>「两个都不勾」时，正则在消息生成或发送的那一刻直接改写消息本身，原文就没了。</p></section>
<section><h2>典型用法<a href="#典型用法"><span>#</span></a></h2>

<table><thead><tr><th>需求</th><th>选哪个</th></tr></thead><tbody><tr><td>状态栏、选项按钮、美化</td><td>仅影响显示</td></tr><tr><td>从历史里删掉界面标签、旧的变量命令</td><td>仅影响后端提示词</td></tr><tr><td>显示和发送都要去掉某个内容</td><td>两个都勾</td></tr><tr><td>真正改写消息（很少需要）</td><td>都不勾</td></tr></tbody></table><p>一个卡片前端功能通常是一对正则：一条「仅显示」把标签变成界面，一条「仅提示词」把标签从 AI 看到的历史里删掉。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>都不勾，状态栏把原文吃掉了</strong>：变量命令、标签被永久替换成 HTML，变量框架读不到，AI 下一轮也看不到。界面正则一定勾「仅影响显示」，见 <strong>pit-regex-scope</strong>；</li>
<li><strong>只勾仅显示，AI 越写越乱</strong>：界面标签留在历史里，AI 看到一大堆标签会学着乱写；</li>
<li><strong>以为仅显示的正则会改发送内容</strong>：它只改屏幕上的，AI 看到的还是原文；</li>
<li><strong>改了正则旧消息没变</strong>：显示类的正则对已经显示的消息不会立刻重算，刷新或重新进入聊天才生效。</li>
</ul><hr /></section>
<section><h2>正则的最小深度与最大深度<a href="#正则的最小深度与最大深度"><span>#</span></a></h2><p>正则设置里的「最小深度 / 最大深度」让正则只对<strong>某几层消息</strong>生效。深度从最新消息往回数：最新一条是 0，前一条是 1，以此类推。</p><ul>
<li>留空：不限制；</li>
<li>最小深度 2：最新的两条（深度 0、1）不处理；</li>
<li>最大深度 0：只处理最新一条。</li>
</ul></section>
<section><h2>典型用法<a href="#典型用法-1"><span>#</span></a></h2>

<table><thead><tr><th>需求</th><th>设置</th></tr></thead><tbody><tr><td>只在最新消息显示状态栏，旧消息显示简版</td><td>状态栏正则「仅显示」+ 最大深度 0；另一条简版正则最小深度 1</td></tr><tr><td>发给 AI 时只保留最近几条的详细内容</td><td>「仅提示词」+ 最小深度 3，把更早的长内容删掉或换成摘要</td></tr><tr><td>删掉很早以前的变量更新命令</td><td>「仅提示词」+ 最小深度 5</td></tr></tbody></table><p>用深度可以大幅省 token：最近几条保留完整信息，更早的只留正文。</p></section>
<section><h2>显示和发送的深度怎么算<a href="#显示和发送的深度怎么算"><span>#</span></a></h2><ul>
<li><strong>显示</strong>：消息渲染时计算，最新一条是 0，系统消息不算；</li>
<li><strong>发送给 AI</strong>：组装提示词时计算，聊天记录的最后一条是 0。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>旧消息的显示没跟着变</strong>：显示类正则只在消息渲染时计算一次。新消息来了，上一条不会自动重算，看起来还是「深度 0」的样子。刷新或重新进入聊天后才按新深度显示；</li>
<li><strong>深度和楼层号不是一回事</strong>：楼层号从开场白往后数，深度从最新往前数；</li>
<li><strong>以为深度对世界书也有用</strong>：世界书内容的正则只有「@D 深度」插入的条目才带深度；</li>
<li><strong>最小深度大于最大深度</strong>：这条正则就什么都不处理了。</li>
</ul><hr /></section>
<section><h2>正则的写法与标志（g、s、i）<a href="#正则的写法与标志gsi"><span>#</span></a></h2><p>「查找正则表达式」一栏推荐写成两边带斜杠、后面跟标志的形式：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>/要找的内容/gs</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>常用标志<a href="#常用标志"><span>#</span></a></h2>

<table><thead><tr><th>标志</th><th>作用</th><th>什么时候要</th></tr></thead><tbody><tr><td><code>g</code></td><td>替换<strong>所有</strong>匹配，不加只换第一处</td><td>几乎总是要</td></tr><tr><td><code>s</code></td><td>让 <code>.</code> 也能匹配换行</td><td>要匹配跨多行的内容时</td></tr><tr><td><code>i</code></td><td>不区分大小写</td><td>匹配英文标签时可选</td></tr><tr><td><code>m</code></td><td><code>^</code>、<code>$</code> 匹配每一行的开头结尾</td><td>按行处理时</td></tr></tbody></table><p>不写斜杠时，整行被当成规则本身，<strong>没有任何标志</strong>，也就只替换第一处。</p></section>
<section><h2>最常用的几个符号<a href="#最常用的几个符号"><span>#</span></a></h2>

<table><thead><tr><th>写法</th><th>意思</th></tr></thead><tbody><tr><td><code>.</code></td><td>任意一个字符（不含换行，除非加 <code>s</code>）</td></tr><tr><td><code>[\s\S]</code></td><td>任意一个字符，<strong>包括换行</strong></td></tr><tr><td><code>*</code> / <code>+</code> / <code>?</code></td><td>前一个出现 0 次以上 / 1 次以上 / 0 或 1 次</td></tr><tr><td><code>*?</code> / <code>+?</code></td><td>同上，但<strong>尽量少</strong>匹配（非贪婪）</td></tr><tr><td><code>[^」]</code></td><td>除了「」」以外的任意字符</td></tr><tr><td><code>\d</code> / <code>\s</code></td><td>数字 / 空白</td></tr><tr><td><code>^</code> / <code>$</code></td><td>开头 / 结尾</td></tr><tr><td><code>\</code></td><td>转义，让 <code>.</code>、<code>(</code>、<code>/</code>、<code>*</code> 这些符号表示它本身</td></tr></tbody></table><p>另外，竖线表示「或」：<code>/你好|您好/</code> 两个都能匹配。</p></section>
<section><h2>贪婪与非贪婪<a href="#贪婪与非贪婪"><span>#</span></a></h2><p>消息里有两段 <code>&lt;a&gt;1&lt;/a&gt; 中间 &lt;a&gt;2&lt;/a&gt;</code>：</p><ul>
<li><code>/&lt;a&gt;[\s\S]*&lt;\/a&gt;/</code> 会从第一个 <code>&lt;a&gt;</code> 一直吃到<strong>最后一个</strong> <code>&lt;/a&gt;</code>，把中间全吞了；</li>
<li><code>/&lt;a&gt;[\s\S]*?&lt;\/a&gt;/g</code> 才是分别匹配两段。</li>
</ul><p>匹配标签内容时，<strong>几乎总是用 <code>*?</code></strong>。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>忘了 <code>g</code></strong>：只有第一处被替换，后面的原样留着；</li>
<li><strong>标签内容有换行却用了 <code>.*</code></strong>：匹配不到。用 <code>[\s\S]*?</code> 或加 <code>s</code> 标志；</li>
<li><strong>斜杠没转义</strong>：在 <code>/.../</code> 形式里写结束标签要写 <code>&lt;\/tag&gt;</code>；</li>
<li><strong>中文标点全角半角</strong>：「：」和「:」是两个字符，规则里写哪个就只匹配哪个；</li>
<li><strong>写完没测</strong>：正则编辑窗口里打开「测试模式」，粘一段真实消息进去看输出。</li>
</ul><hr /></section>
<section><h2>捕获组<a href="#捕获组"><span>#</span></a></h2><p>查找里用圆括号 <code>( )</code> 圈出的部分叫<strong>捕获组</strong>。替换时用 <code>$1</code>、<code>$2</code> 引用它们，第几个括号就是几号。</p></section>
<section><h2>例子：折叠思维链<a href="#例子折叠思维链"><span>#</span></a></h2><ul>
<li>查找：<code>/&lt;think&gt;([\s\S]*?)&lt;\/think&gt;/g</code></li>
<li>替换为：<code>&lt;details&gt;&lt;summary&gt;思考&lt;/summary&gt;$1&lt;/details&gt;</code></li>
</ul><p><code>([\s\S]*?)</code> 抓住了标签中间的内容，替换时用 <code>$1</code> 放回去。</p></section>
<section><h2>例子：给对白上色<a href="#例子给对白上色"><span>#</span></a></h2><ul>
<li>查找：<code>/「([^」]+)」/g</code></li>
<li>替换为：<code>&lt;span style="color:#d4a"&gt;「$1」&lt;/span&gt;</code></li>
</ul></section>
<section><h2>可用的引用<a href="#可用的引用"><span>#</span></a></h2>

<table><thead><tr><th>写法</th><th>意思</th></tr></thead><tbody><tr><td><code>$1</code>～<code>$9</code></td><td>第 1～9 个捕获组</td></tr><tr><td><code>$0</code> 或 <code>{{match}}</code></td><td>整个匹配到的内容</td></tr><tr><td><code>$&lt;名字&gt;</code></td><td>命名捕获组，查找里写成 <code>(?&lt;名字&gt;...)</code></td></tr></tbody></table></section>
<section><h2>不想被捕获的括号<a href="#不想被捕获的括号"><span>#</span></a></h2><p>只是为了分组、不需要引用的括号，写成 <code>(?: )</code>，不占编号：</p><p><code>/(?:你好|您好)，(\S+)/</code> 里，<code>$1</code> 是名字，不是问候语。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>编号数错了</strong>：嵌套括号按<strong>左括号</strong>出现的顺序编号；</li>
<li><strong>引用不存在的组</strong>：结果不可预料，多数时候变成空，内容凭空消失，见 <strong>pit-dollar</strong>；</li>
<li><strong>替换内容里本来就有美元符号</strong>：比如价格「$100」，会被当成第 100 个捕获组而变成空，见 <strong>pit-dollar</strong>；</li>
<li><strong>替换内容里有宏</strong>：替换结果最后还会做一次宏替换，<code>{{user}}</code> 会变成名字。</li>
</ul><hr /></section>
<section><h2>酒馆正则<a href="#酒馆正则"><span>#</span></a></h2><p>酒馆正则就是「自动查找替换」：在消息<strong>显示前</strong>或<strong>发给 AI 前</strong>，按规则把一段文字换成另一段。卡片的美化、状态栏、隐藏思维链，基本都靠它。</p></section>
<section><h2>正则在哪<a href="#正则在哪"><span>#</span></a></h2><p>酒馆顶部的扩展图标（三个方块）→「正则」。里面分三组：</p>

<table><thead><tr><th>分组</th><th>存在哪</th><th>作用范围</th></tr></thead><tbody><tr><td>全局正则</td><td>你的酒馆设置</td><td>所有角色、所有聊天</td></tr><tr><td>局部正则</td><td>角色卡里</td><td>只对这张卡，<strong>需要允许才生效</strong>，见 <strong>pit-allow-scripts</strong></td></tr><tr><td>预设正则</td><td>预设里</td><td>用这个预设时</td></tr></tbody></table><p>写卡时做的正则都是<strong>局部正则</strong>，会跟着卡导出。</p></section>
<section><h2>一条正则的设置项<a href="#一条正则的设置项"><span>#</span></a></h2>

<table><thead><tr><th>设置</th><th>意思</th></tr></thead><tbody><tr><td>查找正则表达式</td><td>要找的文字规则，见 <strong>regex-flags</strong></td></tr><tr><td>替换为</td><td>换成什么，可以用 <code>$1</code> 引用捕获组，见 <strong>regex-groups</strong></td></tr><tr><td>修剪掉</td><td>替换前先从匹配内容里删掉的文字</td></tr><tr><td>作用范围</td><td>对哪些内容生效：用户输入、AI 输出、快捷命令、世界书、推理</td></tr><tr><td>仅影响显示 / 仅影响后端提示词</td><td>只改看到的，还是只改发给 AI 的，见 <strong>regex-scope</strong></td></tr><tr><td>在编辑时运行</td><td>手动编辑消息后也执行</td></tr><tr><td>最小深度 / 最大深度</td><td>只对某几层消息生效，见 <strong>regex-depth</strong></td></tr><tr><td>正则表达式查找时的宏</td><td>查找内容里的 <code>{{user}}</code> 等要不要先替换</td></tr></tbody></table></section>
<section><h2>常见用途<a href="#常见用途"><span>#</span></a></h2><ul>
<li><strong>美化显示</strong>：给对白、动作、心理上颜色；</li>
<li><strong>隐藏或折叠思维链</strong>；</li>
<li><strong>状态栏、选项按钮</strong>：把标签换成界面，见 <strong>card-frontend</strong>；</li>
<li><strong>清理历史</strong>：把界面标签、旧的变量更新命令从发给 AI 的内容里删掉，省 token。</li>
</ul><p>常用写法直接抄 <strong>regex-cheatsheet</strong>。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-5"><span>#</span></a></h2><ul>
<li><strong>局部正则没被允许</strong>：导入卡时弹窗问「是否启用」，点了否就不生效，见 <strong>pit-allow-scripts</strong>；</li>
<li><strong>只替换了第一个</strong>：查找内容不带 <code>g</code> 标志时只换第一处，见 <strong>regex-flags</strong>；</li>
<li><strong>作用范围漏勾</strong>：只勾「AI 输出」时，玩家自己发的消息不会被处理（开场白算 AI 输出）；</li>
<li><strong>预设正则改完不生效</strong>：要重新加载聊天。</li>
</ul><hr /></section>
<section><h2>正则勾错了作用范围<a href="#正则勾错了作用范围"><span>#</span></a></h2><p><strong>现象</strong>：正则在测试模式里明明能匹配，实际聊天里就是不生效；或者只对一部分消息生效。</p></section>
<section><h2>为什么<a href="#为什么"><span>#</span></a></h2><p>正则的「作用范围」决定它处理哪些内容，没勾的就不会处理：</p>

<table><thead><tr><th>作用范围</th><th>处理的内容</th></tr></thead><tbody><tr><td>用户输入</td><td>玩家发的消息</td></tr><tr><td>AI 输出</td><td>AI 的回复，<strong>包括开场白</strong></td></tr><tr><td>快捷命令</td><td>斜杠命令产生的文字，一般用不到</td></tr><tr><td>世界书</td><td>世界书条目发给 AI 前的内容</td></tr><tr><td>推理</td><td>模型的思考过程（单独显示的那块）</td></tr></tbody></table></section>
<section><h2>常见搞错的情况<a href="#常见搞错的情况"><span>#</span></a></h2><ul>
<li><strong>想处理玩家的消息，只勾了 AI 输出</strong>：玩家消息里的标签原样留着；</li>
<li><strong>想隐藏思考过程，只勾了 AI 输出</strong>：新版酒馆把思考过程单独存放，要勾「推理」；</li>
<li><strong>想改世界书内容，勾了世界书但选了「仅影响显示」</strong>：世界书内容从来不显示，只会发给 AI，所以世界书的正则**必须勾「仅影响后端提示词」**才会执行；</li>
<li><strong>世界书正则设了深度</strong>：只有插入在 @D 深度的条目才有深度，其他位置的条目不受深度限制影响。</li>
</ul></section>
<section><h2>怎么办<a href="#怎么办"><span>#</span></a></h2><ul>
<li>新建正则时先想清楚：这条要处理谁的文字？</li>
<li>界面类正则一般勾「AI 输出」；如果玩家消息里也会有对应标签，再勾「用户输入」；</li>
<li>用「测试模式」只能验证查找和替换本身，作用范围要在聊天里实测。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-6"><span>#</span></a></h2><ul>
<li><strong>从老卡复制来的正则用了已废弃的范围</strong>：早期版本有「仅格式化显示」这种范围，现在改成了单独的选项，导入后要重新检查；</li>
<li><strong>以为开场白不算 AI 输出</strong>：开场白和备选开场白都按 AI 输出处理；</li>
<li><strong>正则对旧消息不生效</strong>：显示类正则要刷新或重新进入聊天才对已有消息重新计算。</li>
</ul><hr /></section>
<section><h2>正则把聊天原文永久改掉了<a href="#正则把聊天原文永久改掉了"><span>#</span></a></h2><p><strong>现象</strong>：</p><ul>
<li>编辑消息时发现原文里的标签、更新命令不见了，变成了一大段 HTML；</li>
<li>MVU 读不到更新命令，变量不动；</li>
<li>AI 下一轮看到的历史里塞满了界面代码，开始胡乱模仿。</li>
</ul></section>
<section><h2>为什么<a href="#为什么-1"><span>#</span></a></h2><p>正则的「仅影响显示」「仅影响后端提示词」<strong>两个都不勾</strong>时，这条正则会在消息生成（或发送）的那一刻<strong>直接改写消息本身</strong>，而且改了就回不去了，见 <strong>regex-scope</strong>。</p><p>界面类的正则（状态栏、选项、美化）如果这样设置：</p><ul>
<li>原来的标签被替换成 HTML，存进了聊天记录；</li>
<li>依赖原文的东西（MVU 的更新命令、其他正则）全找不到原文了；</li>
<li>这段 HTML 还会被当作历史发给 AI。</li>
</ul></section>
<section><h2>怎么办<a href="#怎么办-1"><span>#</span></a></h2>

<table><thead><tr><th>正则用途</th><th>正确设置</th></tr></thead><tbody><tr><td>把标签变成界面</td><td>仅影响显示</td></tr><tr><td>把标签从发给 AI 的历史里删掉</td><td>仅影响后端提示词</td></tr><tr><td>显示和发送都不要</td><td>两个都勾</td></tr></tbody></table><p>已经被改坏的旧消息只能手动编辑恢复，或者开新聊天。</p></section>
<section><h2>写卡时怎么避免<a href="#写卡时怎么避免"><span>#</span></a></h2><ul>
<li>界面正则一律勾「仅影响显示」；</li>
<li>「两个都不勾」只留给真的想改写原文的情况（很少见）；</li>
<li>发卡前编辑一条 AI 消息看看原文，确认标签还在。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-7"><span>#</span></a></h2><ul>
<li><strong>从别的卡复制正则过来</strong>：别人的设置不一定对，复制后逐条检查；</li>
<li><strong>两个都勾 ≠ 两个都不勾</strong>：两个都勾是「显示和发送都改、原文不动」，两个都不勾才是改原文；</li>
<li><strong>开场白也会被改</strong>：开场白在开局时也会被「两个都不勾」的正则改写。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/tavern-basics/</id>
      <title type="text">酒馆入门</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/tavern-basics/"/>
      <summary type="text">什么是角色卡、新手第一张卡、提示词组装、术语表与 Token 基础</summary>
      <content type="html"><![CDATA[<section><h2>角色卡是什么<a href="#角色卡是什么"><span>#</span></a></h2><p>角色卡就是一份「给 AI 看的设定包」。你把它导入 SillyTavern（大家叫它「酒馆」），AI 就会照着里面的设定扮演角色、陪你聊天或跑剧情。</p><p>打个比方：AI 是演员，<strong>角色卡是剧本</strong>，<strong>预设是导演的要求</strong>，<strong>聊天记录是已经演过的戏</strong>。每次你发消息，酒馆会把这三样拼成一大段文字发给 AI，AI 接着往下演。具体怎么拼见 <strong>basics-prompt-assembly</strong>。</p></section>
<section><h2>一张卡里有什么<a href="#一张卡里有什么"><span>#</span></a></h2>

<table><thead><tr><th>部分</th><th>作用</th><th>什么时候发给 AI</th></tr></thead><tbody><tr><td>角色描述</td><td>角色是谁、长什么样、什么性格、和 {{user}} 什么关系</td><td>每轮都发</td></tr><tr><td>性格摘要、情景</td><td>补充性格关键词、当前所处的场景</td><td>每轮都发（很多卡留空）</td></tr><tr><td>开场白</td><td>聊天的第一条消息，可以有好几条备选</td><td>作为聊天记录的第一条</td></tr><tr><td>示例对话</td><td>给 AI 看「这个角色说话是什么样」</td><td>按设置发，见 <strong>card-example-dialogue</strong></td></tr><tr><td>世界书</td><td>地点、配角、规则等补充设定</td><td>常驻的每轮发，其余被关键词触发才发</td></tr><tr><td>系统提示、历史后置指令</td><td>卡作者给 AI 的额外指示</td><td>每轮都发，见 <strong>card-system-prompt</strong></td></tr><tr><td>正则</td><td>改写消息的显示或发给 AI 的内容</td><td>不发给 AI，是酒馆自己执行的</td></tr><tr><td>脚本</td><td>酒馆助手执行的代码，MVU 变量卡靠它</td><td>不发给 AI</td></tr><tr><td>创作者注释</td><td>写给玩家看的说明</td><td>不发给 AI，见 <strong>card-creator-notes</strong></td></tr></tbody></table></section>
<section><h2>卡的样子<a href="#卡的样子"><span>#</span></a></h2><ul>
<li><strong>PNG 图片</strong>：最常见。卡的全部内容藏在图片文件里，看起来就是一张头像，见 <strong>card-v2-v3</strong>；</li>
<li><strong>JSON 文件</strong>：纯文字，没有头像，方便查看和修改。</li>
</ul></section>
<section><h2>新手最容易误会的几点<a href="#新手最容易误会的几点"><span>#</span></a></h2><ul>
<li><strong>卡不是越长越好</strong>：每轮都发的部分越长，越挤占聊天记录的空间，AI 反而记不住前面聊了什么，见 <strong>tokens</strong>。</li>
<li><strong>写在卡里 ≠ AI 一定照做</strong>：AI 会被预设、聊天记录影响。重要的规则要写清楚、放对位置，见 <strong>worldbook-position</strong>。</li>
<li><strong>改了卡，旧聊天不一定跟着变</strong>：开场白、初始变量只在新开聊天时生效，见 <strong>pit-old-chat</strong>。</li>
<li><strong>界面和变量不归 AI 管</strong>：状态栏、按钮是正则和脚本做出来的，AI 只负责按格式输出文字，见 <strong>card-frontend</strong>。</li>
</ul><p>从零开始写一张卡，看 <strong>basics-first-card</strong>；看到不懂的词，查 <strong>basics-glossary</strong>。</p><hr /></section>
<section><h2>从零写一张卡：路线图<a href="#从零写一张卡路线图"><span>#</span></a></h2><p>第一次写卡，不知道从哪下手？按这个顺序来，每一步都有对应的词条可以细看。</p></section>
<section><h2>第 1 步：想清楚「这张卡玩什么」<a href="#第-1-步想清楚这张卡玩什么"><span>#</span></a></h2><p>先用一两句话回答三个问题：</p><ul>
<li><strong>谁</strong>：角色是谁？（「冷淡的落魄千金沈清」）</li>
<li><strong>在哪</strong>：什么世界、什么场景？（「民国上海，沈家破产后」）</li>
<li><strong>玩什么</strong>：玩家扮演谁、来干什么？（「{{user}}是新来的账房先生，帮她撑起铺子」）</li>
</ul><p>「玩什么」最容易被忽略。只有人设没有玩法的卡，聊几句就没话说了。</p></section>
<section><h2>第 2 步：写角色描述<a href="#第-2-步写角色描述"><span>#</span></a></h2><p>外貌、性格、说话方式、过去、和 {{user}} 的关系。重点是<strong>能指导 AI 怎么演</strong>的信息，而不是简历，见 <strong>card-description</strong>。</p></section>
<section><h2>第 3 步：写开场白<a href="#第-3-步写开场白"><span>#</span></a></h2><p>开场白决定第一印象，也决定 AI 后面的文风和篇幅。从一个具体场景切入，给 {{user}} 留出回应的空间，见 <strong>greeting-forms</strong>。</p></section>
<section><h2>第 4 步：把细节放进世界书<a href="#第-4-步把细节放进世界书"><span>#</span></a></h2><p>地点、配角、组织、物品……一条一条写，设好关键词。只有核心规则用常驻，见 <strong>worldbook-constant</strong> 和 <strong>worldbook-keywords</strong>。</p></section>
<section><h2>第 5 步（可选）：加玩法<a href="#第-5-步可选加玩法"><span>#</span></a></h2><ul>
<li>想要好感度、金钱、时间这类数值：用 MVU 变量，见 <strong>mvu-what</strong>；</li>
<li>想要状态栏、选项按钮、美化排版：做卡片前端，见 <strong>card-frontend</strong>；</li>
<li>想要说话风格更稳：加几段示例对话，见 <strong>card-example-dialogue</strong>。</li>
</ul></section>
<section><h2>第 6 步：导入酒馆实测<a href="#第-6-步导入酒馆实测"><span>#</span></a></h2><p>导出 PNG，导入酒馆，<strong>开新聊天</strong>，聊十几轮。看看：</p><ul>
<li>AI 有没有 OOC（不像这个角色）、有没有替 {{user}} 说话；</li>
<li>世界书该触发的有没有触发；</li>
<li>状态栏、按钮显示正常吗。</li>
</ul><p>遇到问题按 <strong>pit-checklist</strong> 一项项查。</p></section>
<section><h2>新手常犯的错<a href="#新手常犯的错"><span>#</span></a></h2><ul>
<li><strong>一上来就写几万字设定</strong>：先做一个能玩的小版本，玩起来再补；</li>
<li><strong>描述里写满「她很温柔、善良、可爱」</strong>：形容词没用，写具体行为和说话方式；</li>
<li><strong>开场白替 {{user}} 做了决定</strong>：「你决定留下来」这种话会让玩家出戏；</li>
<li><strong>只在 App 里看，没在酒馆里试</strong>：酒馆的显示和 App 预览不完全一样，一定要实测。</li>
</ul><hr /></section>
<section><h2>一次发给模型的都有什么<a href="#一次发给模型的都有什么"><span>#</span></a></h2><p>你每发一条消息，酒馆都会把<strong>一大段文字</strong>拼好发给模型。模型并不「记得」之前聊过什么，它每次都是从头读这一大段，然后写下一条回复。所以理解「这一大段里有什么、按什么顺序」，是写好卡的基础。</p></section>
<section><h2>默认的拼接顺序<a href="#默认的拼接顺序"><span>#</span></a></h2><p>用对话补全（OpenAI、Claude、Gemini、DeepSeek 这类接口）时，酒馆默认预设的顺序是：</p><ol>
<li><strong>主要提示词</strong>：比如「在 {{char}} 和 {{user}} 的虚构对话中写出 {{char}} 的下一条回复」。角色卡如果写了系统提示，默认会替换它，见 <strong>card-system-prompt</strong>；</li>
<li><strong>世界书（角色定义前）</strong>；</li>
<li><strong>用户设定描述</strong>：玩家给自己写的人设；</li>
<li><strong>角色描述</strong>；</li>
<li><strong>角色性格</strong>（性格摘要）；</li>
<li><strong>情景</strong>；</li>
<li><strong>辅助提示</strong>（预设里的一个自定义块）；</li>
<li><strong>世界书（角色定义后）</strong>；</li>
<li><strong>示例对话</strong>；</li>
<li><strong>聊天记录</strong>：开场白 + 你们聊过的内容；</li>
<li><strong>历史后置指令</strong>：放在最后、紧贴最新消息的指示。</li>
</ol><p>另外：</p><ul>
<li>世界书里位置设成「@D 深度」的条目、作者注释，会<strong>插进聊天记录中间</strong>（倒数第 N 条消息处），见 <strong>worldbook-position</strong>；</li>
<li>预设可以自己加很多块（文风要求、破限、输出格式……），也可以拖动改顺序，见 <strong>preset-order</strong>。</li>
</ul></section>
<section><h2>位置越靠后，影响越强<a href="#位置越靠后影响越强"><span>#</span></a></h2><p>模型对<strong>靠近末尾</strong>的内容最敏感。所以：</p><ul>
<li>「必须遵守的格式」「每次都要输出的标签」放在深度 0～4 或历史后置指令里，效果最好；</li>
<li>背景设定、人物资料放在前面（角色定义前后）就行，它们是「参考资料」。</li>
</ul></section>
<section><h2>每部分该写什么<a href="#每部分该写什么"><span>#</span></a></h2>

<table><thead><tr><th>位置</th><th>适合放</th></tr></thead><tbody><tr><td>角色描述</td><td>角色是谁、外貌、性格、说话方式、和 {{user}} 的关系</td></tr><tr><td>世界书（关键词触发）</td><td>地点、配角、物品、事件等「提到才需要」的细节</td></tr><tr><td>世界书（常驻）</td><td>世界观核心规则、MVU 变量规则与输出格式</td></tr><tr><td>示例对话</td><td>说话风格样本</td></tr><tr><td>开场白</td><td>第一个场景，定下文风和篇幅</td></tr><tr><td>历史后置指令</td><td>简短但必须每次遵守的要求</td></tr></tbody></table></section>
<section><h2>想亲眼看看<a href="#想亲眼看看"><span>#</span></a></h2><p>酒馆里 AI 回复右上角有一排小按钮，其中「提示词」（柱状图标，有时要先点「…」展开）能看到这一轮实际发出去的内容和每部分占多少 token。排查「AI 为什么不照设定来」时非常有用：先确认设定<strong>真的发出去了</strong>。</p><p>相关：<strong>tokens</strong>、<strong>preset-vs-card</strong></p><hr /></section>
<section><h2>术语表<a href="#术语表"><span>#</span></a></h2><p>写卡圈常见说法，按拼音和字母大致排序。不懂的词先查这里。</p>

<table><thead><tr><th>说法</th><th>意思</th><th>详见</th></tr></thead><tbody><tr><td>酒馆 / ST</td><td>SillyTavern，最常用的角色卡聊天前端</td><td><strong>what-is-card</strong></td></tr><tr><td>酒馆助手 / TH</td><td>酒馆扩展 JS-Slash-Runner，能运行卡里的脚本、渲染界面</td><td><strong>pit-allow-scripts</strong></td></tr><tr><td>角色卡 / 卡</td><td>给 AI 扮演用的设定包，通常是 PNG</td><td><strong>what-is-card</strong></td></tr><tr><td>世界书 / WI / 知识书</td><td>按关键词触发的补充设定</td><td><strong>worldbook-entry</strong></td></tr><tr><td>角色书</td><td>嵌在角色卡里的世界书</td><td><strong>pit-embedded-book</strong></td></tr><tr><td>蓝灯 / 绿灯</td><td>世界书条目的常驻 / 关键词触发</td><td><strong>worldbook-constant</strong></td></tr><tr><td>预设</td><td>规定提示词怎么拼、参数怎么设的配置</td><td><strong>preset-chat</strong></td></tr><tr><td>破限</td><td>预设里让模型放开写的提示词</td><td><strong>preset-chat</strong></td></tr><tr><td>开场白 / first_mes</td><td>聊天的第一条消息</td><td><strong>greeting-forms</strong></td></tr><tr><td>楼层</td><td>聊天里的一条消息，第 0 楼是开场白</td><td></td></tr><tr><td>深度 / @D</td><td>从最新消息往回数第几条</td><td><strong>worldbook-position</strong></td></tr><tr><td>token</td><td>模型计算长度的单位</td><td><strong>tokens</strong></td></tr><tr><td>上下文</td><td>每次发给模型的全部内容</td><td><strong>tokens</strong></td></tr><tr><td>宏</td><td><code>{{user}}</code> 这类占位符</td><td><strong>macros</strong></td></tr><tr><td>正则</td><td>查找替换规则，用来美化或清理消息</td><td><strong>regex-tavern</strong></td></tr><tr><td>局部正则</td><td>存在角色卡里的正则，需要允许才生效</td><td><strong>pit-allow-scripts</strong></td></tr><tr><td>MVU</td><td>变量框架，让卡有好感度、金钱等数值</td><td><strong>mvu-what</strong></td></tr><tr><td>stat_data</td><td>MVU 存变量的地方</td><td><strong>mvu-schema</strong></td></tr><tr><td>InitVar</td><td>MVU 的初始变量</td><td><strong>mvu-initvar</strong></td></tr><tr><td>状态栏</td><td>显示在回复里的变量面板</td><td><strong>mvu-statusbar</strong></td></tr><tr><td>前端 / 卡片前端</td><td>卡自带的按钮、面板、美化界面</td><td><strong>card-frontend</strong></td></tr><tr><td>OOC</td><td>出戏，不像这个角色了</td><td></td></tr><tr><td>抢话</td><td>AI 替 {{user}} 说话或做决定</td><td><strong>card-system-prompt</strong></td></tr><tr><td>AI 味</td><td>套话多、比喻堆砌的文风</td><td><strong>de-ai</strong></td></tr><tr><td>思维链 / CoT</td><td>模型正式回复前的思考过程</td><td><strong>regex-cheatsheet</strong></td></tr><tr><td>流式</td><td>回复一个字一个字蹦出来</td><td><strong>preset-params</strong></td></tr><tr><td>温度</td><td>控制回复随机程度的参数</td><td><strong>preset-params</strong></td></tr><tr><td>V2 / V3</td><td>角色卡格式版本</td><td><strong>card-v2-v3</strong></td></tr><tr><td>EJS</td><td>能按变量条件输出不同内容的模板写法</td><td><strong>ejs</strong></td></tr></tbody></table><hr /></section>
<section><h2>token 与上下文<a href="#token-与上下文"><span>#</span></a></h2></section>
<section><h2>token 是什么<a href="#token-是什么"><span>#</span></a></h2><p>模型不是按「字」算长度，而是按 <strong>token</strong>（可以理解为「词块」）算。粗略换算：</p><ul>
<li>中文：1 个字大约 1～1.5 个 token（不同模型不一样）；</li>
<li>英文：1 个单词大约 1～1.5 个 token。</li>
</ul><p>酒馆里很多地方会显示 token 数，比如角色卡编辑页底部、世界书条目右上角。</p></section>
<section><h2>上下文是什么<a href="#上下文是什么"><span>#</span></a></h2><p><strong>上下文</strong>就是「每次发给模型的全部内容」，有长度上限（比如 32k、128k token）。每次你发消息，酒馆都要把这些塞进去：</p><ol>
<li>预设里的提示词；</li>
<li>角色卡每轮都发的部分（描述、性格、情景、系统提示）；</li>
<li>常驻世界书 + 这轮被触发的世界书；</li>
<li>示例对话；</li>
<li>聊天记录（从最新的往回塞，塞不下的就丢掉）；</li>
<li>还要给模型的回复留空间（「最大回复长度」）。</li>
</ol><p>前面几项占得越多，能塞进去的聊天记录就越少，AI 就越「健忘」。</p></section>
<section><h2>写卡时怎么省<a href="#写卡时怎么省"><span>#</span></a></h2><ul>
<li><strong>每轮都发的内容要精炼</strong>：角色描述、常驻条目只放「每轮都必须知道」的东西；</li>
<li><strong>细节交给关键词条目</strong>：地点、配角、物品，提到才发，见 <strong>worldbook-constant</strong>；</li>
<li><strong>不要重复</strong>：同一段设定别在描述和世界书里各写一遍；</li>
<li><strong>界面标签别进历史</strong>：卡片前端的占位标签、状态栏代码要用正则从发给模型的内容里删掉，见 <strong>regex-scope</strong>；</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>世界书有预算</strong>：默认最多只占上下文的 25%，超了后面的条目直接不发，见 <strong>worldbook-budget</strong>。</li>
<li><strong>上下文长度别乱调</strong>：预设里的「上下文长度」超过模型实际上限，请求会报错，见 <strong>preset-params</strong>。</li>
<li><strong>中文比你想的贵</strong>：一张 5000 字的卡，光描述就可能占 6000 token 以上。</li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.xn--lzsp9b997b.fun/posts/posts/worldbook-guide/</id>
      <title type="text">世界书完全指南</title>
      <published>2026-10-26T00:00:00.000Z</published>
      <updated>2026-10-26T00:00:00.000Z</updated>
      <author><name>Aalily</name></author>
      <link rel="alternate" href="https://blog.xn--lzsp9b997b.fun/posts/posts/worldbook-guide/"/>
      <summary type="text">世界书条目、关键词、扫描深度、插入位置、递归与预算全解</summary>
      <content type="html"><![CDATA[<section><h2>世界书条目的结构<a href="#世界书条目的结构"><span>#</span></a></h2><p>世界书（也叫 World Info、知识书）是一本「设定字典」。里面每一条叫<strong>条目</strong>，平时不发给 AI，聊天里出现了关键词才把这条内容塞进提示词。这样大量设定只在需要时出现，省 token。</p></section>
<section><h2>一条条目由什么组成<a href="#一条条目由什么组成"><span>#</span></a></h2>

<table><thead><tr><th>字段</th><th>酒馆里叫</th><th>作用</th></tr></thead><tbody><tr><td>标题</td><td>标题 / 备注</td><td>给人看的名字，不发给 AI</td></tr><tr><td>关键词</td><td>主要关键字</td><td>聊天里出现这些词就触发，见 <strong>worldbook-keywords</strong></td></tr><tr><td>次要关键词</td><td>可选过滤器</td><td>配合逻辑做更精细的条件</td></tr><tr><td>内容</td><td>内容</td><td>触发后插入提示词的正文，见 <strong>worldbook-format</strong></td></tr><tr><td>触发方式</td><td>蓝灯 / 绿灯</td><td>常驻（每轮都发）或关键词触发，见 <strong>worldbook-constant</strong></td></tr><tr><td>位置</td><td>插入位置</td><td>插在提示词的哪里，见 <strong>worldbook-position</strong></td></tr><tr><td>深度</td><td>深度</td><td>位置选「@D」时，插在倒数第几条消息处</td></tr><tr><td>顺序</td><td>顺序</td><td>同一位置里谁前谁后，也影响预算优先级，见 <strong>worldbook-order</strong></td></tr><tr><td>概率</td><td>触发概率 %</td><td>触发后再掷一次骰子决定发不发，默认 100</td></tr><tr><td>递归选项</td><td>不可递归 / 防止进一步递归 / 延迟到递归</td><td>见 <strong>worldbook-recursion</strong></td></tr><tr><td>包含组</td><td>包含组 / 组权重</td><td>同组只取一条，见 <strong>worldbook-order</strong></td></tr><tr><td>时间效果</td><td>黏性 / 冷却 / 延迟</td><td>触发后持续几轮、多久不再触发、第几轮后才能触发，见 <strong>worldbook-timed</strong></td></tr><tr><td>扫描深度</td><td>扫描深度</td><td>本条单独设置往回看几条消息，见 <strong>worldbook-scan-depth</strong></td></tr></tbody></table><p>新建条目的默认值：顺序 100、位置「角色定义前」、深度 4、概率 100。</p></section>
<section><h2>一条好条目的样子<a href="#一条好条目的样子"><span>#</span></a></h2><ul>
<li><strong>一条只讲一件事</strong>：一个地点、一个配角、一条规则；</li>
<li><strong>关键词是聊天里真会出现的词</strong>：名字、别称、常见说法都加上；</li>
<li><strong>内容自成一体</strong>：AI 只看到这一条也能明白，不要写「如上所述」；</li>
<li><strong>标题写清楚</strong>：自己以后好找。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑"><span>#</span></a></h2><ul>
<li><strong>条目写好了没生效</strong>：先看世界书是否真的绑定到了角色，嵌在卡里的世界书导入时要选「导入」，见 <strong>pit-embedded-book</strong>；</li>
<li><strong>关键词太泛</strong>：比如「他」「门」，几乎每轮都触发，等于常驻；</li>
<li><strong>条目太多被挤掉</strong>：世界书有预算上限，见 <strong>worldbook-budget</strong>；</li>
<li><strong>条目被关掉了</strong>：条目左侧的开关、概率设成 0 都会让它不发。</li>
</ul><hr /></section>
<section><h2>条目写法：XML 包 YAML、description 留空<a href="#条目写法xml-包-yamldescription-留空"><span>#</span></a></h2><p>条目内容怎么写，AI 都能读。但写得有结构，AI 更容易分清「这是哪个设定」，不会把两个配角的特征搞混。</p></section>
<section><h2>推荐写法：标签包结构化文本<a href="#推荐写法标签包结构化文本"><span>#</span></a></h2><p>外面用一对标签包住，里面用「名称: 内容」的条目式写法：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;地点_北城&gt;</span></div></div><div><div><div>2</div></div><div><span>名称: 北城</span></div></div><div><div><div>3</div></div><div><span>氛围: 潮湿、霓虹、永远在下雨</span></div></div><div><div><div>4</div></div><div><span>势力: 青帮控制码头，巡捕房只管租界</span></div></div><div><div><div>5</div></div><div><span>要点:</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>- 夜里十一点宵禁</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>- 外地人进城要查良民证</span></div></div><div><div><div>8</div></div><div><span>&lt;/地点_北城&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>好处：</p><ul>
<li><strong>边界清楚</strong>：标签告诉 AI 这一段从哪开始、到哪结束；</li>
<li><strong>信息密度高</strong>：比整段散文省 token；</li>
<li><strong>方便修改</strong>：哪一项要改一眼就能找到。</li>
</ul></section>
<section><h2>标签命名<a href="#标签命名"><span>#</span></a></h2><ul>
<li>用「类别_名字」：<code>&lt;角色_沈清&gt;</code>、<code>&lt;地点_北城&gt;</code>、<code>&lt;规则_宵禁&gt;</code>；</li>
<li>同一张卡里风格统一；</li>
<li>中文、英文都可以，别用会和界面标签冲突的名字（比如 <code>&lt;options&gt;</code>）。</li>
</ul></section>
<section><h2>description 可以留空吗<a href="#description-可以留空吗"><span>#</span></a></h2><p>如果角色的设定已经完整放进世界书（常驻条目），角色卡的「描述」字段可以留空或只放一句摘要。这是很多大型卡的做法。</p><p>要点是<strong>不要重复</strong>：同一段设定在描述和世界书里各写一遍，既浪费 token，改的时候又容易只改一边，造成矛盾。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-1"><span>#</span></a></h2><ul>
<li><strong>嵌套太深</strong>：缩进好几层的 YAML，AI 读起来反而吃力，两层以内最好；</li>
<li><strong>写成说明书</strong>：「本条目用于描述北城」这种话是废话，直接写内容；</li>
<li><strong>在内容里写 {{char}} 指代配角</strong>：<code>{{char}}</code> 永远是卡的名字，配角要写名字；</li>
<li><strong>在条目里写 HTML</strong>：发给 AI 的内容用纯文字，界面的事交给正则。</li>
</ul><hr /></section>
<section><h2>关键词怎么设<a href="#关键词怎么设"><span>#</span></a></h2><p>关键词决定条目<strong>什么时候触发</strong>。设得好，设定在需要时准时出现；设得不好，要么永远不触发，要么每轮都触发。</p></section>
<section><h2>基本规则<a href="#基本规则"><span>#</span></a></h2><ul>
<li>一条可以有多个关键词，<strong>任意一个</strong>出现就触发；</li>
<li>默认不区分大小写；</li>
<li>最近几条消息里出现就算（看扫描深度，见 <strong>worldbook-scan-depth</strong>）。</li>
</ul></section>
<section><h2>选关键词的方法<a href="#选关键词的方法"><span>#</span></a></h2><ul>
<li><strong>名字 + 别称</strong>：「沈清、沈小姐、大小姐、清儿」；</li>
<li><strong>聊天里真会说的词</strong>：玩家不会说「北城行政区」，会说「北城」「城北」；</li>
<li><strong>避免太短太泛</strong>：单个字（「门」「刀」）几乎处处都有；</li>
<li><strong>英文名注意整词</strong>：见下面的「匹配整个单词」。</li>
</ul></section>
<section><h2>匹配整个单词<a href="#匹配整个单词"><span>#</span></a></h2><p>世界书设置里有「匹配整个单词」，新装酒馆<strong>默认开着</strong>。开着时：</p><ul>
<li>英文关键词要作为完整单词出现：关键词 <code>Tom</code> 不会匹配 <code>Tommy</code>；</li>
<li><strong>中文不受影响</strong>：中文没有空格分词，酒馆把汉字两边都当作「边界」，「北城」照样能在「我们去北城吧」里匹配到。</li>
</ul></section>
<section><h2>次要关键词与逻辑<a href="#次要关键词与逻辑"><span>#</span></a></h2><p>条目还可以设「可选过滤器」（次要关键词），配合逻辑使用：</p>

<table><thead><tr><th>逻辑</th><th>意思</th></tr></thead><tbody><tr><td>与任意</td><td>主关键词命中，<strong>且</strong>次要关键词任意一个也出现</td></tr><tr><td>与所有</td><td>主关键词命中，<strong>且</strong>次要关键词全都出现</td></tr><tr><td>非任何</td><td>主关键词命中，<strong>且</strong>次要关键词一个都没出现</td></tr><tr><td>非所有</td><td>主关键词命中，<strong>且</strong>次要关键词没有全部出现</td></tr></tbody></table><p>例子：主关键词「沈清」，次要关键词「生气、吵架」，逻辑「与任意」，就能做出「只在和沈清吵架时触发」的条目。</p></section>
<section><h2>正则关键词<a href="#正则关键词"><span>#</span></a></h2><p>关键词写成 <code>/北城|城北/</code> 这样两边带斜杠的形式，就按正则匹配，更灵活。正则关键词不受「匹配整个单词」「区分大小写」影响，大小写用末尾的 <code>i</code> 控制。</p></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-2"><span>#</span></a></h2><ul>
<li><strong>用角色名当关键词</strong>：酒馆会把说话人名字一起扫描，角色名每条消息都有，等于常驻，见 <strong>pit-wi-keywords</strong>；</li>
<li><strong>关键词里有空格或全角逗号</strong>：关键词用英文逗号分隔，全角逗号会被当成关键词的一部分；</li>
<li><strong>单个汉字当关键词</strong>：「刀」会匹配「刀疤」「剪刀」「刀子嘴」，几乎每轮都触发；</li>
<li><strong>只写了正式名称</strong>：玩家用昵称、简称时就不触发了。</li>
</ul><hr /></section>
<section><h2>插入位置与深度<a href="#插入位置与深度"><span>#</span></a></h2><p>条目触发后插在提示词的哪里，由「插入位置」决定。位置不同，AI 对它的重视程度也不同：<strong>越靠近最新消息，影响越强</strong>。</p></section>
<section><h2>全部位置<a href="#全部位置"><span>#</span></a></h2>

<table><thead><tr><th>酒馆里的名字</th><th>插在哪里</th><th>适合</th></tr></thead><tbody><tr><td>角色定义前（↑Char）</td><td>角色描述前面</td><td>世界观、背景设定（默认）</td></tr><tr><td>角色定义后（↓Char）</td><td>角色描述后面</td><td>对角色的补充设定</td></tr><tr><td>示例消息前（↑EM） / 示例消息后（↓EM）</td><td>示例对话前后</td><td>很少用</td></tr><tr><td>作者注释前（↑AN） / 作者注释后（↓AN）</td><td>作者注释的前后</td><td>配合作者注释使用</td></tr><tr><td>插入深度 @D</td><td>聊天记录里倒数第 N 条消息处</td><td>必须遵守的规则、输出格式</td></tr><tr><td>锚点</td><td>只在预设或其他地方用对应宏引用时出现</td><td>高级用法</td></tr></tbody></table></section>
<section><h2>深度（@D）怎么算<a href="#深度d怎么算"><span>#</span></a></h2><p>选「插入深度」时还要填深度数字，从最新消息往回数：</p><ul>
<li><strong>深度 0</strong>：在所有聊天记录的最后，紧贴着 AI 要写的回复，影响最强；</li>
<li><strong>深度 1</strong>：在最新一条消息之前；</li>
<li><strong>深度 4</strong>（默认）：在倒数第 4 条消息之前。</li>
</ul><p>@D 还可以选这段内容以什么身份插入：系统、用户、AI。一般用系统。</p></section>
<section><h2>怎么选<a href="#怎么选"><span>#</span></a></h2><ul>
<li><strong>背景资料</strong>（地点、人物、历史）：角色定义前后就行；</li>
<li><strong>必须每次遵守的规则</strong>（输出格式、变量更新、标签要求）：@D 浅深度，0～4；</li>
<li><strong>想让 AI 记得但别太强势的提醒</strong>：@D 4～8。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-3"><span>#</span></a></h2><ul>
<li><strong>预设关掉了世界书块</strong>：「角色定义前 / 后」的条目实际放在预设的「世界书（前）/ 世界书（后）」这两块里。有些预设把这两块关掉或删了，条目就算触发也发不出去，见 <strong>preset-order</strong>；</li>
<li><strong>深度 0 放太多</strong>：多条长内容挤在最后，会严重干扰 AI 的回复，甚至让它复读规则；</li>
<li><strong>深度设得比聊天记录还深</strong>：聊天刚开始只有两三条消息时，深度 10 的条目会被放在最前面；</li>
<li><strong>以为位置能解决一切</strong>：AI 不遵守，先确认条目真的触发并且发出去了，见 <strong>basics-prompt-assembly</strong>。</li>
</ul><hr /></section>
<section><h2>顺序与分组<a href="#顺序与分组"><span>#</span></a></h2></section>
<section><h2>顺序（order）<a href="#顺序order"><span>#</span></a></h2><p>每条条目有一个「顺序」数字，默认 100。它管两件事：</p><section><h3>1. 同一位置里的先后<a href="#1-同一位置里的先后"><span>#</span></a></h3><p>同一插入位置的多条条目，<strong>数字小的排在前面，数字大的排在后面</strong>。</p><p>例如三条都在「角色定义后」：顺序 10、50、200，发出去的顺序就是 10 → 50 → 200。数字大的离聊天记录更近，对 AI 的影响通常更强。</p></section><section><h3>2. 预算不够时谁先进<a href="#2-预算不够时谁先进"><span>#</span></a></h3><p>世界书总长度有上限（见 <strong>worldbook-budget</strong>）。酒馆会<strong>先处理数字大的条目</strong>，预算满了，数字小的就被挤掉。</p><p>所以：<strong>越重要的条目，顺序数字设得越大。</strong></p></section></section>
<section><h2>包含组（分组）<a href="#包含组分组"><span>#</span></a></h2><p>给几条条目填上同一个「包含组」名字，它们同时触发时<strong>只会发其中一条</strong>。适合互斥内容：</p><ul>
<li>天气：晴 / 雨 / 雪，只能有一个；</li>
<li>随机事件：每次只发生一件；</li>
<li>同一角色的不同阶段：好感度低 / 中 / 高的描述。</li>
</ul><section><h3>选哪一条<a href="#选哪一条"><span>#</span></a></h3><ul>
<li>默认按「组权重」随机抽，权重 100 和 50 的条目，被抽中的机会大约 2 : 1；</li>
<li>勾了「确定优先级」的条目优先，几条都勾了就选顺序数字最大的；</li>
<li>开了「使用群组评分」的话，匹配到关键词更多的条目胜出。</li>
</ul></section></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-4"><span>#</span></a></h2><ul>
<li><strong>以为数字小的更优先</strong>：恰好相反，预算优先给数字大的；</li>
<li><strong>常驻条目也参与预算排序</strong>：顺序小的常驻条目同样可能被挤掉；</li>
<li><strong>组名写错一个字</strong>：就成了两个组，互斥失效；</li>
<li><strong>组里放了常驻条目</strong>：常驻条目每轮都触发，会一直和同组条目抢位置。</li>
</ul><hr /></section>
<section><h2>扫描深度<a href="#扫描深度"><span>#</span></a></h2><p><strong>扫描深度</strong>决定酒馆往回看<strong>几条消息</strong>来找关键词。</p><ul>
<li>全局设置在世界书面板顶部的「扫描深度」，默认 2；</li>
<li>深度 2 表示只看最近两条消息（一般就是你刚发的和 AI 上一条回复）；</li>
<li>单条条目可以单独设置扫描深度，覆盖全局值。</li>
</ul></section>
<section><h2>太小和太大<a href="#太小和太大"><span>#</span></a></h2>

<table><thead><tr><th>设置</th><th>结果</th></tr></thead><tbody><tr><td>太小（1～2）</td><td>话题刚提过一句，下一轮就不触发了，AI 突然「忘了」</td></tr><tr><td>太大（10 以上）</td><td>很久以前提过的东西还一直触发，占着预算</td></tr></tbody></table></section>
<section><h2>怎么选<a href="#怎么选-1"><span>#</span></a></h2><ul>
<li>一般保持默认 2～4；</li>
<li>想让某个设定「提到后持续几轮」，与其加大扫描深度，不如用「黏性」，见 <strong>worldbook-timed</strong>；</li>
<li>重要的地点、人物关键词多加几个别称，比调大深度更有效。</li>
</ul></section>
<section><h2>扫描的是什么文字<a href="#扫描的是什么文字"><span>#</span></a></h2><ul>
<li>默认扫描聊天消息的正文；</li>
<li>「包括名称」开着时（默认开），每条消息前会带上说话人名字一起扫描，所以<strong>角色名、玩家名当关键词几乎每轮都触发</strong>；</li>
<li>条目里的「额外匹配来源」可以让它同时扫描角色描述、用户设定描述等。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-5"><span>#</span></a></h2><ul>
<li><strong>开场白也算消息</strong>：聊天刚开始时，开场白里的关键词会触发条目；</li>
<li><strong>AI 的回复也会被扫描</strong>：AI 自己提到的词同样会触发条目，这通常是好事；</li>
<li><strong>改扫描深度不生效</strong>：单条设置了扫描深度，就不再受全局值影响。</li>
</ul><hr /></section>
<section><h2>递归<a href="#递归"><span>#</span></a></h2><p><strong>递归</strong>：已经触发的条目，它的<strong>内容</strong>也会被拿去匹配别的条目的关键词。</p><p>例子：玩家说「去北城」，触发了「北城」条目；北城条目的内容里写着「青帮控制码头」，于是又触发了「青帮」条目。这就是一次递归。</p></section>
<section><h2>默认开不开<a href="#默认开不开"><span>#</span></a></h2><ul>
<li>全局开关在世界书面板的「递归扫描」；</li>
<li>新装的酒馆<strong>默认开着</strong>；</li>
<li>「最大递归深度」限制最多连锁几层，0 表示不限。</li>
</ul></section>
<section><h2>单条的三个递归选项<a href="#单条的三个递归选项"><span>#</span></a></h2>

<table><thead><tr><th>选项</th><th>效果</th><th>用在哪</th></tr></thead><tbody><tr><td>不可递归</td><td>本条<strong>不会被别的条目内容</strong>触发，只能被聊天触发</td><td>不想被连带出来的大段设定</td></tr><tr><td>防止进一步递归</td><td>本条的内容<strong>不再去触发</strong>别的条目</td><td>内容里提到很多名词的总纲、长条目</td></tr><tr><td>延迟到递归</td><td>本条<strong>只能被递归</strong>触发，聊天里直接提到不算</td><td>「提到 A 时顺带带出 B」的配套条目</td></tr></tbody></table></section>
<section><h2>什么时候用递归<a href="#什么时候用递归"><span>#</span></a></h2><ul>
<li><strong>好用的地方</strong>：人物条目里提到他的组织，组织条目自动跟上，AI 了解得更完整；</li>
<li><strong>危险的地方</strong>：条目越多、内容里提到的名词越多，连锁越长，一轮触发几十条，上下文直接被塞满。</li>
</ul></section>
<section><h2>建议<a href="#建议"><span>#</span></a></h2><ul>
<li>常驻的总纲条目开「防止进一步递归」：它提到所有地名和人名，不关的话每轮都会把所有条目带出来；</li>
<li>大段设定开「不可递归」，只让玩家真正聊到时才出现；</li>
<li>条目多的卡，先关掉递归测一遍，再按需打开。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-6"><span>#</span></a></h2><ul>
<li><strong>不知道递归开着</strong>：新装酒馆默认开，你以为只触发了一条，实际带出了一串。用 AI 回复上的「提示词」按钮看看实际发了什么；</li>
<li><strong>常驻条目引发连锁</strong>：常驻每轮都在，它内容里的关键词每轮都会触发别的条目；</li>
<li><strong>递归 + 预算</strong>：连锁带出的条目会抢预算，可能把真正重要的条目挤掉，见 <strong>worldbook-budget</strong>。</li>
</ul><hr /></section>
<section><h2>世界书预算：为什么条目没发出去<a href="#世界书预算为什么条目没发出去"><span>#</span></a></h2><p>世界书不能无限往提示词里塞，有一个<strong>预算上限</strong>。超出预算的条目，即使触发了也<strong>不会发出去</strong>。</p></section>
<section><h2>预算怎么算<a href="#预算怎么算"><span>#</span></a></h2><p>世界书面板顶部有两个设置：</p><ul>
<li><strong>上下文百分比</strong>：默认 25%。上下文长度 32000 时，世界书最多占 8000 token；</li>
<li><strong>Token 预算上限</strong>：再加一个固定上限，0 表示不限。</li>
</ul><p>两者取较小的那个。</p></section>
<section><h2>谁先进预算<a href="#谁先进预算"><span>#</span></a></h2><p>酒馆把这一轮所有触发的条目排队，<strong>顺序数字大的先进</strong>，一直加到预算满为止，后面的全部丢掉。</p><ul>
<li>正在「黏性」生效的条目排在最前面；</li>
<li><strong>常驻条目不享受特权</strong>，照样按顺序排队；</li>
<li>勾了「无视回复限额」的条目不占预算，总能进去。</li>
</ul></section>
<section><h2>怎么知道被挤掉了<a href="#怎么知道被挤掉了"><span>#</span></a></h2><ul>
<li>世界书设置里打开「溢出警报」，超预算时会弹提示；</li>
<li>用 AI 回复上的「提示词」按钮看实际发了什么。</li>
</ul></section>
<section><h2>解决办法<a href="#解决办法"><span>#</span></a></h2><ul>
<li><strong>精简条目</strong>：最有效。删掉重复的、啰嗦的内容；</li>
<li><strong>调大顺序数字</strong>：重要的条目顺序设大，保证先进预算，见 <strong>worldbook-order</strong>；</li>
<li><strong>关键的条目勾「无视回复限额」</strong>：比如 MVU 的变量规则，少了它变量就不更新了；</li>
<li><strong>提高上下文百分比</strong>：会挤占聊天记录，不建议超过 40%；</li>
<li><strong>减少递归连锁</strong>：见 <strong>worldbook-recursion</strong>。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-7"><span>#</span></a></h2><ul>
<li><strong>上下文长度设得小</strong>：预设里上下文只设了 8000，世界书 25% 只有 2000 token，稍微长点的卡就不够用；</li>
<li><strong>以为常驻一定会发</strong>：常驻条目顺序小、预算满了一样会被挤掉，见 <strong>pit-wi-budget</strong>；</li>
<li><strong>百分比填超过 100</strong>：酒馆会重置成 25。</li>
</ul><hr /></section>
<section><h2>常驻 vs 关键词触发<a href="#常驻-vs-关键词触发"><span>#</span></a></h2><p>世界书条目有两种触发方式，在条目上用一个小灯表示：</p><ul>
<li><strong>蓝灯 = 常驻</strong>：不看关键词，每轮都发；</li>
<li><strong>绿灯 = 关键词触发</strong>：最近几条消息里出现关键词才发。</li>
</ul></section>
<section><h2>各自适合什么<a href="#各自适合什么"><span>#</span></a></h2>

<table><thead><tr><th>方式</th><th>适合</th><th>例子</th></tr></thead><tbody><tr><td>常驻</td><td>每轮都必须知道的核心内容</td><td>世界观总纲、主角关系、MVU 变量规则和输出格式、文风要求</td></tr><tr><td>关键词</td><td>提到才需要的细节</td><td>地点、配角、物品、组织、历史事件、招式</td></tr></tbody></table></section>
<section><h2>判断方法<a href="#判断方法"><span>#</span></a></h2><p>问自己：<strong>如果这一轮 AI 不知道这条，会出错吗？</strong></p><ul>
<li>会，而且任何时候都会 → 常驻；</li>
<li>只有聊到相关话题才会 → 关键词。</li>
</ul></section>
<section><h2>常驻要控制总量<a href="#常驻要控制总量"><span>#</span></a></h2><p>常驻条目每轮都占上下文，加起来越多，能放的聊天记录越少。经验值：</p><ul>
<li>常驻总量控制在几百到两三千字；</li>
<li>单条常驻别写成长篇，拆成「总纲常驻 + 细节关键词」。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-8"><span>#</span></a></h2><ul>
<li><strong>常驻也受预算限制</strong>：常驻条目不是「一定会发」。预算满了，顺序靠后的常驻条目照样被挤掉，见 <strong>worldbook-budget</strong>；</li>
<li><strong>常驻也看概率</strong>：概率不是 100 的常驻条目，也会随机不发；</li>
<li><strong>关键词设成角色名字</strong>：酒馆默认会把说话人名字一起扫描（「包括名称」），角色名几乎每条消息都有，这条就等于常驻了，见 <strong>worldbook-keywords</strong>；</li>
<li><strong>全部设成常驻图省事</strong>：短卡没问题，条目一多就挤爆上下文，AI 反而抓不住重点。</li>
</ul><hr /></section>
<section><h2>世界书的几种绑定方式<a href="#世界书的几种绑定方式"><span>#</span></a></h2><p>酒馆里的世界书是独立的文件，要<strong>绑定</strong>到某个地方才会生效。同一本世界书可以绑在不同地方，作用范围不一样。</p></section>
<section><h2>四种绑定<a href="#四种绑定"><span>#</span></a></h2>

<table><thead><tr><th>绑定方式</th><th>在哪设置</th><th>作用范围</th></tr></thead><tbody><tr><td>全局世界书</td><td>世界书面板「已启用的世界书（全局有效）」</td><td>所有角色、所有聊天</td></tr><tr><td>角色世界书</td><td>角色面板的地球图标：主要世界书 + 附加世界书</td><td>只在和这个角色聊天时</td></tr><tr><td>聊天知识</td><td>角色面板上的护照图标（长按打开绑定窗口）</td><td>只在这一个聊天里</td></tr><tr><td>用户设定世界书</td><td>用户设定面板</td><td>用这个人设时</td></tr></tbody></table><p><strong>角色卡里自带的世界书</strong>，导入时会生成一本同名世界书文件，并绑成这个角色的「主要世界书」，见 <strong>pit-embedded-book</strong>。</p></section>
<section><h2>几本世界书同时生效时<a href="#几本世界书同时生效时"><span>#</span></a></h2><p>酒馆会把所有绑定的世界书合在一起扫描。排序看世界书设置里的「插入策略」：</p><ul>
<li><strong>角色世界书优先</strong>（新装默认）：角色的条目排在前面；</li>
<li><strong>全局世界书优先</strong>：全局的排在前面；</li>
<li><strong>均匀排序</strong>：大家混在一起按顺序数字排。</li>
</ul><p>预算是所有世界书<strong>共用</strong>的，见 <strong>worldbook-budget</strong>。</p></section>
<section><h2>写卡时注意<a href="#写卡时注意"><span>#</span></a></h2><ul>
<li>卡的设定放进卡自带的世界书，导出时才会带上；</li>
<li>附加世界书<strong>不会</strong>跟着卡导出，别人拿到卡时就缺了这部分；</li>
<li>文风、通用规则类的世界书适合做成全局，但别和卡的内容打架。</li>
</ul></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-9"><span>#</span></a></h2><ul>
<li><strong>全局世界书忘了关</strong>：玩别的卡时也会触发，设定串台。玩完某张卡记得取消全局；</li>
<li><strong>同一本世界书绑了两次</strong>：既是全局又是角色世界书，条目可能重复；</li>
<li><strong>改了导入后的世界书，卡里的没变</strong>：导入后的世界书是独立文件，在酒馆里改了它，要重新导出卡才会带上；</li>
<li><strong>重复导入同一张卡</strong>：可能生成多本同名世界书，绑定的不一定是你正在改的那本。</li>
</ul><hr /></section>
<section><h2>黏性、冷却、延迟<a href="#黏性冷却延迟"><span>#</span></a></h2><p>条目设置里的「黏性 / 冷却 / 延迟」三个数字，都以<strong>消息条数</strong>为单位，用来控制条目在时间上的表现。默认都是空（不生效）。</p></section>
<section><h2>黏性：触发后持续 N 条<a href="#黏性触发后持续-n-条"><span>#</span></a></h2><p>条目被触发后，接下来 N 条消息里<strong>不管还有没有关键词</strong>都保持触发。</p><ul>
<li>用途：玩家提了一句「去北城」，接下来几轮虽然没再说「北城」，但人还在北城，设定应该一直在；</li>
<li>比调大扫描深度更精准，只影响这一条；</li>
<li>预算排队时，黏性生效中的条目排在最前面。</li>
</ul></section>
<section><h2>冷却：触发后 N 条内不再触发<a href="#冷却触发后-n-条内不再触发"><span>#</span></a></h2><p>条目触发（黏性结束）后，接下来 N 条消息里即使出现关键词也<strong>不触发</strong>。</p><ul>
<li>用途：随机事件、突发状况，避免每轮都发生；</li>
<li>配合概率使用效果更好：「30% 概率触发，触发后冷却 10 条」。</li>
</ul></section>
<section><h2>延迟：聊天至少 N 条后才能触发<a href="#延迟聊天至少-n-条后才能触发"><span>#</span></a></h2><p>聊天记录不到 N 条时，这条<strong>怎么都不触发</strong>。</p><ul>
<li>用途：中后期才出现的剧情、秘密，开局就触发会剧透；</li>
<li>比如延迟 20：聊到第 20 条消息以后，关键词才开始起作用。</li>
</ul></section>
<section><h2>组合例子<a href="#组合例子"><span>#</span></a></h2>

<table><thead><tr><th>需求</th><th>设置</th></tr></thead><tbody><tr><td>进入某地后设定持续一阵</td><td>关键词「北城」+ 黏性 5</td></tr><tr><td>偶尔下雨，别天天下</td><td>常驻 + 概率 20 + 冷却 8</td></tr><tr><td>聊久了才揭露的身世</td><td>关键词「父亲」+ 延迟 30</td></tr></tbody></table></section>
<section><h2>容易踩的坑<a href="#容易踩的坑-10"><span>#</span></a></h2><ul>
<li><strong>单位是消息条数，不是「轮」</strong>：你一条、AI 一条，一轮就是两条；</li>
<li><strong>删消息、重新生成会影响计数</strong>：测试时结果可能和你想的不一样；</li>
<li><strong>延迟是看总消息数</strong>：开新聊天才会从头算，旧聊天早就超过了；</li>
<li><strong>黏性条目不受关键词约束</strong>：黏性期间即使话题已经换了，它还在占位置，数字别设太大。</li>
</ul></section>]]></content>
    </entry>
</feed>
