Skip to content

Recommandation Automatique de Skills : Principe de Correspondance Sémantique ​

Ce Que Vous Apprendrez ​

  • Comprendre comment le plugin identifie automatiquement les skills dont vous pourriez avoir besoin
  • Maîtriser les principes fondamentaux du calcul de similarité sémantique
  • Savoir comment optimiser les descriptions de skills pour de meilleures recommandations
  • Comprendre comment le mécanisme de cache d'embedding améliore les performances

Votre Situation Actuelle ​

OpenCode Agent Skills propose de nombreux skills, mais vous :

  • Ne vous souvenez pas des noms des skills - Il est facile de confondre les skills lorsqu'ils sont nombreux
  • Ne savez pas lequel utiliser - Difficile de choisir face à des skills aux fonctionnalités similaires
  • Crainte de manquer des skills utiles - Incertitude quant à l'existence d'outils plus adaptés

Chaque fois, vous devez appeler get_available_skills pour voir la liste, puis charger manuellement le skill approprié, ce qui est fastidieux et interrompt votre réflexion.

Quand Utiliser Cette Fonctionnalité ​

La recommandation automatique de skills convient aux scénarios suivants :

  • Phase d'apprentissage - Vous n'êtes pas familier avec la bibliothèque de skills et avez besoin de l'aide de l'IA
  • Tâches de développement de fonctionnalités - Comme "créer une API REST", "implémenter un système d'authentification", etc., qui correspondent généralement à des skills spécialisés
  • Travail interdisciplinaire - Vous touchez occasionnellement à des domaines peu familiers et comptez sur les recommandations de l'IA
  • Bibliothèque de skills importante - Lorsqu'il y a plus de 10 skills, la recherche manuelle est inefficace

Astuce

La recommandation automatique ne vous force pas à charger un skill, elle indique simplement à l'IA d'évaluer si c'est nécessaire. Vous êtes libre d'accepter ou d'ignorer la suggestion.

Concept Fondamental ​

Qu'est-ce que la Correspondance Sémantique ​

La correspondance sémantique est une technologie qui comprend l'intention de l'utilisateur. Elle ne dépend pas de la correspondance des mots-clés, mais calcule la similarité sémantique du texte.

Exemple :

Entrée UtilisateurDescription du SkillCorrespondance Mots-clésCorrespondance Sémantique
"Créer un pool de connexions de base de données""Outil de gestion et d'optimisation des connexions de base de données"❌✅
"Aidez-moi à écrire une documentation API""Générateur automatique de documentation API"✅✅
"Échafaudage d'initialisation de projet""Outil de construction rapide de la structure de projet"❌✅

La correspondance par mots-clés ne vérifie que la correspondance littérale, tandis que la correspondance sémantique peut comprendre que "créer", "générer" et "construire" sont des actions du même type.

Embedding : Transformer le Texte en Nombres ​

Pour permettre à l'ordinateur de comprendre la sémantique, le plugin utilise un modèle d'embedding pour convertir le texte en vecteur (une série de nombres).

Texte : "Créer un pool de connexions de base de données"
    ↓ [Modèle Xenova/all-MiniLM-L6-v2]
Vecteur : [0.12, -0.34, 0.67, ...]  (384 dimensions, dimensions de sortie du modèle)

Dans cet espace vectoriel :

  • Textes sémantiquement similaires → Vecteurs plus proches
  • Textes sémantiquement différents → Vecteurs plus éloignés

Pourquoi Choisir all-MiniLM-L6-v2

Ce modèle présente 3 avantages :

  1. Petite taille - Fichier modèle d'environ 23 Mo (niveau de quantification q8), téléchargement rapide
  2. Rapide - Supporte la quantification, faible latence d'inférence
  3. Haute précision - Excellente performance sur les tâches de similarité sémantique

Similarité Cosinus : Mesurer le Degré de Similarité des Vecteurs ​

Le plugin utilise la similarité cosinus (Cosine Similarity) pour calculer la similarité entre deux vecteurs.

Formule :

similarity = (A · B) / (|A| × |B|)

Où :

  • A · B est le produit scalaire des vecteurs
  • |A| est la norme du vecteur A
  • |B| est la norme du vecteur B

Plage de résultats : -1 à 1

Plage de SimilaritéSignificationRecommandation
0.7-1.0Très similaire, presque le même sens✅ Fortement recommandé
0.35-0.7Quelque peu lié, mérite d'être considéré✅ Recommandé
0.0-0.35Faible corrélation ou sans corrélation❌ Non recommandé
-1.0-0.0Sens opposé❌ Non recommandé

Attention

