Modelos de decisão

Um modelo de decisão é um modelo pequeno que responde a perguntas de sim ou não para Marinara, como "Does the latest message move the scene to a new place?". Lorebooks, agentes personalizados, prompts e chats em grupo o usam. Ele é opcional. Sem um, os chats continuam funcionando e cada recurso usa o comportamento alternativo descrito em Onde Marinara o usa.

As respostas dele controlam o que Marinara faz e nunca são publicadas no chat. Ele dá a uma declaração uma pontuação de 0 a 1. Marinara compara esse número com um limiar e trata o resultado como sim ou não. Ele também pode escolher uma resposta em uma lista curta, como "angry", "sad" ou "none of these".

Nossa recomendação: deixe em None (nenhum) se estiver em dúvida. Se quiser decisões, use o modelo embutido que você talvez já tenha, ou um modelo de chat em um servidor que você já executa. Nenhum dos dois custa nada a mais.

Escolher um modelo de decisão

Antes de começar, veja Qual escolher.

  1. Clique em Connections (Conexões) na barra superior e abra a caixa Jobs (tarefas).
  2. Em Behind the scenes (nos bastidores), clique na linha Decision (decisão). Uma lista se abre.
  3. Escolha um modelo. A lista tem três grupos:
  1. Para testá-lo, clique na engrenagem Decision settings (configurações de decisão) da linha e clique em Test (testar). Esse botão aparece nas opções do modelo embutido. Para uma conta TypeSafe ou OpenRouter, abra Edit model (editar modelo) no modelo dela e clique em Test provider (testar provedor). Para uma conta Own decision server (servidor de decisão próprio), use Test no menu ⋯ da conta.

Um teste bem-sucedido mostra a probabilidade de sim e quanto tempo a resposta levou. Para um modelo no seu computador, ele também informa se havia log-probabilidades disponíveis e se o modelo responde diretamente. Log-probabilidades são os números de confiança do modelo para cada palavra que ele poderia escrever. O teste envia uma amostra fixa, não o seu chat.

Se não funcionar, a mensagem diz por quê. Causas comuns: a chave foi recusada, o serviço está limitando as solicitações, o modelo embutido não está rodando ou a resposta passou do tempo limite. Veja Solução de problemas.

As opções que não podem responder agora continuam na lista, em cinza, com o motivo. Escolher None desativa as decisões sem excluir nenhuma pergunta de ativação nem declaração de decisão.

Qual escolher

Se você já roda um modelo local, experimente-o primeiro e teste turnos dos seus próprios chats. A redação faz muita diferença. Veja Escrever declarações.

Jev e Open-Jev são modelos diferentes. Jev é o modelo hospedado da TypeSafe, disponível diretamente ou pelo OpenRouter. Open-Jev é um modelo publicado separadamente, baseado em Qwen, que Marinara pode rodar localmente. Os testes do Open-Jev não medem o Jev hospedado.

No Android (Termux), o Built-in decision model (modelo de decisão embutido) não pode rodar, e um modelo local pequeno no processador do celular pode ser lento demais. Uma conta hospedada é a escolha prática, por exemplo Jev pelo OpenRouter. Veja Configurar uma conexão Decision.

Escreva presets, cards e agentes para "um modelo de decisão", nunca "exige Jev". Eles usam a mesma sintaxe de declarações com qualquer modelo, mas os modelos podem dar respostas diferentes. Quando você importa conteúdo que usa decisões, inclusive agentes personalizados e instalações do Agent Organizer, Marinara mostra um aviso com um link para esta página. Restaurar um ZIP de perfil completo não mostra esse aviso.

Usar o modelo embutido

Se você baixou o modelo embutido, pode usá-lo para decisões sem conta e sem custo. Veja Como configurar o Built-in model.

  1. Clique na linha Decision, em Behind the scenes, na caixa Jobs.
  2. Escolha Built-in model (ou Built-in model (utility), se você tiver um).
  3. Clique na engrenagem Decision settings e depois em Test.

