Les grands modèles de langage (LLM) offrent d’excellentes capacités de raisonnement et de synthèse des données qui en font de précieux alliés dans un large éventail de tâches de sécurité. Malheureusement, il arrive que leurs performances se dégradent lorsqu’on les applique à des tâches très spécifiques ou dépendant fortement du contexte de l’entreprise, surtout si les modèles en question ont été uniquement entraînés sur des données publiques.
Cette étude s’intéresse aux méthodes qui permettent de guider les LLM dans des objectifs de sécurité précis, en poursuivant notre étude des techniques de classification des scripts PowerShell. En adaptant notre workflow DSDL pour inclure l’apprentissage en quelques coups, la génération augmentée par récupération (RAG) et l’ajustement fin, nous évaluons les gains de performance possibles ainsi que les compromis qu’implique chaque technique.
Notre première méthode s’appuie sur le prompt de notre test de référence : nous avons demandé à différents modèles à poids ouvert d’effectuer la classification PowerShell sur la plateforme Splunk. L’apprentissage en quelques coups leur fournit plusieurs exemples accompagnés de leur étiquette pour faciliter la tâche de classification. Avec quelques exemples étiquetés (d’un à cinq en général), un modèle peut apprendre un motif ou découvrir des attributs qui caractérisent des catégories sous-jacentes. Le nombre d’exemples à utiliser dépend de la longueur de contexte du modèle. Celle-ci inclut votre prompt, les exemples d’entrées, les instructions et les réponses du modèle. Les tokens, qui correspondent approximativement à des mots ou des portions de mots, sont les unités qui remplissent cet espace.
Par exemple, si un modèle présente une longueur de contexte de 4 000 tokens, vous pouvez composer votre prompt avec quelques paragraphes de texte, plusieurs exemples et une description de la tâche, tant que la longueur totale reste inférieure à 4 000 tokens. Au-delà de cette limite, le modèle a deux possibilités : ignorer le contenu antérieur ou se retrouver incapable de répondre correctement. Avec une longueur de contexte supérieure, les utilisateurs pourront inclure des dizaines, voire des centaines d’exemples dans leur prompt. Baptisée « apprentissage en plusieurs coups », cette technique offre souvent de meilleures performances, outre une grande flexibilité puisqu’elle s’applique à la volée.
Le modèle que nous utilisons pour ce test, Llama3-8B, prend en charge une longueur de contexte d’environ 8 000 tokens. Si l’on calcule la longueur moyenne des scripts de notre dataset, cela permet d’accueillir six exemples (trois par classe) sans risquer la troncature. Parviendrons-nous à améliorer la précision de la classification PowerShell avec une poignée d’exemples ?
Pour ce test, nous avons modifié manuellement le notebook llm_rag_ollama_text_processing de DSDL de manière à insérer les exemples directement dans le prompt, puis nous avons utilisé SPL pour initier et analyser les résultats :
index="powershell_encoded" encoded=* | eval seed="19844" | eval hash_val = tonumber(substr(md5(seed . label . Content), 1, 8), 16) | eval rand_val = hash_val / ********** | eventstats count AS total_count BY label | sort label rand_val | streamstats count AS class_count BY label | where class_count <= 500 | table Content, label | rename Content as text | fit MLTKContainer algo=RF_llm_rag_ollama_text_processing_megaprompt model_name="llama3" prompt="You are a cybersecurity expert. Classify the intent of the PowerShell script. Choose from ’malicious’ or ’benign’. Only output the category name in your answer." text into app:RF_llm_rag_ollama_text_processing as LLM
Quelques exemples suffisent à observer une amélioration de la précision (+8 %) et de l’exactitude (+6 %) du modèle pour la classification PowerShell. Ces mesures se traduisent par une augmentation de l’identification correcte des scripts malveillants (vrais positifs) sans que le temps de réponse moyen n’en souffre.
| Référence | Apprentissage en quelques coups |
|---|---|
![]() |
![]() |
| Méthode | Précision | Rappel | Exactitude | F1 | Temps moyen de réponse |
|---|---|---|---|---|---|
| Référence | 0,78 | 1,00 | 0,86 | 0,87 | 0,74 seconde |
| Apprentissage en quelques coups | 0,86 | 0,99 | 0,92 | 0,92 | 0,74 seconde |
Quelques astuces pour utiliser au mieux l’apprentissage en quelques coups :
Notre deuxième méthode, la RAG, est un peu plus complexe, mais apporte également une amélioration bienvenue à la précision des résultats. La RAG utilise une base de données vectorielle pour stocker des données encodées qui sont sollicitées pour apporter du contexte au prompt de l’utilisateur. Pour utiliser la RAG avec DSDL, vous devez exécuter le conteneur Milvus via Ollama.
Pour faciliter la classification PowerShell, nous commençons par intégrer une série de scripts malveillants et bénins sous forme de données vectorielles à l’aide du DSDL Encoding Assistant. Une fois les données incorporées dans la base de données Milvus (sous forme de vecteurs numériques), nous utilisons l’assistant LLM-RAG ou du notebook llm_rag_script pour interroger le modèle en utilisant la nouvelle collection de données comme contexte. Le paramètre top_k contrôle le nombre d’exemples (échantillons de scripts PowerShell) récupérés qui sont effectivement sélectionnés, selon des critères de similarité vectorielle avec la requête principale.

