JEV - Concevoir la question fermée, pas la formule
Le oui-non, le choix et le niveau suffisent comme langage quand le métier se découpe en questions fermées qui ne se gênent pas, et que l'état est compressé au-delà du récit. Émettre le coupon ou non reste un seuil dans le code.

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 :
- JEV - Une articulation n'a pas besoin d'un cerveau
- JEV - Le lubrifiant sur les nœuds de contrôle
- JEV - De BERT à une seule distribution
- JEV - Concevoir la question fermée, pas la formule
- JEV - Le grand livre anti-token ne le sort pas d'abord
- JEV - Deux démos qui ne rendent qu'une distribution
- JEV - Sortir de la boucle : la confiance entre dans le code
- JEV - Passée la ligne, plus intelligent n'est plus le produit
- JEV - Intuition et raison : des questions qui ne lui reviennent pas
- JEV - De l'écran à une probabilité nue
La première moitié du travail sur les instructions fut une poétique. Pour obtenir un JSON stable, on écrivait un rôle, une menace, quelques exemples et un peu de XML. C'était un blocus dans une combinaison infinie de tokens. Jev annule le blocus. L'espace des solutions est fermé avant l'inférence. Ce que vous concevez n'est pas une meilleure incantation. C'est un état, plus quelques questions fermées qui ne se gênent pas. Le oui-non, le choix et le niveau suffisent comme langage seulement si vous voulez bien découper le métier dans ces trois formes.
D'un blocus à un questionnaire
[ generative ]
prompt (role, examples, format restraints) → infinite tokens → text that can drift
[ Jev ]
state + closed questions (Noul / Choice / Score) → a finite set → one distribution
Les trois questions achèvent ce qu'il est licite de demander :
- Oui-non, Noul. Ce que vous voulez, c'est la probabilité de « oui », utilisée pour éprouver un seuil. Le code décide si le seuil est franchi. Ce n'est pas une valeur vide.
- Choix unique, Choice. Les options sont fixées d'avance, 255 au plus. Chaque option dit ce qu'elle veut dire. Servez-vous-en pour l'intention et le routage.
- Niveau, Score. De 2 à 10 échelons, écrits de bas en haut comme des cas concrets. Servez-vous-en pour le degré. Ne vous en servez pas pour inventer une classe nouvelle.
Les instructions dont le seul travail était le format expirent donc. Le métier qui reste, c'est comment compresser l'état, et comment découper une grande question.
L'état doit l'emporter sur le récit
L'état n'écoute pas un récit. La règle est de laisser tomber l'ornement, de garder l'ordre des événements, et de garder les faits.
Une façon générative de demander si un utilisateur va partir ressemble souvent à ceci :
Vous êtes une personne expérimentée de l'assistance. Lisez le profil et le dialogue, décidez s'il veut annuler, expliquez, et émettez du JSON. Profil : Zhang San, VIP3, inscrit depuis 2 ans. L'utilisateur dit que la fonction a encore planté et que les données ont disparu. L'assistance dit que c'est en réparation. L'utilisateur dit laissez tomber, et demande comment obtenir un remboursement.
Le problème est la phrase de rôle et le remplissage. Le modèle dépense de l'attention sur « vous êtes un expert », et la sortie se laisse tirer par « laissez tomber ».
Ce que Jev mange, c'est l'état compressé :
{
"user_profile": {"tier": "VIP3", "tenure_months": 24},
"last_event": {"type": "system_error", "impact": "data_loss"},
"dialogue_history": [
{"role": "user", "intent": "complain", "content": "feature crashed, data lost"},
{"role": "agent", "intent": "apology", "content": "fix in progress"},
{"role": "user", "intent": "churn_explicit", "content": "asks for a refund and says they will stop"}
]
}
Une ligne du dialogue d'origine peut rester, mais l'intention et l'impact siègent dans leurs propres champs. Le modèle lit un arbre d'état, pas une dissertation.
Découper une question de métier en trois
« Devons-nous émettre un coupon de 50 yuan » n'est pas une question fermée. L'intention, la colère, la fraude et le coût y sont empilés. Un seul coup rate dans Jev. Découpez-la en trois questions orthogonales, et laissez la politique du coupon dans le code.
state ─┬─ Choice primary intent
├─ Score negative degree, rungs 1 to 5
└─ Noul does this look like farming coupons
Intention
Choice. L'espace est : question technique, suggestion de produit, plainte pour incident, réclamation malveillante. L'énoncé ne demande que l'intention principale de ce tour. Il ne demande pas s'il faut payer.
[State]
{ ...compressed state... }
[Question]
From the dialogue, which class is the primary intent of this turn.
Degré
Score. L'échelon 1 est une question ou une plainte légère. L'échelon 3 est une plainte claire qui exige une explication. L'échelon 5 est une émotion extrême, ou un remboursement ou une fermeture de compte déjà sur la table. Ne lui donnez pas un « 1 à 5 » nu. Écrivez chaque échelon comme un cas.
[State]
{ ...compressed state... }
[Question]
Score the negative degree on these rungs.
1: a question, or a mild complaint
3: a clear complaint that demands an explanation
5: extreme emotion, or a refund or closure already requested
Oui ou non
Noul. Mettez dans l'état le nombre de réclamations des 30 derniers jours, et demandez si ce tour correspond à la chasse aux coupons. Ce qui revient est une probabilité. Le seuil s'écrit dans le code.
[State]
{ ...state, plus claim count for 30 days... }
[Question]
Historical claims are greater than 3, and the impact of this incident is low. Does this turn match coupon farming.
Le code ne reçoit que la distribution
En aval, on n'analyse plus une chaîne JSON qui peut casser. Chacun des trois résultats est un nombre ou une table. Les conditions de métier restent dans la fonction.
intent = jev.choice(
state=user_state,
options=["tech_support", "feedback", "complaint", "malicious"],
)
anger = jev.score(state=user_state, rungs=5)
fraud = jev.noul(state=user_state_with_history)
def handle_coupon(intent, anger, fraud):
if fraud.p_yes >= 0.9:
return "DENY_AND_HANDOFF"
if intent.top == "complaint" and anger.expected >= 4:
return "ISSUE_50_COUPON"
return "STANDARD_APOLOGY"
Quand le modèle est remplacé, la forme de la sortie est encore ces trois-là. L'effondrement du format cesse d'être un type de panne. Le déterminisme ne devient pas « le modèle ne se trompe jamais ». Le déterminisme veut dire qu'une erreur tombe encore dans une case que vous avez écrite, et que la branche peut encore être testée.
La rhétorique s'en va
| Dimension | Instruction générative | Jev |
|---|---|---|
| Métier | Style, exemples, incantations de format | Découper le métier, compresser l'état, dessiner un espace discret |
| Espace des solutions | Ouvert | Fermé : Noul / Choice / Score |
| Stabilité | Formulation et température | Structure ; la sortie est une distribution par nature |
| Débogage | Éditer les adjectifs, ajouter du ton, ajouter des exemples | Éditer les champs de l'état, découper la question jusqu'à ce qu'elle soit orthogonale |
Le oui-non, le choix et le niveau suffisent comme langage exactement quand « que devons-nous faire ensuite » peut se découper dans les trois. La partie qui ne se découpe pas n'est pas un échec du langage. Elle n'appartient pas à l'articulation. Laissez-la à un modèle qui sait parler, ou à une personne.
Série
- Précédent : JEV - De BERT à une seule distribution
- Suivant : JEV - Le grand livre anti-token ne le sort pas d'abord