Marinara faz uma única pergunta de sim ou não ao modelo, deixa que ele escreva um token e lê a resposta nas probabilidades desse token. Nenhuma resposta é escrita, então a solicitação é curta. Uma escolha entre várias respostas vira uma pergunta de sim ou não por resposta.

A configuração Thinking (raciocínio) controla o que acontece quando um modelo não consegue responder em uma palavra. Alguns modelos sempre raciocinam antes.

ThinkingO que faz
Auto (try one word, allow thinking if the model cannot) (automático: tentar uma palavra e permitir raciocínio se o modelo não conseguir)Padrão. Depois de duas respostas de uma palavra malsucedidas seguidas, o modelo pode raciocinar antes, e Marinara avisa você.
Off (always answer in one word) (desativado: sempre responder em uma palavra)Um modelo que não consegue responder em uma palavra não fornece resposta.
Allowed (let the model think first) (permitido: deixar o modelo raciocinar antes)Nunca pede ao modelo para pular o raciocínio.

Um modelo que raciocina antes leva segundos; por isso, por padrão, ele só responde nas verificações que rodam depois que a resposta aparece na tela, como as de agentes de pós-processamento. Para que ele também avalie os agentes que rodam antes da resposta, ative Also gate agents that run before the reply (avaliar também os agentes que rodam antes da resposta). Assim, cada resposta passa a esperar por ele.

As probabilidades de sim ou não de um modelo de chat geral funcionam com um limiar, mas não foram treinadas para ser calibradas como as de um modelo criado para decisões. Um ambiente de execução que não retorna log-probabilidades responde com 1 ou 0 fixos. Ajuste os limiares com os seus próprios chats.

Em um servidor que você já executa

Se o seu modelo de chat roda no Ollama, LM Studio, llama.cpp ou outro servidor compatível com OpenAI, ele pode responder decisões sem que Marinara carregue uma segunda cópia.

  1. Clique em ⋯ nesse modelo, no painel Connections, e escolha Use this model for decisions (usar este modelo para decisões). A janela Add account (adicionar conta) abre na etapa de decisão, com o mesmo endereço, modelo e chave.
  2. Escolha o modelo e clique em Test decision (testar decisão). Um teste bem-sucedido informa se o servidor retornou log-probabilidades e se o modelo precisou raciocinar antes. Clique em Done (concluir).
  3. Clique na linha Decision, em Behind the scenes, e escolha o modelo novo.

