聊天分支
分支是聊天截至某条消息的一份副本。想试试另一条走向、同时让原聊天保持不变时,就用分支。本指南介绍分支的创建、切换、查看、改名、删除、导出和导入。
同一个聊天的所有分支会归到一组。在聊天列表里,聊天仍只占一行,旁边显示分支数量。只要组内至少有一个分支记录了它源自哪个聊天,点击数量就能打开分支树;没有这项记录的分支直接放在聊天下面。如果组内没有任何分支有这项记录(较早的或导入的分支),这一组就始终只占一行,要从 Chat Branches(聊天分支) 打开它的分支。从分支再开的分支会嵌套在它下面,所以你看到的是一棵树。每个分支都有显示名称和最后活跃时间,所以可以把它们标成“友好结局”和“黑暗结局”。显示名称和聊天名称是两回事。Game 聊天组始终只占一行,因为 Game 会话是编号的会话,不是分支。
从这里分支
- 点一下消息(在电脑上把鼠标指向它),调出消息操作栏。
- 点击 Branch from here(从这里分支),图标是一个小的分叉符号。
Marinara 会把截至这条消息(含这条)的聊天复制成一个名为 New Branch 的新分支。之后可以改名。
新分支:
- 模式、角色、用户角色、提示词预设和连接都保持不变。
- 复制每一条消息,包括全部备选回复,以及当前激活的是哪一条。见消息操作。
- 复制与这些消息绑定的追踪器状态和游戏状态。
- 在 Roleplay 聊天里保留 Advanced Memory 已经做好的工作。更早的、已经结束的场景的记忆仍然可以回忆。你作为分支起点的那个场景会重新变成进行中的场景,它原来的记忆会被丢弃。见记忆功能与聊天摘要。
- 留在来源聊天所在的同一个聊天文件夹里。
按天和按周的摘要不会带过来。完全落在被复制消息范围之内的滚动摘要会带过来。跨过分支点的摘要,以及没有消息数据的旧摘要,都不会带过来,新分支会重新生成这些摘要。
如果没有成功:场景聊天里不会出现 Branch from here,场景聊天有的是 Clone from here(从这里克隆)。见场景:分支出一段角色扮演。
Chat Branches 区域
打开 Chat Settings(聊天设置),展开 Chat Name(聊天名称) 下方的 Chat Branches。它的标题显示分支数量。在电脑上可以把它弹出为独立窗口。见聊天设置。
这个区域列出这个聊天的每个分支,你正在看的排在最前面。每行显示显示名称和最近更新时间。点击某一行就会切换到那个分支。
列表上方的按钮:
| 按钮 | 作用 |
| Branch graph(分支图) | 打开分支图窗口。见下文。 |
| JSONL、Text、Markdown、Story | 导出你正在看的分支。见导出与导入聊天。 |
| Export a range(导出指定范围) | 导出聊天的一部分。Game 中没有。见导出与导入聊天。 |
| Import(导入) | 把一个 .jsonl 文件添加为新分支。见下文。 |
| Stats(统计) | 打开你正在看的分支的聊天统计。 |
查看分支图
分支图能显示每个分支从哪里分出,这一点列表做不到。
- 打开 Chat Branches,点击 Branch graph。再点一次就会关闭分支图。
分支图在独立窗口中打开,可以移动和调整大小。在手机上,它以底部面板的形式打开。组内每个聊天各占一行,顺序与聊天列表相同。消息从左向右排列,每条消息一个圆点。
- 灰点是你的消息,强调色圆点是角色回复,空心圆环是旁白或系统消息。
- 每个分支只绘制它自己的消息。一条线把它连到分叉起点的那条消息上。
- 没有记录分叉点的分支会用虚线从最上面的聊天连出来,图例显示 Fork not recorded(未记录分叉点)。较早的分支和来源聊天已被删除的分支都属于这种情况。
- 没有分叉的长消息段会折叠成 ··· N ··· 标记,N 是隐藏的消息数量。点击标记就会显示这些消息。Expand all(全部展开) 展开所有消息段,Collapse long runs(折叠长消息段) 再把它们折叠起来。
- 分叉点和每个分支的最新消息都带圆环。点一下、指向它或用键盘聚焦它,可以看到消息编号、作者和开头文字。
- 点击分支名称或所在行即可切换到该分支。你正在看的分支会高亮。
创建分支、改名或删除聊天时,分支图会更新;新消息到达后不久也会更新。
给分支改名
- 在 Chat Branches 中,点击分支那一行的铅笔按钮。
- 在 Rename Branch(重命名分支) 对话框(“Set a display name for this chat branch.”)里输入新名称。
- 点击 Rename(重命名)。
名称为空或没有改动时会被忽略。
删除一个分支
- 在 Chat Branches 中,点击分支那一行的垃圾桶按钮。
- 在 Delete Branch(删除分支) 对话框(“Delete this branch? Messages will be lost.”)里点击 Delete(删除)。
这只会删掉这个分支和它的消息,其他分支保持不变。
有两个或更多分支时,区域底部会出现 Delete All Branches(删除全部分支)。它会问“Delete all N branches? This cannot be undone.”用 Delete All(全部删除) 确认。也可以从聊天列表动手:删除带分支的聊天时,会提供 Delete This Branch Only(只删除这个分支) 和 Delete All N branches(删除全部 N 个分支)。见管理聊天列表。
把文件导入成新分支
- 在 Chat Branches 中点击 Import。
- 选择一个从 SillyTavern 或 Marinara 导出的
.jsonl文件。
Marinara 会把它添加成当前聊天组里的一个新分支,显示“Imported N messages as a new branch”,然后切换到这个分支。
分支之间如何关联
这一节写给基于分支数据做开发的人。
- 每个分支都会记录它的直接来源聊天,以及分叉发生在哪条消息上。来源消息的 ID 和复制后消息的 ID 都会保留,所以即使复制出来的消息拿到了新 ID,集成方也能找到分叉边界。
- 从一个分支再开分支时,记录的父级是那个分支,而不是最初的根聊天。
- 只要组内至少有一个分支记录了来源,点击聊天列表里的数量就会打开分支树。来源不明的分支直接放在聊天下面。没有任何已知来源的聊天组只占一行,它的分支要从 Chat Branches 进入。
- 删除父聊天不会改变子分支记录的来源。删除整个分支组会删掉组里的每一个聊天。