Pour tout remettre en contexte, lorsque le modèle entame son raisonnement de classification sur un nouvel échantillon, il examine d’abord le script concerné sous forme vectorisée. Il utilise ensuite les métriques de distance de la RAG pour récupérer les échantillons top_k les plus proches à titre de contexte pour étayer sa décision de classification. Sur notre échantillon aléatoire répété, cela prend la forme suivante :
index="powershell_encoded" encoded=* | eval seed="19844" | eval hash_val = tonumber(substr(md5(seed . label . Content), 1, 8), 16) | eval rand_val = hash_val / 4294967295 | eventstats count AS total_count BY label | sort label rand_val | streamstats count AS class_count BY label | where class_count <= 500 | table Content, label | rename Content as query | eval query = "You are a cybersecurity expert. Classify the intent of the PowerShell script. Choose from ’malicious’ or ’benign’. Only output the category name in your answer." + query | fit MLTKContainer algo=llm_rag_script model_name=llama3 embedder_name="all-MiniLM-L6-v2" use_local=1 embedder_dimension=384 collection_name=RAG_final top_k=2 rag_type=Documents query into app:llm_rag_script
C’est avec la RAG que nous observons jusqu’ici les meilleurs gains de précision (+19 %) et d’exactitude (+7 %) par rapport à la référence, mais l’opération a un certain coût en termes de temps de rappel et de réponse. Dans des tâches comme la classification PowerShell, qui s’applique à des échantillons malveillants d’une grande diversité (dissimulation, LOLBins, chaînes encodées, etc.), il n’est pas intéressant d’insérer des dizaines, voire des centaines d’exemples dans un prompt statique à des fins d’apprentissage en quelques coups. Au lieu de cela, grâce à la recherche vectorielle, la RAG peut limiter son ciblage aux motifs les plus similaires et éviter le bruit inutile. L’acquisition de ce contexte supplémentaire troque une meilleure précision contre un temps de réponse légèrement supérieur. On relèvera que, dans notre cas, l’extraction des quatre exemples les plus proches (top_k=4) n’a pas permis de gagner davantage en précision que l’extraction de deux exemples similaires (top_k=2).
| Inférence seule | Apprentissage en quelques coups | LLM-RAG | |
|---|---|---|---|
| référence | 6 exemples (3 malveillants et 3 bénins) | top_k=2 | top_k=4 |
![]() |
![]() |
![]() |
![]() |
| Méthode | Précision | Rappel | Exactitude | F1 | Temps moyen de réponse |
|---|---|---|---|---|---|
| Référence | 0,78 | 1,00 | 0,86 | 0,87 | 0,74 seconde |
| Apprentissage en quelques coups | 0,86 | 0,99 | 0,92 | 0,92 | 0,74 seconde |
| LLM-RAG top_k:2 | 0,97 | 0,89 | 0,93 | 0,93 | 2,5 secondes |
| LLM-RAG top_k:4 | 0,96 | 0,89 | 0,93 | 0,92 | 6,3 secondes |
Quelques astuces pour utiliser la RAG au mieux :
La dernière option pour cibler un problème de sécurité spécifique consiste à ajuster un modèle préentraîné sur votre domaine ou votre scénario d’utilisation. Le peaufinage s’appuie sur les connaissances linguistiques générales et la capacité de raisonnement du modèle de base, et modifie légèrement les pondérations au cours d’un processus d’entraînement alimenté par des données supplémentaires. Les exigences de l’ajustement varient selon la méthode utilisée, mais il peut demander beaucoup de temps et mobiliser d’importantes ressources financières et de calcul.
Il est toujours possible d’affiner Llama3, mais son architecture dédiée au décodage se prête mieux aux tâches de génération de texte et de raisonnement qu’à la classification. Cette année, l’équipe Foundation AI de Cisco a lancé Foundation-Sec-8B, un modèle à poids ouvert basé sur le modèle LLama3-8B et affiné pour les applications cybersécurité. Le modèle Foundation-Sec-8B est un allié précieux dans une variété de scénarios de sécurité généralisés.
Pour la tâche de classification PowerShell qui nous intéresse, un modèle dédié à l’encodage comme RoBERTa, spécifiquement conçu pour encoder des représentations significatives de ses données d’entraînement, est bien mieux indiqué. Pour comparer les performances de cette option à celles de l’apprentissage en quelques coups et de la RAG, nous avons procédé à un ajustement complet et créé la variante neon-RoBERTa. Ce modèle bénéficie d’une petite couche de réseau de neurones supplémentaire, superposée au modèle préentraîné pour réaliser la tâche de classification PowerShell binaire.

