检查世界
一个世界即使格式正确,也可能有别的问题:角色设定只有一行、导入漏掉了卡片中的事实,或者两个数值追踪的是同一件事。检查套件用来查找这些问题。你可以在世界的创作聊天里输入命令来运行它,创作助手也能通过工具调用。每次角色卡导入和更新都会自动运行快速检查。
检查不会修改世界的创作内容,只会把最近一次结果保存在 .checks/results.json。助手会用平常的编辑工具修复发现的问题,每次修改仍会照常先征得你的同意。
命令
在世界的创作聊天里输入:
| 命令 | 运行内容 |
|---|---|
/check 或 /check-all | 四个检查包全部运行 |
/check-world | 一致性检查包 |
/check-card | 对照检查包(需要这个世界导入时用的角色卡) |
/check-quality | 质量检查包 |
/check-play | 可玩性检查包 |
命令后面加的内容会交给助手。加上 deep(/check-quality deep)会让模型参与;不加时只运行由程序判定的检查,当快速检查的结果显示世界内容 单薄时,助手也会自己打开 deep。助手会运行检查、阅读发现的问题、修正明显有误之处、对需要做选择的先询问你,然后再运行同一项检查加以确认,最后告诉你发现了什么、改了什么、还剩什么。
四个检查包
一致性由程序判定,成本很低,始终可以运行:
world-valid:每个文件都能读取,每处指向某样东西的引用都指向确实存在的东西,与开始故事时的检查完全一样。它会指出世界中第一个有问题的部分,所以修好之后可能会显示下一部分的问题。world-graph:无人能到达或离开的地点、没有返程的通路、钥匙不存在的锁、同名的角色、地点或物品。duplicate-values:对同样的对象含义相同的追踪数值(hp和health)。保留哪一个需要选择,所以这条发现只列出两者,不做改动。name-clashes:某个别名恰好是另一个角色的名字,两个组织或两个背景条目同名。duplicate-values-meaning(deep):用不同说法或另一种语言写成的同一个追踪数值(生命值和vigor),duplicate-values背后的对照表认不出它们。name-near(deep):可能是同一个条目被用不同名称写了两遍的两个角色、地点、组织或物品(The Mill和Old Mill)。lore-conflict(deep):说法无法同时成立的两个背景条目。日期不重叠的条目不会被比较;发现会引用两个条目 里各自冲突的那段原文,引文不在条目里就会被拒绝。unread-fields:角色、地点、组织、物品或背景文件里没有任何东西会读取的字段,例如格式里是start.location却写成了starting_location。这些内容永远进不了故事,所以发现会指出字段名,助手再把内容移到真正承载它的字段里。助手自己的写入(create_world_element、replace_world_element)会拒绝这样的字段,并列出格式会读取的字段,所以这种字段一开始就写不进去。
上面标了 deep、用来找“换了说法的同一件事”的三个检查分两步:已选择嵌入提供方时,由它找出含义最接近的配对,并按“比每个条目与其近邻更接近多少”排序,使同一主题的世界里重复的那一份也能排到前面(每个检查 12 对,世界较大时更多,至多 30 对;name-near 对每一类事物分别取),因为接近只说明两段文字谈的是同一个主题——信任和好感很接近,却不是同一个数值。随后由决策模型对每一对回答是非;它没有把握的交给语言模型。lore-conflict 里决策模型只有非常确定时才能排除一对,因为随后的语言模型本来就要引用两个条目里的原文。没有嵌入提供方时,duplicate-values-meaning 会询问它能取到的前几对,name-near 仍按名称比较,lore-conflict 会被跳过。向量按文本保存在世界的 .checks 文件夹里,所以再次运行只会嵌入有变化的内容。
world-prompts:世界自带的提示词必须是产品里有的提示词、不能为空,并且只使用该提示词被提供的变量。
对照把世界与它导入时用的角色卡(保存在世界的 .import 文件夹里)对照,或与等 待更新这个世界的较新角色卡对照(/check-card 和 check_card 工具可以用 version: new):
card-coverage:导入为世界读取的每个片段都变成了某样东西。没有任何内容来自的片段,是被悄悄丢掉或略去了。运行时有模型也有嵌入提供方的话,与世界里任何内容都没有共同词语的片段(卡用另一种语言写成,或被改写过)会先按含义去找:让最接近的几份文档回答它们是否说了这个片段所说的内容,只有没有任何文档说到的片段才会被报告。card-names:世界里的每个角色、地点、组织和物品,在卡里的某处都有出现。如果大多数名字都找不到,它只会说一次:世界很可能用的语言与卡不同。card-numbers:片段中给出的数字(年龄、年份、数量)出现在由它生成的内容里。card-update:有较新的卡等待时,新卡改动或新增了、而世界里还没有写到的内容,以及只由已被删除的片段生成的内容。card-fidelity(deep):对由卡生成的每份文档,模型列出卡里陈述而文档丢失的事实,以及文档陈述而卡里没有给出的事实。每条事实都附带一段引文,引文如果不在它声称出自的文本里就会被拒绝。随后每条事实还会作为是非题交给另一份文本去核对(先由判定模型回答,拿不准时交给语言模型),所以换了说法或换了语言仍然写着的事实不会被报告。一次运行至多对比 40 份文档,先比对来源最多的,并说明漏掉了多少。
质量根据现有内容,判断这个世界是否足以游玩:
quality-cast:有人可以扮演,重要的角色不止有简介和说话方式,没有两个角色共用同一 段简介。quality-places:没有描述、或只有一行描述且没有特征的地点。quality-world:简介、标签和开场。sheet-playable(deep):对每个主要和次要角色,设定是否说明了他是谁、怎么说话、想要什么。导入设置选用了决策模型、并且它有把握时,可以由决策模型回答;它没有把握的交给语言模型。world-gaps(deep):模型阅读世界的概要,指出要玩得好还缺什么:无事可做的地点、无人承担的冲突。每个缺口都指明它涉及的角色、地点或条目,以及补上什么。它不会用来源里没有的内容去填补缺口。
可玩性针对玩家可扮演的每个角色,看故事如何开始:
first-scene:角色从世界里的某个地点开始,该地点有出路,并且有其他人、物品或特征可供行动。没有出路的开局是警告;独自开局只会被提及。opening-playable(deep):模型阅读开场白和这个第一场景,判断玩家是否知道自己身在何处、是否有事可做。决策模型有把握时可以回答,与sheet-playable相同。它最多读前三个可扮演角色。
每条发现都有严重程度(error、warning 或 info)、代码、位置、说明,以及(修法明确时的)提示。error 是需要修复的;warning 是需要去看的线索;info 只需一提。
试玩
检查读的是文件。世界编辑器顶部的 试玩 会真正玩 一遍:用该世界以其中一个可扮演的角色开一个存档,玩 1 到 10 个回合,其中试玩者选取故事自己给出的建议(没有建议时就做一个普通动作),然后给出报告:
- 试玩者走到了哪里:到过和没到过的地点,以及已触发和仍在等待的触发器;
- 从开始到结束发生了什么变化(位置、谁拿着什么、被追踪的数值、线索、关系、约定),以及每个回合用了多久,明显慢于其他回合的会被点名;
- 不需要模型的检查对这个世界的结论(一致性、质量、可玩性);
- 途中出了什么问题,例如某个回合没有结束,或某个回合没有建议。
开始之前,对话框会说明代价:每个回合都是用你所选模型的完整回合,一个接一个地进行,所以耗时与实际玩这几个回合相同,使用相同的模型和限制。同一时间只会运行一次试玩,本回合结束后停止 可以提前结束。试玩用的存档和其他存档一样创建,试玩结束后删除,因此不会留在你的存档里;世界只会被读取。如果程序在试玩期间停止,它的存档会以“Playtest”开头的名字留在存档列表里,可以在那里删除。
一个试玩者玩几个回合并不能覆盖整个世界:它只能说明开场是否通向某处,以及前几个场景里的一条路径是否走得通。