Een praktische handleiding voor platte tekst en JSON-antwoorden
Lessons geleerd tijdens het bouwen van een 12-speler AI Jeopardy simulatie aangedreven door Ministral-3-14B-Instruct-2512.
Uitvoeren Ministral-3 op vLLM is verrassend krachtig. Het model is snel, creatief en in staat om hoogwaardige antwoorden te produceren, zelfs onder zware belasting.
Maar zodra je overgaat van eenvoudige chatprompts naar gestructureerde output, automatisering of programmatisch gebruikdingen snel ingewikkeld worden.
Tijdens de ontwikkeling van een AI-gestuurd Jeopardy-spel met 12 gelijktijdige spelers en honderden modeloproepen, we kwamen verschillende praktische problemen tegen:
Deze handleiding vat samen praktische lessen geleerd tijdens het oplossen van deze problemensamen met concrete patronen die je in je eigen projecten kunt hergebruiken.
Ons benchmarkproject simuleert een volledig Jeopardy-spel waarin:
Een enkele spelronde kan gemakkelijk 800 API-aanroepen overschrijden 800 API-oproepen.
Deze omgeving bracht randgevallen aan het licht die zelden voorkomen in eenvoudige demo's — waardoor het een geweldige testomgeving is om te begrijpen hoe Ministral presteert onder echte productiebelastingen.
Ministral-modellen Gebruik niet de standaard HuggingFace tokenizer configuratie.
Dit betekent dat het opstartcommando expliciet de Mistral tokenizer-formaat.
vllm serve mistralai/Ministral-3-14B-Instruct-2512 \
--tokenizer_mode mistral \
--config_format mistral \
--load_format mistral
Als uw applicatie hiervan afhankelijk is functie aanroepen, voeg de tool-vlaggen toe:
--enable-auto-tool-choice
--tool-call-parser mistral
In tegenstelling tot sommige andere modellen, Ministral ondersteunt dit niet chat_template_kwargs.
Als u een verzoek als dit verzendt:
{
"chat_template_kwargs": {
"enable_thinking": false
}
}
vLLM retourneert:
HTTP 400: chat_template is not supported for Mistral tokenizers
Dat betekent functies zoals expliciete "denkmodus" schakeling (gebruikt met modellen zoals Qwen of DeepSeek) zijn eenvoudigweg niet beschikbaar.
Gelukkig is dit zelden nodig omdat Ministral standaard al beknopte uitvoer produceert.
De officiële vLLM documentatie gebruikt consequent de volgende waarde met Ministral-3:
temperature = 0.15
Op het eerste gezicht lijkt dit erg laag. Echter, blijkt dit toch het geval te zijn. cruciaal voor gestructureerde taken.
Met de standaardinstellingen van OpenAI:
temperature: 0.7
het model wordt overdreven creatief met structuur.
Een eenvoudige vraag zoals:
{ "expertise": "2-3 topics they know best" }
kan zoiets retourneren:
{
"expertise": [
{
"category": "Gourmet Pizza Alchemy",
"detail": "Can transform random ingredients into Michelin-star pizza"
},
{
"category": "Sumo Wrestling Physics",
"detail": "Understands body mechanics and center-of-gravity combat"
}
]
}
Technisch gezien geldige JSON, maar het is niet wat het schema vroeg.
Het resultaat:
max_tokens limieten worden overschreden0.15 werkt beterBij lage temperatuur wordt het model structureel gedisciplineerd.
temperature: 0.15
Voordelen:
Zelfs creatieve tekstgeneratie blijft sterk — het model stopt simpelweg met het improviseren met structuur.
Aanbeveling:
Gebruik temperature: 0.15 als uw standaardwaarde voor Ministral-3.
Produceren machine-leesbare JSON van LLM's is lastiger dan het klinkt.
Ministral interpreteert schema-velden vaak semantisch semantisch in plaats van structureel, wat resulteert in een diep geneste uitvoer.
Een prompt zoals:
Return JSON with these fields.
produceert vaak uitvoerige structuren.
Voorbeeld aanvraag:
{ "expertise": "2-3 topics they know best" }
Typische reactie:
{
"expertise": [
{
"category": "Ancient Roman Engineering",
"detail": "Knows aqueduct systems in surprising detail"
},
{
"category": "Pizza Dough Chemistry",
"detail": "Obsessed with yeast fermentation dynamics"
}
]
}
Dit verbruikt drie keer het verwachte aantal tokens.
De meest betrouwbare oplossing combineert twee instructies.
Respond with ONLY valid JSON.
No markdown, no explanation, no text before or after the JSON.
Keep values as short plain strings — never use nested objects or arrays.
Direct naast de schema definitie:
Every value MUST be a short plain string — NO arrays, NO nested objects.
Gecombineerd met temperatuur 0.15dit produceert voorspelbare platte JSON.
Zelfs wanneer beperkt, heeft Mistral de neiging om te produceren langere waarden dan andere modellen.
Voorbeeld observatie uit onze benchmark:
| Model | Benodigde tokens |
|---|---|
| GPT-4o | ~512 |
| Qwen | ~512 |
| Ministral-3 | ~1024 |
Een veilige regel:
Houd rekening met 1,5–2× het aantal tokens voor JSON-uitvoer.
Zelfs met perfecte prompts genereren modellen af en toe ongeldige JSON.
Een goede strategie is om toe te voegen defensieve parsing lagen.
function extractJSON(raw, shape) {
var text = raw.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/i, '').trim();
if (shape === 'array') {
var m = text.match(/\[[\s\S]*\]/);
if (m) text = m[0];
} else {
var m = text.match(/\{[\s\S]*\}/);
if (m) text = m[0];
}
return text;
}
Open en sluit haakjes automatisch:
var stack = [];
var inStr = false, esc = false;
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (esc) { esc = false; continue; }
if (ch === '\\') { esc = true; continue; }
if (ch === '"') { inStr = !inStr; continue; }
if (inStr) continue;
if (ch === '{') stack.push('}');
else if (ch === '[') stack.push(']');
else if (ch === '}' || ch === ']') stack.pop();
}
text = text.replace(/,\s*$/, '');
while (stack.length > 0)
text += stack.pop();
Als het model nog steeds geneste structuren retourneert:
if (Array.isArray(value)) {
flat = value.map(function(item) {
if (typeof item === 'string') return item;
if (typeof item === 'object') return Object.values(item).join(' — ');
return String(item);
}).join(', ');
}
Een eenvoudige herhaallus verhoogt de betrouwbaarheid aanzienlijk.
Omdat Ministral gedraagt zich consistent bij lage temperaturenherhalingen lukken meestal.
Aanbevolen:
2–3 retry attempts
Ministral houdt van opmaak.
Zelfs wanneer je om platte tekst vraagt, heeft het de neiging om te produceren:
Dit gebeurt omdat het model wordt geleverd met een ingebouwde systeemprompt die rijke markdown-opmaak aanmoedigt.
Veel pipelines vertrouwen op eenvoudige stringcontroles.
Voorbeeld:
verdict.toUpperCase().startsWith('CORRECT')
Maar als het model teruggeeft:
**CORRECT**
de controle mislukt.
De veiligste aanpak is om normaliseer alle uitvoer voor verwerking.
function stripMarkdown(text) {
if (!text) return text;
var s = text.replace(/\*\*([^*]+)\*\*/g, '$1');
s = s.replace(/__([^_]+)__/g, '$1');
s = s.replace(/\*([^*]+)\*/g, '$1');
s = s.replace(/^#{1,6}\s+/gm, '');
s = s.replace(/`([^`]+)`/g, '$1');
s = s.replace(/^```[a-z]*\s*$/gm, '');
return s.trim();
}
Pas dit toe voor elk modelantwoord, niet alleen Ministral.
Het vermijdt model-specifieke vertakkingen en houdt pipelines consistent.
Als uw systeem meerdere modelfamilies ondersteunt (Mistral, Qwen, DeepSeek, Llama, enz.), is het meest onderhoudbare ontwerp om centraliseer modelgedrag op één plek.
Voorbeeld:
function buildModelProfile(modelName) {
var lower = modelName.toLowerCase();
var isMistral = lower.includes('mistral') || lower.includes('ministral');
return {
family: isMistral ? 'Mistral' : 'Generic',
jsonSystemInstruction: isMistral
? 'Respond with ONLY valid JSON. No markdown. Keep values as short plain strings.'
: 'You output only valid JSON. No markdown fences, no explanation.',
jsonSchemaHint: isMistral
? ' Every value MUST be a short plain string — NO arrays, NO nested objects.'
: '',
jsonTemperature: isMistral ? 0.15 : 0.7,
defaultTemperature: isMistral ? 0.15 : 0.7,
plainTextInstruction: ' Do not use markdown formatting.'
};
}
Hierdoor kan de rest van uw systeem behouden blijven. model-onafhankelijk.
Het toevoegen van een nieuw model wordt later triviaal.
| Instelling | Aanbevolen Waarde | Reden |
|---|---|---|
| tokenizer_mode | mistral | Vereist voor de juiste tokenizer |
| config_format | mistral | Vereist |
| load_format | mistral | Vereist |
| chat_template_kwargs | Niet verzenden | Niet ondersteund |
| temperatuur | 0.15 | Voorkomt structurele hallucinaties |
| JSON-instructie | Expliciete platte waarden | Vermijd geneste objecten |
| max_tokens | 1,5–2× gebruikelijk | Het model is uitvoerig |
| Markdown verwijdering | Altijd | Voorkom formateringsfouten |
| JSON-pogingen | 2–3 pogingen | Betrouwbare herstel |
Ministral-3 presteert uitzonderlijk goed wanneer het correct is afgestemd.
Zodra je:
het model wordt opmerkelijk voorspelbaar en productieklaar.
In onze Jeopardy benchmark ondersteunde deze setup:
Alles draait lokaal op Trooper.AI GPU-infrastructuur.
Probeer hier de volledige vLLM-implementatiesjabloon: vLLM OpenAI-Compatibele Server
Huur vandaag nog uw eigen GPU-server en begin met het bouwen van geweldige AI-applicaties! Trooper.AI GPU-servers zijn gebouwd met uitsluitend gerecyclede high-end technologie van de afgelopen jaren, ontworpen om u de beste prestaties, beveiliging en betrouwbaarheid te bieden voor al uw AI-behoeften.
EU-locatie · Hoge privacy · Geweldige prestaties · Beste ondersteuning