JEV - Deux démos qui ne rendent qu'une distribution

Les deux exemples ne posent qu'un choix fermé : l'assistance doit-elle basculer vers une personne, et une fusion doit-elle passer. Ce qui revient est une distribution. La latence publiée reste autour de 70 à 500 millisecondes, pas le chiffre en millisecondes d'une démo.

JEV - Deux démos qui ne rendent qu'une distribution

Co-auteur : folkbench.com (Folkbench est une plateforme vérifiable d’évaluation et de sélection pour les API d’IA, les services de modèles et les sites associés. Elle s’appuie sur les informations publiées sur le service, les prix, la disponibilité, la latence et les fenêtres de preuve pour aider les utilisateurs à comparer des voies et à en choisir une.)

Dix textes dans cette série :

Les deux démos sont le même travail : pas de texte libre, seulement une question fermée, et la branche est prise dans la distribution. Le JSON et le code ci-dessous sont la forme d'un appel, pas un rapport de temps. Le délai publié de bout en bout est d'environ 70 à 500 millisecondes. N'écrivez pas une course de 18 millisecondes comme chiffre de produit. Ce qui vaut d'être vu, c'est que la réponse ne contient pas de phrase token par token.

Assistance : intention et un coupe-circuit

La scène

L'assistance craint une personne déjà en colère pendant que le système tape encore. Se servir d'un modèle génératif pour l'intention veut souvent dire attendre un premier token et un bloc JSON généré, au nom de l'exactitude. Une expression régulière nue manque la colère qui parle autour du point. Ce qu'il faut, c'est une classification fermée, puis une décision immédiate sur le passage à une personne.

État et options

C'est un Choice, pas un Noul. Noul répond oui ou non. Il y a ici trois options.

[State]
scene: live support entry
rule: assign probability across the given options from the message text

[user]
I have waited three days. The shipment has not moved. Are you even alive? Refund me now, or I escalate.
{
  "question": "choice",
  "options": [
    {"id": "GENERAL", "description": "ordinary question or tracking, no strong emotion"},
    {"id": "REFUND", "description": "a clear return or refund, stated flatly"},
    {"id": "BREAKER", "description": "insult, threat, or a complaint that should break to a person"}
  ]
}

Ce qui revient est une distribution

Il n'y a pas de curseur qui émet des caractères. La forme est une table, pas une critique.

{
  "top": "BREAKER",
  "scores": [
    {"choice": "BREAKER", "score": 0.9241},
    {"choice": "REFUND", "score": 0.0715},
    {"choice": "GENERAL", "score": 0.0044}
  ]
}

Les nombres sont la distribution dans cet exemple, pour que la branche puisse s'écrire. Ce n'est pas un repère publié. Le modèle assigne la probabilité sur les options données. Il ne prédit pas le caractère suivant.

Comment le code le prend

async function handleIncomingCustomerMessage(userMessage: string) {
  const res = await jev.choice("cs_intent_v1", { input: userMessage });
  const breaker = scoreOf(res, "BREAKER");
  if (breaker > 0.85) {
    return triggerHumanOverride({ priority: "CRITICAL", queue: "RETENTION" });
  }
  if (scoreOf(res, "REFUND") > 0.70) {
    return launchWorkflow("AUTOMATED_REFUND_FLOW");
  }
  return launchWorkflow("DEFAULT_FAQ_BOT");
}

Il n'y a pas de nouvel essai dont le seul travail serait d'analyser Markdown. Le seuil est dans le code. 0.85 et 0.70 sont la politique de ce flux. Ce n'est pas une garantie du modèle.

Une revue avant la fusion

La scène

Les analyses statiques s'appuient sur un arbre syntaxique et sur des règles mortes. Les variantes passent, et les fausses alertes sont courantes. Demander à un modèle de discussion de lire un diff de 500 lignes et d'écrire une critique prend souvent de nombreuses secondes. La chaîne ne peut pas attendre, et un programme ne peut pas lire « passe » ou « échoue » dans la prose. Traitez le diff comme un état, et posez un Choice : passer, une personne doit regarder, ou bloquer.

État et options

[Git diff]
PR #1042
file: src/auth/session.ts

+  // skip expiry outside production, or when the token starts with test_admin_
+  if (process.env.NODE_ENV !== 'production' || token.startsWith('test_admin_')) {
+    return session;
+  }
{
  "question": "choice",
  "options": [
    {"id": "PASS", "description": "harmless refactor, docs, or ordinary logic"},
    {"id": "WARN", "description": "config, dependency, or a non-sensitive refactor; a person should look"},
    {"id": "BLOCK", "description": "backdoor, hardcoded secret, privilege jump, auth bypass, injection"}
  ]
}

Un préfixe test_admin_ qui saute l'expiration en production est un contournement d'authentification. Dans l'exemple, la distribution place BLOCK près de 0.98. Effacez cette clause et ne laissez que « sauter hors de la production », et la même question passe du blocage à un regard humain. C'est ainsi que la question s'utilise. Ce n'est pas un ensemble de millisecondes promises.

Comment une chaîne le prend

def audit_pr_diff(diff_text: str) -> int:
    result = jev.choice(
        question="pr_security_v2",
        state=diff_text,
        options=["PASS", "WARN", "BLOCK"],
    )
    scores = result.scores
    if result.top == "BLOCK" and scores["BLOCK"] > 0.80:
        print("high-risk auth change")
        return 1
    if result.top == "WARN":
        mark_review_required()
        return 0
    return 0

Une adresse de service interne suffit. Ne lisez pas ceci comme un site public qui offrirait déjà Jev en votre nom. La chaîne lit l'option du haut et les valeurs. Si une personne a encore besoin d'une critique écrite, demandez à un modèle qui sait écrire. Ne repoussez pas cette prose dans cette question.

Comme l'appel d'une interface qui renvoie des nombres

Les deux courses rendent un fait concret : le jugement compliqué reste dans le modèle, et dehors il ne reste que la probabilité. Noul, Choice et Score sont trois grilles, pas trois styles de discussion.

Aiguillage, risque, un contrôle avant la fusion, un moteur de politiques, une branche d'Agent : demandez d'abord si l'étape peut s'écrire comme une question fermée. S'il le peut, n'attendez pas une génération. S'il ne le peut pas, ne l'habillez pas en appel de cette sorte.

Série