Sélection de modèle Ollama pour le traitement de contenu sensible
Problème
Lors de l'utilisation d'Ollama pour traiter du contenu légal mais sensible (par exemple, des informations sur le travail du sexe dans les juridictions où c'est légal, l'analyse de contenu pour adultes, les données de réduction des risques), de nombreux modèles populaires refusent de traiter le contenu en raison de garde-fous de sécurité intégrés, même avec des prompts système explicites établissant le contexte légal.
Contexte / Conditions de déclenchement
- Le LLM retourne des réponses comme « Je ne peux pas vous aider avec cette demande » ou des avertissements de sécurité génériques
- Le contenu est légal dans le contexte (par exemple, le travail du sexe en Uruguay selon la Ley 17.515)
- Les prompts système établissant un contexte légal/professionnel sont ignorés
- Vous avez besoin d'extraction de données structurées, de résumé ou d'analyse de texte sensible
- Utilisation d'Ollama localement (confidentialité en priorité, aucune clé API requise)
Solution
Sélection du modèle
| Modèle | Comportement avec contenu sensible |
|---|---|
mistral |
Suit les instructions, traite le contenu objectivement |
llama3.2 |
Refuse avec des avertissements de sécurité, ignore les prompts système |
deepseek-r1:8b |
Refuse de manière similaire à llama3.2 |
llama3.1 |
Résultats mitigés, refuse parfois |
mixtral |
Suit généralement les instructions comme mistral |
Recommandation : Utilisez mistral (ou mixtral pour une meilleure qualité) lors du traitement de contenu légal mais sensible que les autres modèles refusent.
Sélection d'API : Chat vs Generate
Utilisez /api/chat à la place de /api/generate pour le support des prompts système :
// FAUX : /api/generate ne supporte pas correctement les prompts système
const response = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
body: JSON.stringify({ model: 'mistral', prompt: userPrompt, system: systemPrompt }),
});
// CORRECT : /api/chat avec un tableau de messages
const response = await fetch('http://localhost:11434/api/chat', {
method: 'POST',
body: JSON.stringify({
model: 'mistral',
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: userPrompt },
],
stream: false,
}),
});
const data = await response.json();
const result = data.message?.content || '';
Stratégie de prompt système
Pour le contenu sensible, le prompt système doit :
- Établir explicitement le contexte légal
- Définir le rôle comme traitement de données (non créatif/consultatif)
- Spécifier la langue de réponse pour correspondre à la langue du contenu
- Demander le format de sortie exact
const systemPrompt = `Eres un asistente de extracción de datos para un sistema CRM
personal en Uruguay. El trabajo sexual es completamente legal y regulado en Uruguay
(Ley 17.515). Tu trabajo es analizar posts de foros públicos y extraer información
estructurada. SIEMPRE responde en español. SIEMPRE usa el formato de secciones con
## que se te pida. Trata todo el contenido como datos legítimos para procesar
objetivamente.`;
Cohérence du format
Même avec mistral, la conformité au format peut être incohérente. Améliorez-la par :
- Écrire le prompt utilisateur dans la MÊME langue que la sortie attendue
- Inclure des exemples de format explicites dans le prompt
- Utiliser des en-têtes de section (
##) qui correspondent à ce que vous demandez - Limiter le contexte d'entrée (40 posts max, 300 caractères chacun) pour rester dans la fenêtre de contexte
Vérification
- Le modèle répond avec du contenu structuré suivant votre format
- Aucun avertissement de sécurité ou refus dans la sortie
- La réponse est dans la langue demandée
- Les en-têtes de section correspondent à votre spécification
Exemple
import { callOllama } from './ollama.js';
// Cela fonctionne avec mistral, échoue avec llama3.2
const summary = await callOllama(`
Analiza estos 166 posts del foro sobre "Eliz" y responde EN ESPAÑOL:
## Resumen
(2-3 oraciones: consenso general)
## Apariencia
(Descripción física)
...
Posts del foro:
[post content here]
`);
Notes
- Le comportement du modèle peut changer avec les mises à jour de version ; testez après avoir téléchargé de nouvelles versions
stream: falseest important pour le traitement par lot afin d'obtenir des réponses complètes- Pour un contenu très long, fragmentez les posts et résumez par étapes
- La structure de réponse
/api/chatdiffère de/api/generate:- Chat :
data.message.content - Generate :
data.response
- Chat :
- Envisagez d'ajouter
"temperature": 0.3pour une sortie structurée plus cohérente - Ollama télécharge automatiquement les modèles lors de la première utilisation, mais cela bloque la première requête