Decision 模型

Decision 模型是一种小模型,替 Marinara 回答是或否的问题,例如“Does the latest message move the scene to a new place?”这类问题。世界书、自定义智能体、提示词和群聊都会用到它。它是可选的。没有它,聊天照常进行,各功能会采用 Marinara 在哪里使用它中说明的备用行为。

它的答案控制 Marinara 的行为,从不会发到聊天里。它给一条陈述打 0 到 1 的分数。Marinara 把这个数字和阈值比较,把结果当作是或否。它也可以从一个简短的列表里挑出一个答案,例如“angry”、“sad”或“none of these”。

我们的建议:拿不准就保持 None(无)。想用判定的话,就用你可能已经有的内置模型,或者你已在运行的服务器上的聊天模型。两者都不产生额外费用。

选择 Decision 模型

开始之前,先看如何选择。

  1. 点击顶栏里的 Connections(连接),打开 Jobs(分工) 框。
  2. 在 Behind the scenes(幕后) 下点击 Decision(判定) 行,会打开一个列表。
  3. 选一个模型。列表分三组:
  1. 要测试它,点击这一行上的 Decision settings(判定设置) 齿轮,再点击 Test(测试)。这个按钮出现在内置模型的条目上。TypeSafe 或 OpenRouter 账号要在它的模型上打开 Edit model(编辑模型),点击 Test provider(测试服务商)。Own decision server(自有判定服务器) 账号则用账号 ⋯ 菜单里的 Test。

测试通过时,会显示“是”的概率和回答耗时。如果是你电脑上的模型,还会说明能否拿到对数概率,以及模型是否直接作答。对数概率是模型对它可能写出的每个词给出的置信度数值。测试发送的是固定样本,不是你的聊天。

没有成功时,消息会说明原因。常见原因有:密钥被拒绝、服务正在限制请求、内置模型没有运行,或者回答超过了时限。见故障排查。

当前无法回答的条目仍留在列表里,显示为灰色,并注明原因。选择 None 会关闭判定,但不会删除任何激活问题或判定陈述。

如何选择

如果已经在运行本地模型,先试它,并用你自己聊天里的回合来测试。措辞的影响很大。见编写陈述。

Jev 和 Open-Jev 是不同的模型。Jev 是 TypeSafe 的托管模型,可以直接使用,也可以通过 OpenRouter 使用。Open-Jev 是基于 Qwen 单独发布的模型,Marinara 可以在本地运行它。Open-Jev 的测试没有测量托管的 Jev。

在 Android (Termux) 上,Built-in decision model(内置判定模型) 无法运行,而在手机处理器上跑的小型本地模型可能太慢。托管账号是实际可行的选择,例如通过 OpenRouter 使用 Jev。见设置 Decision 连接。

写预设、角色卡和智能体时,应以“一个 Decision 模型”为前提,不要写成“必须使用 Jev”。无论用哪个模型,陈述语法都相同,但不同模型可能给出不同的答案。导入使用判定的内容时,包括自定义智能体和 Agent Organizer 安装,Marinara 会显示一条链接到本指南的通知。恢复整个档案 ZIP 时不会显示。

使用内置模型

如果已经下载了内置模型,就能用它来判定,不需要账号,也不花钱。见内置模型设置。

  1. 在 Jobs 框的 Behind the scenes 下点击 Decision 行。
  2. 选择 Built-in model;如果有 Built-in model (utility),也可以选它。
  3. 点击 Decision settings 齿轮,再点击 Test。

Marinara 向模型提一个是或否的问题,让它只写一个 Token,再从这个 Token 的概率里读出答案。不会写出回复,所以请求很短。多个答案之间的选择,会拆成每个答案一个是或否的问题。

Thinking(推理) 设置决定模型无法用一个词作答时怎么办。有些模型总是先推理。

Thinking作用
Auto (try one word, allow thinking if the model cannot)(自动:先尝试用一个词作答,做不到时允许推理)默认值。连续两次没能用一个词作答后,允许模型先推理,并且 Marinara 会通知你。
Off (always answer in one word)(关闭:始终用一个词作答)无法用一个词作答的模型不会给出答案。
Allowed (let the model think first)(允许:让模型先推理)从不要求模型跳过推理。