Você também pode criá-lo por conta própria. Use uma conta Decision com a fonte OpenAI-compatible chat model (Ollama, LM Studio, llama.cpp) (modelo de chat compatível com OpenAI), o mesmo endereço da sua conta de chat (por exemplo, http://localhost:11434/v1 para Ollama) e o nome do modelo que o servidor usa.

Ele é consultado como o modelo embutido: uma palavra de sim ou não por declaração. As declarações vão uma por vez, porque Marinara não tem como saber quantas solicitações o seu servidor processa ao mesmo tempo. Thinking é sempre Auto para uma conta. Um servidor em outro computador precisa de PROVIDER_LOCAL_URLS_ENABLED. Veja Conectar um modelo local ou auto-hospedado.

Configurar uma conexão Decision

Uma conta Decision hospedada envia ao serviço as mensagens recentes selecionadas e as declarações, e pode gerar cobranças. A ordem de resposta Smart também envia uma lista de personagens.

  1. Clique em Connections na barra superior e depois em Add (adicionar).
  2. Em Decisions (decisões), clique em TypeSafe ou Own decision server. Para o OpenRouter, clique em OpenRouter em Chat, conecte a conta e use Use this key for decisions (usar esta chave para decisões) no menu ⋯ do modelo.
  3. Informe a API key (chave de API) ou, para Own decision server, o Server address (endereço do servidor). Clique em Connect (conectar). A janela fecha e o painel mostra a conta nova.
  4. Clique na linha Decision, em Behind the scenes, e escolha o modelo novo.
  5. Para testá-lo, clique no modelo no painel para abrir Edit model e depois clique em Test provider no cartão Provider tests (testes do provedor). Um modelo de Own decision server não tem o botão Test provider ali. Em vez disso, abra o menu ⋯ da conta no painel e clique em Test.

Um Test provider bem-sucedido mostra a probabilidade, quanto tempo a resposta levou e o tempo limite da conta. O Test da conta, no menu ⋯, só informa se funcionou e quanto tempo levou. O teste espera pelo menos 10 segundos, ou 5 segundos além de um limite maior. Se a resposta demorar mais que o limite, o resultado avisa: nos chats, essa resposta contaria como ausência de resposta.

Se não funcionar, veja Solução de problemas.

O editor de Decision (Edit model em um modelo de decisão) tem estes campos:

CampoO que faz
Decision source (fonte de decisão)TypeSafe, OpenRouter, Custom System One endpoint (endpoint System One personalizado) ou OpenAI-compatible chat model (Ollama, LM Studio, llama.cpp). Ela fica fixa a partir da criação do modelo.
API key source (origem da chave de API)Enter a separate key (optional for local servers) (informar uma chave separada: opcional para servidores locais) ou Use key from … (usar a chave de) outra conta. As chaves vinculadas acompanham as alterações posteriores da chave. Um modelo System One personalizado ou compatível com OpenAI só pode emprestar a chave de uma conta de chat personalizada quando os dois endereços têm o mesmo esquema, host e porta.
Recent-message token budget (orçamento de tokens de mensagens recentes)Quantos tokens estimados do chat enviar. De 1 a 30.000. Padrão de 30.000 para TypeSafe e OpenRouter, e de 3.500 para servidores personalizados. Marinara descarta primeiro as mensagens mais antigas e depois corta a parte mais antiga da mensagem mais recente. Uma solicitação recusada ou acima do orçamento não fornece resposta.
Time limit (seconds) (limite de tempo em segundos)Quanto tempo esperar por cada declaração durante os chats. De 0,5 a 30. Padrão de 1,5, ou 4 para um modelo de chat compatível com OpenAI. Veja Tempos limite.

TypeSafe envia para https://api.typesafe.ai. Você pode trocar a Base URL (URL base) dela pelo endereço de outro servidor que execute a API da TypeSafe, sem /v1/systemone. A chave da TypeSafe continua necessária e é enviada a esse servidor. Custom System One endpoint aceita um servidor System One que você executa, como Open-Jev ou Strands decider. Informe o endereço dele sem /v1/systemone. Um servidor de modelos de chat como o Ollama não fala System One. Para ele, use OpenAI-compatible chat model.

Alguns serviços hospedados às vezes levam mais de 1,5 segundo para responder, o que faz as decisões parecerem falhar ao acaso. Teste algumas vezes e defina o limite acima da resposta mais lenta. As declarações feitas antes da resposta, como as decisões de um preset ou a pergunta de ativação de um agente que roda antes da resposta, podem atrasar a resposta por até esse tempo cada uma.

Excluir uma conta cuja chave é usada para decisões mostra um aviso. A conta Decision passa a precisar de um novo vínculo e, até lá, as decisões não fornecem resposta. Arquivos de conexão importados nunca contêm chaves de API nem vínculos com contas emprestadas, então restaure-os manualmente.

Onde Marinara o usa

Uma pergunta de ativação decide se um agente roda. Uma declaração de decisão dentro do prompt dele decide o que esse agente recebe ao rodar. Use {{#if decision:"..."}} para condições de sim ou não e {{#if decision_choice:"..." == "..."}} para uma escolha entre respostas.

O que o modelo vê

Nas perguntas de ativação e nas declarações de prompts e lorebooks, o modelo recebe a declaração e as mensagens recentes como foram salvas no chat. Ele não recebe o seu preset, card de personagem, persona, entradas de lorebook (nem as Constant), resumos ou resultados de agentes. Textos colocados entre mensagens, como uma entrada definida como @ Depth (em uma profundidade), também ficam de fora. Uma declaração que depende de um desses itens precisa informar o próprio fato.

A ordem de resposta Smart também envia uma lista de personagens: nome, status, atividade e sociabilidade de cada candidato, quando conhecidos, além de até 300 caracteres da personalidade ou, se estiver vazia, da descrição.

Automate active characters também envia uma lista de personagens: o nome de cada personagem e até 300 caracteres da descrição ou, se estiver vazia, da personalidade, reduzidos a 100 caracteres ou só aos nomes quando um elenco grande não cabe, além dos nomes que o Character Tracker viu por último. Se mesmo só com os nomes sobrar pouco espaço para as mensagens, o modelo não é consultado e o Character Tracker assume. As respostas em um grupo Merged são rotuladas como "the narrator", já que uma única resposta dá voz a todos.

Um serviço de decisão hospedado recebe essas listas junto com as mensagens.

Advanced Memory usa um modelo de decisão próprio por chat, e não a regra das últimas 5 mensagens. As verificações de cena leem a janela relevante do histórico. A recuperação envia o texto da conversa recente e até 24 resumos arquivados pré-selecionados, ou mais, se Maximum recalled scenes (máximo de cenas recuperadas) for maior, e depois as mensagens originais das cenas que o modelo escolheu, após as verificações de acesso dos personagens. Os serviços hospedados recebem esses textos, às vezes em vários lotes. Cada etapa da recuperação normalmente recebe de 10 a 25 segundos, de acordo com a velocidade do modelo. As duas etapas dividem 40 segundos por resposta, então uma etapa pode receber menos de 10 segundos. As memórias sem resposta a tempo recorrem à recuperação normal. Veja Modelo de decisão opcional.

Limiares

As probabilidades não são comparáveis entre modelos. O mesmo exemplo pode pontuar 0,99 em um e 0,2 em outro. O limiar padrão de sim ou não depende do modelo:

O ajuste Run when probability is at least (rodar quando a probabilidade for pelo menos) de um agente substitui esse padrão. O editor oferece restaurar a recomendação do modelo quando o valor salvo é diferente. Confira esse ajuste sempre que trocar de modelo. As declarações em prompts e os campos Decision de lorebooks usam o padrão do modelo, e o limiar de um agente não muda o deles.

Um Open-Jev hospedado por você em uma conta Custom System One continua usando 0,5, porque Marinara não consegue calibrar endpoints personalizados arbitrários. Os resultados dele podem diferir dos do Open-Jev embutido, inclusive tratando como não um resultado positivo abaixo de 0,5.

Tempos limite

Uma decisão que não chega a tempo não fornece resposta, e a geração continua com o comportamento alternativo do recurso (veja Onde Marinara o usa). Todo limite é por declaração. Uma solicitação com várias declarações recebe o limite para cada uma, e cada resposta Choice conta como uma declaração. Um modelo local processa só algumas solicitações por vez; por isso, as declarações aguardam a sua vez, e o tempo de uma declaração começa quando o modelo começa a processá-la.

As solicitações de decisão param quando você cancela uma geração.

Outras configurações

Estas ficam na engrenagem Decision settings:

Prepare-se para respostas erradas

Qualquer modelo pode responder errado, e respostas sim corretas podem ficar perto do limiar.

Solução de problemas

Para ver as pontuações e as saídas das decisões durante a geração, ative o Debug Mode ou defina o nível de log como debug. Veja Níveis de log. Para testar as suas próprias declarações sem gerar uma resposta, abra Peek Prompt → Decision diagnostics → Test decisions (Peek Prompt → diagnóstico de decisões → testar decisões). Os testes explícitos chamam o modelo selecionado e podem gerar cobranças em um serviço hospedado. Veja Como testar declarações de decisão.

Deixar Marinara instalar um modelo de decisão

O Built-in decision model é um modelo de decisão experimental, criado para decisões, que Marinara baixa e roda como um processo local próprio, ao lado do seu modelo de chat. O uso de memória dele se soma ao do seu modelo de chat. Se você já tem um modelo local, experimente as decisões dele primeiro.

Os modelos Open-Jev precisam de Linux x86-64, de uma GPU NVIDIA com capacidade de computação 7.5 ou superior (Turing, série RTX 20 ou posterior) e de driver 580 ou superior. Linux ARM e placas mais antigas não têm suporte. Quando um modelo não pode rodar, a opção continua visível, informa o motivo e oferece Set up a Decision provider instead (configurar um provedor de decisão em vez disso).

ModeloDownload do modeloDisco com ambiente de execuçãoMemória da GPU
Open-Jev 2BCerca de 4,6 GBCerca de 10 GBCerca de 4,8 GB (4,5 GiB)
Open-Jev 9BCerca de 19,4 GBCerca de 25,3 GBCerca de 23,6 GB (22 GiB)

São estimativas do catálogo. O modelo 9B deixa pouca margem em uma GPU de 24 GB. Confira o parecer do instalador para a sua placa.

  1. Clique em Add no painel Connections e clique em Built-in model (decisions) em Decisions. Abre-se uma janela com o título Built-in decision model. Você também pode abri-la pela página do card Built-in model.
  2. Leia o aviso e ative Use the built-in decision model (usar o modelo de decisão embutido). Uma caixa de diálogo com o título Turn on the built-in decision model? (ativar o modelo de decisão embutido?) mostra o parecer para o seu computador. Clique em Enable (ativar), ou em Enable anyway (ativar mesmo assim) quando o parecer for um aviso.
  3. Em Available decision models (modelos de decisão disponíveis), escolha Open-Jev 2B ou Open-Jev 9B. Clique em Download and install (baixar e instalar) e confirme o tamanho, o parecer do hardware e as licenças. Nada é baixado antes disso.
  4. Clique na linha Decision, em Behind the scenes, e escolha Built-in model (decisions).

Outros controles da janela:

A primeira resposta de um modelo depois que ele inicia é mais lenta; por isso, Marinara faz uma pergunta de aquecimento enquanto ele carrega. Se ela falhar, o modelo inicia mesmo assim e a primeira pergunta real absorve o atraso. Um turno com muitas declarações em um chat longo demora mais. Em um chat longo, Open-Jev 2B leva cerca de um quarto de segundo por declaração.

Como executar Strands decider por conta própria

Strands decider 2B é outro modelo de decisão aberto (Apache-2.0) que usa System One. Marinara não pode instalá-lo, mas ele funciona como Custom System One endpoint enquanto você o mantém em execução.

  1. Em um ambiente com Python 3.10 ou mais recente, instale o modelo e inicie o servidor:
   pip install strands-decider
   strands-decider serve StrandsAgents/strands-decider-2B-hobson-v19 --port 8000

Ele usa uma GPU NVIDIA ou Apple silicon quando encontra um deles; caso contrário, usa o processador, com menor velocidade. A primeira inicialização baixa o modelo e cerca de 4,6 GB de pesos base, e seus pacotes Python ocupam cerca de 5,5 GB. O servidor não tem senha, então mantenha-o em 127.0.0.1.

  1. Adicione uma conta Own decision server com o Server address http://127.0.0.1:8000. Qualquer nome de modelo funciona.
  2. Escolha-a na linha Decision e teste-a com Test, no menu ⋯ da conta. A primeira resposta depois que ele inicia leva cerca de 2 segundos, mais que o tempo limite padrão; por isso, teste uma vez antes de conversar.

As probabilidades dele são calibradas; por isso, o limiar padrão de 0,5 é adequado, ao contrário de um Open-Jev auto-hospedado (veja Limiares). As respostas dele dependem da redação, então siga Escrever declarações.

Guias relacionados