Notre modèle encodeur affiné montre les optimisations de performance et de précision qui deviennent possibles lorsqu’un modèle se spécialise dans une tâche donnée, même si l’élaboration d’une telle solution demande les plus hauts niveaux de ressources. Dans l’ensemble, ce modèle offre un gain de précision de 21 % et d’exactitude de 13 %, tout en réduisant le temps de classification de 99 % par échantillon. En revanche, ce modèle ne possède pas les capacités intrinsèques de langage naturel d’un modèle décodeur comme Llama3, ni les connaissances en sécurité de Foundation-Sec-8b ; il se concentre uniquement sur la classification PowerShell.
| Peaufinage |
|---|
![]() |
| Méthode | Précision | Rappel | Exactitude | F1 | Temps moyen de réponse |
|---|---|---|---|---|---|
| Référence | 0,78 | 1,00 | 0,86 | 0,87 | 0,74 seconde |
| Apprentissage en quelques coups | 0,86 | 0,99 | 0,92 | 0,92 | 0,74 seconde |
| LLM-RAG top_k:2 | 0,97 | 0,89 | 0,93 | 0,93 | 2,5 secondes |
| LLM-RAG top_k:4 | 0,96 | 0,89 | 0,93 | 0,92 | 6,3 secondes |
| Peaufinage (RoBERTa) | 0,99 | 0,98 | 0,99 | 0,99 | 7,7 microsecondes |
Quelques facteurs à prendre en compte pour le peaufinage :
Lorsque vous sollicitez le LLM pour un problème de sécurité, de nombreuses options s’offrent à vous pour enrichir le prompt de base et orienter le modèle de façon à améliorer les résultats. Nous avons analysé l’apprentissage en quelques coups, la RAG avec DSDL et l’ajustement fin, et mesuré les améliorations significatives qu’offrent ces méthodes pour la classification PowerShell.
L’apprentissage en quelques coups et la RAG s’appuient sur l’intégration d’exemples de qualité et d’informations pertinentes dans la longueur du contexte pour guider la sortie du modèle. Cette longueur détermine la richesse du contexte que le modèle peut utiliser pour étayer son raisonnement. En cas de doute, pensez à ajouter quelques échantillons à votre prompt. Un petit ensemble d’exemples a suffi à améliorer sensiblement les performances de notre cas de test. Pour relever des défis plus complexes, la RAG a fait ses preuves, notamment parce qu’elle ne collecte que les exemples les plus pertinents pour enrichir le contexte.
L’ajustement fin peut modeler les connaissances d’un modèle pour améliorer ses performances dans un domaine ou une tâche spécifique. Les modèles de fondation se prêtent parfaitement aux scénarios d’utilisation polyvalents, mais ils peuvent être guidés pour fournir des capacités de classification. Toutefois, pour obtenir les meilleurs résultats sur des tâches précises comme la classification de sécurité, il était plus simple et rapide d’ajuster un modèle encodeur existant.
Avec les progrès rapides de l’IA, l’éventail des options d’analyse et de leurs applications à la cybersécurité s’élargit sans cesse. Ces outils et ces techniques peuvent être extrêmement puissants pour soutenir et accélérer les efforts de détection, comme l’illustre notre concept de chasse aux menaces sous supervision d’un modèle. Nous espérons que cette étude vous aidera à mieux comprendre les options qui s’offrent à vous et à exploiter tout le potentiel de vos données de sécurité avec Splunk !
Les plus grandes organisations mondiales font confiance à Splunk, une entreprise de Cisco, pour renforcer en permanence leur résilience numérique grâce à une plateforme unifiée de sécurité et d’observabilité, alimentée par une IA de pointe.
Nos clients se fient aux solutions de sécurité et d’observabilité primées de Splunk pour sécuriser leurs environnements numériques complexes et en renforcer la fiabilité, quelle que soit l’échelle.