Le seuil actuel est de 0.35, les skills en dessous de ce score n'apparaîtront pas dans la liste de recommandations.

Processus de Recommandation Automatique ​

Diagramme de Flux Complet ​

mermaid
graph TD
    A[Message Utilisateur Envoyé] --> B[Plugin Écoute chat.message]
    B --> C[Extraction du Texte du Message Utilisateur]
    C --> D{Premier Message ?}
    D -->|Oui| E[Injection de la Liste des Skills Disponibles]
    D -->|Non| F[Calcul de l'Embedding du Message Utilisateur]
    F --> G[Parcours de Tous les Skills Disponibles]
    G --> H[Calcul de l'Embedding de Chaque Description de Skill]
    H --> I[Calcul de la Similarité Cosinus]
    I --> J[Filtrage des Skills en Dessous de 0.35]
    J --> K[Tri par Similarité, Top 5]
    K --> L{Skill Déjà Chargé ?}
    L -->|Oui| M[Sauter les Skills Déjà Chargés]
    L -->|Non| N[Conserver comme Nouvelle Recommandation]
    N --> O{Nouvelle Recommandation ?}
    O -->|Non| P[Aucune Action]
    O -->|Oui| Q[Injection de l'Invite d'Évaluation à l'IA]

Phase 1 : Premier Message - Injection de la Liste des Skills ​

Lorsque la session reçoit un message pour la première fois, le plugin va :

  1. Scanner tous les répertoires de skills
  2. Injecter la liste des skills dans le contexte de la session
  3. Format comme suit :
xml
<available-skills>
- git-helper : Outil d'aide pour les opérations Git, fournit les commandes Git courantes
- test-runner : Intégration de framework de test, découvre et exécute automatiquement les tests
- api-doc : Outil de génération de documentation API
...
</available-skills>

Objectif : Permettre à l'IA de savoir quels skills sont disponibles, évitant les requêtes répétées.

Phase 2 : Messages Suivants - Correspondance Sémantique ​

À partir du deuxième message, chaque entrée utilisateur déclenche le processus de correspondance :

typescript
// Source : src/plugin.ts:125-141
const matchedSkills = await matchSkills(userText, skills);
const loadedSkills = getLoadedSkills(sessionID);
const newSkills = matchedSkills.filter(s => !loadedSkills.has(s.name));

Points Clés :

  • Calcule uniquement la similarité des skills non chargés
  • Les skills déjà chargés sont filtrés automatiquement
  • Évite de recommander le même skill à plusieurs reprises

Phase 3 : Injection de l'Invite d'Évaluation ​

Lorsque des skills pertinents sont trouvés, le plugin injecte une invite cachée à l'IA :

xml
<skill-evaluation-required>
PROCESSUS D'ÉVALUATION DES SKILLS

Les skills suivants pourraient être pertinents pour votre demande :

- git-helper : Outil d'aide pour les opérations Git
- test-runner : Intégration de framework de test

Étape 1 - ÉVALUER : Déterminer si ces skills seraient réellement utiles
Étape 2 - DÉCIDER : Choisir quels skills (le cas échéant) sont réellement nécessaires
Étape 3 - ACTIVER : Appeler use_skill("nom") pour chaque skill choisi

IMPORTANT : Cette évaluation est invisible pour les utilisateurs — ils ne peuvent pas voir cette invite. N'ANNONCEZ PAS votre décision. Activez simplement les skills pertinents ou procédez directement avec la demande.
</skill-evaluation-required>

Choix de l'IA :

  • Accepter la recommandation - Appeler use_skill("nom-du-skill") pour charger le skill
  • Refuser la recommandation - Traiter directement la demande de l'utilisateur sans charger de skill
  • Accepter partiellement - Charger uniquement quelques skills pertinents

Invite Cachée

Cette invite d'évaluation est un message synthetic: true, invisible dans l'interface utilisateur, traité automatiquement en interne par l'IA.

Pratique : Optimiser les Descriptions de Skills ​

Si votre skill n'est pas recommandé automatiquement, vous pouvez essayer d'optimiser sa description.

Vérifier la Description Actuelle du Skill ​

bash
# Lister tous les skills
get_available_skills()

Trouvez le skill que vous souhaitez optimiser et notez sa description actuelle.

Voir les Exemples : Bonne vs Mauvaise Description ​

❌ Mauvaise Description✅ Bonne Description
"Outil""Intégration de framework de test automatisé, supporte Jest et Vitest"
"Aide""Assistant pour les opérations Git, fournit les commandes courantes et les guides de workflow"
"Documentation""Génère la documentation API à partir des commentaires de code"
"Lié à la base de données""Outil de pool de connexions et d'optimisation de requêtes PostgreSQL"

Principes d'Optimisation :

  1. Inclure les mots-clés - Termes techniques couramment utilisés par les utilisateurs
  2. Expliquer l'utilisation - Décrire clairement quel problème est résolu
  3. Éviter les généralités - N'écrivez pas simplement "outil", "assistant"
  4. Longueur appropriée - 10-30 caractères est optimal

Mettre à Jour la Description du Skill ​

Éditez le fichier SKILL.md du skill :

markdown
---
name: test-runner
description: Intégration de framework de test automatisé, supporte Jest et Vitest, découvre et exécute automatiquement les tests
---

# Test Runner

Ce skill vous aide à configurer les frameworks de test dans votre projet...

Prise d'Effet Automatique : Lors de la prochaine session, le plugin recalculera l'embedding et la nouvelle description prendra effet immédiatement.

Points de Vérification ✅ ​

Vérifier si la Recommandation Automatique Fonctionne ​

  1. Créer un Skill de Test :
bash
# Créer un skill de test dans le répertoire .opencode/skills/
mkdir -p .opencode/skills/example-skill
cat > .opencode/skills/example-skill/SKILL.md << 'EOF'
---
name: example-skill
description: Aide les utilisateurs à créer et configurer des projets TypeScript
---

# Example Skill

Ceci est un skill de test...
EOF
  1. Envoyer un Message Pertinent :

Dans OpenCode, saisissez :

Je veux initialiser un projet TypeScript
  1. Vérifier si la Recommandation est Déclenchée :

Ouvrez les outils de développement ou consultez le journal des appels d'outils de l'IA :

  • Succès - L'IA a appelé use_skill("example-skill")
  • Échec - Aucune recommandation pertinente, vérifiez si la description est trop vague

Vérifier que les Skills Déjà Chargés ne Sont pas Recommandés à Nouveau ​

  1. Charger Manuellement le Skill :
bash
use_skill("example-skill")
  1. Envoyer à Nouveau un Message Pertinent :
Je veux initialiser un autre projet TypeScript
  1. Confirmer qu'il n'y a Plus de Recommandation :

Le système ne devrait plus injecter d'invite d'évaluation car le skill est déjà chargé.

Pièges à Éviter ​

Problème 1 : Skills Recommandés Complètement Non Pertinents ​

Symptômes :

  • L'utilisateur demande "Comment déployer sur AWS", mais "Outil de test local" est recommandé
  • Le score de similarité est élevé, mais la sémantique est complètement fausse

Causes :

  • Description du skill trop vague, comme "Outil de service cloud"
  • Le modèle d'embedding a un biais de compréhension pour certains termes techniques

Solutions :

  1. Description Plus Spécifique :
markdown
# ❌ Mauvais
description : Outil de déploiement de services cloud

# ✅ Bon
description : Outil de déploiement AWS EC2, configuration automatique de l'équilibrage de charge et de la mise à l'échelle automatique
  1. Inclure les Mots-clés Techniques Principaux :
markdown
description : Outil de téléchargement de fichiers AWS S3 et de distribution CDN, supporte CloudFront

Problème 2 : Skills Utiles Non Recommandés ​

Symptômes :

  • Votre entrée correspond clairement à un skill, mais le système ne le recommande pas
  • Vous devez appeler manuellement get_available_skills() pour le trouver

Causes :

  • Similarité inférieure au seuil de 0.35
  • Grande différence entre la description du skill et les termes habituels de l'utilisateur

Solutions :

  1. Baisser le Seuil (modification du code source) :
typescript
// src/embeddings.ts:10
const SIMILARITY_THRESHOLD = 0.30; // Baisser de 0.35 à 0.30

Prudence en Production

Baisser le seuil augmentera les faux positifs (skills non pertinents), il est recommandé de tester avant d'ajuster.

  1. Augmenter le Top K :
typescript
// src/embeddings.ts:11
const TOP_K = 10; // Augmenter de 5 à 10
  1. Optimiser la Description du Skill, reportez-vous au chapitre "Optimiser les Descriptions de Skills" ci-dessus.

Problème 3 : Lenteur du Premier Chargement ​

Symptômes :

  • Lors de la première utilisation, le délai de recommandation des skills est de 2-3 secondes
  • Les utilisations ultérieures sont normales

Causes :

  • Le modèle d'embedding doit être téléchargé depuis le réseau (23 Mo)
  • Nécessite le calcul initial de tous les embeddings des skills

Solutions :

Le plugin dispose d'un mécanisme de cache qui s'optimise automatiquement après la première utilisation :

Chemin du cache : ~/.cache/opencode-agent-skills/embeddings/

Voir les Fichiers de Cache :

bash
ls -lh ~/.cache/opencode-agent-skills/embeddings/

Vous verrez des fichiers .bin, chaque fichier est un cache d'embedding (nommé par SHA256 du contenu).

Préchauffage Manuel du Cache :

bash
# Redémarrer OpenCode
# Le plugin appelle precomputeSkillEmbeddings() au démarrage

Position du code source : src/embeddings.ts:96-102

typescript
export async function precomputeSkillEmbeddings(skills: SkillSummary[]): Promise<void> {
  await Promise.all(
    skills.map(skill =>
      getEmbedding(skill.description).catch(() => { })
    )
  );
}

Pas d'Inquiétude : Tant que vous ne modifiez pas la description du skill, le cache est valide indéfiniment.

Résumé de la Leçon ​

La recommandation automatique de skills améliore l'expérience de la manière suivante :

TechniqueRôleAmélioration de l'Expérience Utilisateur
Modèle d'EmbeddingConvertit le texte en vecteurComprend la sémantique, pas seulement les mots-clés
Similarité CosinusCalcule la similarité des vecteursCorrespondance précise des skills pertinents
Mécanisme de CacheCache disque des embeddingsRéponse plus rapide après la première utilisation
Évaluation IntelligentePermet à l'IA de juger si un skill est nécessaireNon contraignant, évite les interruptions
Filtrage des Skills ChargésIgnore les skills déjà chargésÉvite les recommandations répétées

Avantages Clés :

  • Sans Mémorisation - Pas besoin de se souvenir des noms des skills
  • Identification Intelligente - L'IA découvre automatiquement les outils dont vous avez besoin
  • Non Intrusif - L'invite est cachée, l'utilisateur n'en a pas conscience

Aperçu de la Leçon Suivante ​

Dans la leçon suivante, nous apprendrons Exécution des Scripts de Skills.

Les skills ne sont pas seulement de la documentation, ils peuvent aussi contenir des scripts d'automatisation. Vous apprendrez :

  • Comment organiser les scripts exécutables dans le répertoire des skills
  • Utiliser l'outil run_skill_script pour exécuter des scripts
  • Permissions des scripts et restrictions de sécurité
  • Cas d'utilisation courants des scripts (construction, test, déploiement, etc.)

Annexe : Référence du Code Source ​

Cliquez pour Voir la Position du Code Source

Date de Mise à Jour : 2026-01-24

FonctionnalitéChemin du FichierLignes
Fonction Principale de Correspondance Sémantiquesrc/embeddings.ts108-135
Générer l'Embedding du Textesrc/embeddings.ts38-66
Calculer la Similarité Cosinussrc/embeddings.ts71-90
Précalculer les Embeddings des Skillssrc/embeddings.ts96-102
Formater l'Invite des Résultats de Correspondancesrc/plugin.ts37-57
Logique du Processus de Correspondance Automatiquesrc/plugin.ts125-141
Traitement de l'Événement d'Écoute des Messagessrc/plugin.ts66-142

Constantes Clés :

Nom de la ConstanteValeurDescriptionSource
MODEL_NAMEXenova/all-MiniLM-L6-v2Modèle d'embedding utiliséembeddings.ts:8
QUANTIZATIONq8Niveau de quantification du modèleembeddings.ts:9
SIMILARITY_THRESHOLD0.35Seuil de recommandation de similaritéembeddings.ts:10
TOP_K5Nombre de skills Top K retournésembeddings.ts:11

Fonctions Clés :

  • matchSkills() : Calcule la similarité sémantique entre le message de l'utilisateur et les descriptions des skills, retourne la liste des skills les plus pertinents
  • getEmbedding() : Génère le vecteur d'embedding du texte, supporte le cache disque
  • cosineSimilarity() : Calcule la similarité cosinus entre deux vecteurs
  • precomputeSkillEmbeddings() : Précalcule les embeddings de tous les skills au démarrage du plugin pour accélérer les correspondances ultérieures
  • formatMatchedSkillsInjection() : Formate les résultats de correspondance en invite d'évaluation et l'injecte à l'IA

Mécanisme de Cache :

Chemin du cache d'Embedding :

  • Linux/macOS : ~/.cache/opencode-agent-skills/embeddings/
  • Supporte la personnalisation : Modification via la variable d'environnement XDG_CACHE_HOME

Les fichiers de cache sont nommés par SHA256 du contenu, comme a1b2c3d4.bin, chaque fichier contient un vecteur Float32Array.