Avancé : structure
Les instructions, les options de Choice, les niveaux de Score et les criteria de Noul acceptent tous une structure JSON.
Les modèles System One sont entraînés à comprendre la structure.
Où la structure est autorisée
Chacun de ces champs est un EntryType.
| Champ | S’applique à | Forme acceptée |
|---|---|---|
instructions |
Choice, Score, Noul | string, object, array ou null |
valeurs de criteria (descriptions des options) |
Choice | string, object, array ou null |
entrées de criteria (descriptions des niveaux) |
Score | string, object, array ou null |
criteria.true et criteria.false |
Noul | string, object, array ou null |
Quand structurer une question
- Quand cela aide à la clarté. Quand une question a plusieurs parties, les mettre sous forme de JSON aide à la clarté parce que les clés sont étiquetées.
- Quand la question a besoin de données de support. Un schema, une taxonomie ou une ligne de base de données sont déjà du JSON. Utilise le JSON en entier, ou passe les sous-champs pertinents au lieu de les sérialiser dans un gabarit de chaîne.
Instructions structurées
Un objet field décrit le champ en cours de vérification, et chaque question s’y réfère par clé. La même forme pilote un Noul qui vérifie une valeur, un Choice qui en choisit une parmi des candidats, et deux Scores qui placent une valeur sur une échelle.
{
"state": {
"source_text": "Invoice #4471 issued March 3, 2026 to Beaver Dam Logistics for $12,840.00, net 30."
},
"questions": {
"invoice_number_is_correct": {
"type": "noul",
"instructions": {
"field": {
"name": "invoice_number",
"type": "string",
"description": "The identifier printed on the invoice."
},
"extracted_value": "4471",
"question": "Does `extracted_value` match the `field` as it appears in `source_text`?"
}
},
"customer_name": {
"type": "choice",
"instructions": {
"field": {
"name": "customer_name",
"type": "string",
"description": "The organization the invoice was issued to."
},
"question": "Which option is the value of `field` in `source_text`?"
},
"criteria": {
"Beaver Logistics": null,
"Dam Logistics": null,
"Beaver Dam Logistics": null,
"Beaver": null,
"Dam": null
}
},
"amount_due": {
"type": "score",
"instructions": {
"field": {
"name": "amount_due",
"type": "number",
"unit": "USD",
"description": "The total the invoice asks to be paid."
},
"question": "How large is the `field` value in `source_text`?"
},
"criteria": [
"Under $1,000",
"$1,000 to $10,000",
"$10,000 to $100,000",
"$100,000 to $1,000,000",
"Over $1,000,000"
]
},
"payment_terms": {
"type": "score",
"instructions": {
"field": {
"name": "payment_terms",
"type": "integer",
"unit": "days",
"description": "Days allowed for payment, from terms such as \"net 30\"."
},
"question": "How many days does the `field` in `source_text` allow for payment?"
},
"criteria": [
"Due on receipt",
"Net 10",
"Net 30",
"Net 60",
"Net 90"
]
}
}
}En code, tu pourrais parcourir les enregistrements potentiels et construire une de ces questions par champ, toutes envoyées dans un seul appel. Le cookbook SDE cascade fait quelque chose de similaire.
Les tableaux marchent aussi. Utilises-en un quand l’instruction est une liste de choses à vérifier ou à comparer :
"instructions": {
"question": "Does the claimed sender identity conflict with the sending domain?",
"compare": ["ticket.sender.display_name", "ticket.sender.email"],
"focus": "Compare the named organization with the email domain."
}
Options de Choice structurées
La description d’une option de Choice peut aussi être un objet structuré.
Grille JSON pour clarifier les frontières
{
"state": "I ordered the standing desk two weeks ago and tracking still says label created. Was I even charged?",
"questions": {
"department": {
"type": "choice",
"instructions": {
"question": "Which team should handle this message?",
"focus": "Classify the customer's primary request, not every topic mentioned."
},
"criteria": {
"billing": {
"what": "Charges, invoices, refunds, or subscriptions",
"not_for": "Order tracking or account access",
"examples": [
"I was charged twice",
"Where is my refund?"
]
},
"orders": {
"what": "Order status, delivery, cancellation, or returns",
"not_for": "Charges or account access",
"examples": [
"Where is my package?",
"Cancel my order"
]
},
"account": {
"what": "Login, password, profile, or security",
"not_for": "Charges or delivery",
"examples": [
"I can't log in",
"Change my email"
]
}
}
}
}
}L’exemple dit au modèle ce que chaque option couvre et ne couvre pas. Il affine la frontière entre les options.
Parcourir une taxonomie
Pour classer dans une taxonomie profonde, pose un Choice par niveau et parcours l’arbre en code. À chaque étape, les options sont les enfants du nœud courant, et la valeur de chaque option est l’arbre de l’enfant. Cela permet au modèle de voir ce qui se trouve sous une branche avant de s’y engager, ce qui compte quand l’élément appartient à une feuille dont le nom n’est pas évident à partir du seul nom de la branche.
Ici l’état est une fiche produit et la première question choisit un rayon de premier niveau.
{
"state": "32oz plastic bottle with a flip straw lid. Fits most bike cages.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which top-level department does this product belong to?",
"criteria": {
"Sporting Goods": {
"Cycling": [
"Bike Bottles & Cages",
"Bike Lights",
"Helmets"
],
"Fitness": [
"Yoga Mats",
"Resistance Bands"
],
"Outdoor": [
"Tents",
"Sleeping Bags",
"Hydration Packs"
]
},
"Home & Kitchen": {
"Drinkware": [
"Water Bottles",
"Travel Mugs",
"Tumblers"
],
"Cookware": [
"Pots & Pans",
"Bakeware"
]
},
"Baby & Toddler": [
"Sippy Cups",
"Bottle Warmers",
"Bibs"
]
}
}
}
}La bouteille pourrait relever de deux rayons. Montrer les sous-arbres permet au modèle de voir que Sporting Goods > Cycling > Bike Bottles & Cages et Home & Kitchen > Drinkware > Water Bottles existent tous les deux, et de peser l’accent mis par la fiche sur les porte-bidons face à la vaisselle du quotidien. Les probabilities de cette réponse te disent si la répartition est assez serrée pour explorer les deux branches.
Une fois un rayon choisi, pose le Choice suivant avec les enfants de ce rayon comme options et leurs sous-arbres comme valeurs, et répète jusqu’à atteindre une feuille. En code, cela peut être une boucle sur un dict imbriqué, où le criteria de chaque question est simplement le nœud courant. Le cookbook Classification hiérarchique montre un exemple de parcours similaire de l’arbre, y compris une recherche en faisceau qui garde plusieurs chemins candidats vivants quand les probabilités sont proches.
Niveaux de Score structurés
Chaque entrée d’un tableau criteria de Score peut être un objet.
{
"state": "Fixed the null check in the payment handler. Also refactored the retry loop while I was in there, and bumped the SDK version since the old one had that timeout bug.",
"questions": {
"pr_scope": {
"type": "score",
"instructions": {
"question": "How focused is this pull request description on a single change?",
"note": "Judge the number of independent changes, not the size of any one change."
},
"criteria": [
{
"summary": "One change, clearly stated",
"signals": [
"A single fix or feature",
"Nothing described as \"also\" or \"while I was in there\""
]
},
{
"summary": "One main change plus a small related tweak",
"signals": [
"A primary change and one minor adjacent edit",
"The tweak supports the main change"
]
},
{
"summary": "Several independent changes bundled together",
"signals": [
"Two or more unrelated fixes or features",
"Changes that could each be their own PR"
]
}
]
}
}
}Criteria de Noul structurés
Les criteria de Noul sont facultatifs, et quand la frontière oui/non est subtile, des descriptions structurées true et false te permettent de la fixer avec une définition et des exemples de chaque côté.
{
"state": {
"sender": {
"display_name": "Beaver Dam Builders Ltd.",
"email": "donotreply@payroll.example"
},
"message": "Your Q3 bonus is ready. Reply with your login password so we can verify your identity and release the funds."
},
"questions": {
"requests_credentials": {
"type": "noul",
"instructions": {
"question": "Does the `message` ask the recipient to disclose a sensitive credential?",
"inspect": "message",
"focus": "Look for a request to send the credential itself, not a request to change or reset it."
},
"criteria": {
"true": {
"what": "Asks the recipient to reply with, type, or send a password, PIN, one-time code, or other security sensitive answer",
"examples": [
"Reply with your password",
"Send us the 6-digit code you just received"
]
},
"false": {
"what": "No sensitive credential is requested",
"examples": [
"Reset your password from the settings page",
"Your statement is ready"
]
}
}
}
}
}