先推理的模型需要好几秒,所以默认只回答回复显示之后才运行的检查,例如后处理智能体。要让它也判定回复之前运行的智能体,开启 Also gate agents that run before the reply(也判定回复前运行的智能体)。这样每条回复都会等它。

通用聊天模型给出的是或否概率可以拿来和阈值比较,但它们不像专用判定模型那样经过校准训练。不返回对数概率的运行时只会给出固定的 1 或 0。请用自己的聊天来调整阈值。

使用已运行的服务器

如果聊天模型运行在 Ollama、LM Studio、llama.cpp 或其他 OpenAI 兼容服务器上,它就能回答判定,Marinara 不必再加载第二份。

  1. 在 Connections 面板里点击该模型上的 ⋯,选择 Use this model for decisions(将此模型用于判定)。Add account(添加账号) 窗口会直接打开到判定这一步,地址、模型和密钥都与原来相同。
  2. 选择模型,然后点击 Test decision(测试判定)。测试通过时,会说明服务器是否返回了对数概率,以及模型是否必须先推理。点击 Done(完成)。
  3. 点击 Behind the scenes 下的 Decision 行,选择新模型。

也可以自己创建一个。使用来源为 OpenAI-compatible chat model (Ollama, LM Studio, llama.cpp)(OpenAI 兼容聊天模型) 的 Decision 账号,填写与聊天账号相同的地址(例如 Ollama 的 http://localhost:11434/v1),以及服务器使用的模型名称。

询问方式与内置模型相同:每条陈述要一个表示是或否的词。陈述逐条发送,因为 Marinara 无法知道你的服务器一次能处理多少请求。对账号来说,Thinking 始终是 Auto(自动)。另一台电脑上的服务器需要 PROVIDER_LOCAL_URLS_ENABLED。见连接本地或自托管模型。

设置 Decision 连接

托管的 Decision 账号会把选定的最近消息和陈述发给该服务,可能产生费用。Smart 回复顺序还会发送角色名单。

  1. 点击顶栏里的 Connections,再点击 Add(添加)。
  2. 在 Decisions(判定) 下点击 TypeSafe 或 Own decision server。如果用 OpenRouter,在 Chat(聊天) 下点击 OpenRouter 并完成连接,然后用模型 ⋯ 菜单里的 Use this key for decisions(将此密钥用于判定)。
  3. 填写 API key(API 密钥);如果是 Own decision server,则填写 Server address(服务器地址)。点击 Connect(连接)。窗口关闭,面板里会出现新账号。
  4. 点击 Behind the scenes 下的 Decision 行,选择新模型。
  5. 要测试它,在面板里点击该模型打开 Edit model,然后点击 Provider tests(服务商测试) 卡片里的 Test provider。Own decision server 模型在那里没有 Test provider 按钮。请改为在面板里打开账号的 ⋯ 菜单,点击 Test。

Test provider 通过时,会显示概率、回答耗时和账号的时限。⋯ 菜单里账号的 Test 只说明是否成功以及耗时多久。测试至少等待 10 秒;时限更长时,等待时限再加 5 秒。如果回答耗时超过时限,结果会注明:在聊天中,这样的回答会算作没有答案。

没有成功时,见故障排查。

Decision 编辑器(在判定模型上打开 Edit model)有这些字段:

字段作用
Decision source(判定来源)TypeSafe、OpenRouter、Custom System One endpoint(自定义 System One 端点) 或 OpenAI-compatible chat model (Ollama, LM Studio, llama.cpp)。创建模型时即固定。
API key source(API 密钥来源)Enter a separate key (optional for local servers)(输入单独的密钥,本地服务器可不填),或者用 Use key from …(使用……的密钥) 借用另一个账号的密钥。关联的密钥会跟随之后的密钥更改。自定义 System One 或 OpenAI 兼容模型只有在两个地址的协议、主机和端口都相同时,才能借用自定义聊天账号的密钥。
Recent-message token budget(最近消息 Token 预算)发送多少估算 Token 的聊天内容。范围 1 到 30,000。TypeSafe 和 OpenRouter 默认 30,000,自定义服务器默认 3,500。Marinara 先丢弃较旧的消息,再裁掉最新消息里最旧的部分。请求被拒绝或超出预算时,不会得到答案。
Time limit (seconds)(时限,秒)聊天中每条陈述等待多久。范围 0.5 到 30。默认 1.5,OpenAI 兼容聊天模型默认 4。见时限。

TypeSafe 发送到 https://api.typesafe.ai。可以把它的 Base URL(基础 URL) 换成另一台运行 TypeSafe API 的服务器,不带 /v1/systemone。这样仍然需要你的 TypeSafe 密钥,而密钥会发到那台服务器。Custom System One endpoint 接受你自己运行的 System One 服务器,例如 Open-Jev 或 Strands decider。填写它的地址时不带 /v1/systemone。Ollama 这类聊天模型服务器不使用 System One。它要用 OpenAI-compatible chat model。

有些托管服务有时回答慢于 1.5 秒,让判定看起来像是随机失灵。多测试几次,把时限设在最慢那次回答的耗时以上。回复之前询问的陈述,例如预设里的判定,或者回复前运行的智能体的激活问题,每条都可能让回复最多多等这么久。

删除一个密钥被用于判定的账号时,会显示警告。之后需要重新关联 Decision 账号,在此之前判定不会给出答案。导入的连接文件从不包含 API 密钥或借用账号的关联,所以要手动恢复它们。

Marinara 在哪里使用它

激活问题决定智能体是否运行。智能体提示词里的判定陈述,决定告诉这个运行中的智能体什么内容。是或否的条件用 {{#if decision:"..."}},在多个答案中选择用 {{#if decision_choice:"..." == "..."}}。

模型能看到什么

对于激活问题,以及提示词和世界书里的陈述,模型收到的是陈述本身和聊天里保存的最近消息。它收不到你的预设、角色卡、用户角色、世界书条目(Constant 条目也一样)、摘要或智能体输出。插在消息之间的文本,例如设为 @ Depth 的条目,也会被排除。如果陈述依赖其中某项,就必须在陈述里把这个事实写明。

Smart 回复顺序还会发送一份角色名单:每位候选角色的名字,已知时还有状态、活动和话多程度,外加最多 300 个字符的性格;性格为空时改用描述。

自动管理活跃角色也会发送一份角色名单:每个角色的名字,以及最多 300 个字符的描述;描述为空时改用性格。角色阵容太大放不下时,会裁到 100 个字符,或只留名字。名单里还有 Character Tracker 最近看到的名字。如果只放名字也给消息留不出足够空间,就不会询问模型,改由 Character Tracker 顶替。Merged 群聊里的回复会标成“the narrator”,因为一条回复替所有人发言。

托管的判定服务除了消息,也会收到这些名单。

Advanced Memory 按聊天使用它自己的 Decision 模型,不适用最近 5 条的规则。场景检查读取相关的对话记录窗口。回忆会先发送最近的对话文本和候选名单里最多 24 个已归档的回顾(如果 Maximum recalled scenes(最多召回场景数) 设得更高,则会更多),再在检查角色访问权限后,发送模型所选场景里的原始消息。托管服务会收到这些文本,有时分成几批。每一轮回忆通常有 10 到 25 秒,按模型的速度确定。两轮共用每条回复 40 秒,所以一轮可能不到 10 秒。没有及时得到答案的记忆会回退到普通回忆。见可选的 Decision 模型。

阈值

不同模型的概率没法直接比较。同一个例子在一个模型上可能得 0.99,在另一个模型上只有 0.2。默认的是或否阈值取决于模型:

智能体的 Run when probability is at least(运行所需的最低概率) 会覆盖这个值。保存的值与模型建议值不同时,编辑器会提供恢复建议值的选项。每次换模型都要检查它。提示词陈述和世界书 Decision 字段使用模型的默认值,智能体的阈值不会改变它们的阈值。

通过 Custom System One 账号接入的自托管 Open-Jev 仍然使用 0.5,因为 Marinara 无法校准任意的自定义端点。它的结果可能与内置的 Open-Jev 不同,包括把低于 0.5 的肯定结果读作否。

时限

没有及时返回的判定算作没有答案,生成会按该功能的备用行为继续(见 Marinara 在哪里使用它)。所有时限都按陈述计算。一次请求里有多条陈述时,每条都获得这段时限;每个 Choice 答案也算一条陈述。本地模型一次只处理少量请求,所以陈述要排队,每条陈述的计时从模型开始处理它时算起。

取消生成时,判定请求也会停止。

其他设置

这些设置在 Decision settings 齿轮里:

为错误答案做好准备

任何模型都可能答错,而且正确的“是”答案也可能离阈值很近。

故障排查

要在生成时查看判定的评分和输出,开启 Debug Mode,或者把日志级别设为 debug。见日志级别。要在不生成回复的情况下测试自己的陈述,打开 Peek Prompt → Decision diagnostics → Test decisions(Peek Prompt → 判定诊断 → 测试判定)。显式测试会调用选定的模型,在托管服务上可能产生费用。见测试判定陈述。

让 Marinara 安装判定模型

Built-in decision model 是一个实验性的专用判定模型,由 Marinara 下载,并在你的聊天模型旁作为独立的本地进程运行。它占用的内存会叠加在聊天模型之上。如果已经有本地模型,先试试它的判定能力。

Open-Jev 模型需要 Linux x86-64、计算能力 7.5 或更高的 NVIDIA GPU(Turing、RTX 20 系列或更新),以及 580 或更新版本的驱动。不支持 Linux ARM 和更老的显卡。模型无法运行时,这个选项仍然可见,会说明原因,并提供 Set up a Decision provider instead(改为设置 Decision 服务商)。

模型模型下载含运行时的磁盘占用显存
Open-Jev 2B约 4.6 GB约 10 GB约 4.8 GB (4.5 GiB)
Open-Jev 9B约 19.4 GB约 25.3 GB约 23.6 GB (22 GiB)

这些是目录给出的估算值。9B 模型在 24 GB 的 GPU 上几乎不留余量。请查看安装器针对你的显卡给出的判断。

  1. 在 Connections 面板里点击 Add,再点击 Decisions 下的 Built-in model (decisions)。会打开一个标题为 Built-in decision model 的窗口。也可以从 Built-in model 卡片的页面打开它。
  2. 阅读警告,然后开启 Use the built-in decision model(使用内置判定模型)。标题为 Turn on the built-in decision model? 的对话框会显示针对你电脑的判断。点击 Enable(启用);判断结果是警告时,点击 Enable anyway(仍然启用)。
  3. 在 Available decision models(可用的判定模型) 下选择 Open-Jev 2B 或 Open-Jev 9B。点击 Download and install(下载并安装),确认大小、硬件判断和许可证。在此之前什么都不会下载。
  4. 点击 Behind the scenes 下的 Decision 行,选择 Built-in model (decisions)。

窗口里的其他控件:

模型启动后的第一次回答较慢,所以 Marinara 会在加载时问一个预热问题。预热失败时,模型照样启动,只是延迟落到第一个真正的问题上。在长聊天里,带很多陈述的回合耗时更长。Open-Jev 2B 在长聊天里每条陈述约需四分之一秒。

自行运行 Strands decider

Strands decider 2B 是另一个支持 System One 的开放判定模型(Apache-2.0)。Marinara 无法安装它,但只要你让它保持运行,它就能作为 Custom System One endpoint 使用。

  1. 在 Python 3.10 或更新版本的环境中安装它并启动服务器:
   pip install strands-decider
   strands-decider serve StrandsAgents/strands-decider-2B-hobson-v19 --port 8000

检测到 NVIDIA GPU 或 Apple silicon 时会使用它们,否则在处理器上运行,速度较慢。首次启动会下载模型和约 4.6 GB 的基础权重,它的 Python 包约占 5.5 GB。服务器没有密码,因此要让它保持在 127.0.0.1 上。

  1. 添加一个 Own decision server 账号,Server address 填 http://127.0.0.1:8000。模型名称随便填都行。
  2. 在 Decision 行上选中它,然后用账号 ⋯ 菜单里的 Test 测试。它启动后的第一次回答约需 2 秒,比默认时限更长,所以开始聊天前先测试一次。

它的概率经过校准,所以默认的 0.5 阈值适合它,这一点和自托管的 Open-Jev 不同(见阈值)。它的回答受措辞影响,所以请按照编写陈述来写。

相关指南