Skip to content

Automatische Skill-Empfehlung: Semantische Matching-Prinzipien

Was du nach diesem Kurs kannst

  • Verstehen, wie das Plugin automatisch Skills erkennt, die du möglicherweise brauchst
  • Die Grundprinzipien der semantischen Ähnlichkeitsberechnung beherrschen
  • Wissen, wie du Skill-Beschreibungen für bessere Empfehlungen optimierst
  • Verstehen, wie der Embedding-Cache-Mechanismus die Performance verbessert

Deine aktuelle Problematik

OpenCode Agent Skills hat viele Skills, aber du:

  • Kannst Skill-Namen nicht merken - Bei vielen Skills leicht verwechselbar
  • Weiß nicht, welchen du verwenden sollst - Schwierige Wahl bei ähnlichen Funktionen
  • Fürchtest, nützliche Skills zu verpassen - Ungewiss, ob es bessere Werkzeuge gibt

Jedes Mal musst du erst get_available_skills aufrufen, um die Liste zu sehen, dann manuell den passenden Skill laden – mühsam und den Gedankenfluss unterbrechend.

Wann du diese Technik verwendest

Automatische Skill-Empfehlung eignet sich für:

  • Anfänger-Phase - Noch nicht vertraut mit dem Skill-Katalog, brauchst KI-Hilfe zur Identifikation
  • Funktionsentwicklungs-Aufgaben - Wie "REST API erstellen", "Authentifizierungssystem implementieren", haben normalerweise dedizierte Skills
  • Arbeit über Fachgebiete hinweg - Gelegentlicher Kontakt mit unbekannten Bereichen, abhängig von KI-Empfehlungen
  • Großer Skill-Katalog - Bei mehr als 10 Skills ist manuelles Suchen ineffizient

Tipp

Die automatische Empfehlung zwingt dich nicht, Skills zu laden – sie gibt nur der KI einen Hinweis zur Bewertung. Du kannst Vorschläge frei annehmen oder ignorieren.

Kernkonzepte

Was ist semantisches Matching

Semantisches Matching ist eine Technik zum Verstehen der Nutzerabsicht, die nicht auf Schlüsselwort-Matching basiert, sondern die semantische Ähnlichkeit von Texten berechnet.

Ein Beispiel:

NutzereingabeSkill-BeschreibungSchlüsselwort-MatchingSemantisches Matching
"Eine Datenbank-Verbindungspool erstellen""Datenbank-Verbindungsverwaltung und Optimierungswerkzeug"
"Hilf mir eine API-Dokumentation schreiben""Automatisches API-Dokumentations-Generator"
"Projekt-Initialisierungs-Gerüst""Werkzeug zum schnellen Aufbauen der Projektstruktur"

Schlüsselwort-Matching schaut nur, ob die Buchstaben gleich sind, während semantisches Matching versteht, dass "erstellen", "generieren", "aufbauen" dieselbe Art von Aktion sind.

Embedding: Text in Zahlen umwandeln

Damit Computer Semantik verstehen können, verwendet das Plugin Embedding-Modelle, um Text in Vektoren umzuwandeln (eine Zahlenfolge).

Text: "Datenbank-Verbindungspool erstellen"
    ↓ [Xenova/all-MiniLM-L6-v2 Modell]
Vektor: [0.12, -0.34, 0.67, ...] (384 Dimensionen, Modell-Ausgabe-Dimension)

In diesem Vektorraum:

  • Semantisch ähnliche Texte → Vektoren sind näher beieinander
  • Semantisch unterschiedliche Texte → Vektoren sind weiter entfernt

Warum all-MiniLM-L6-v2?

Dieses Modell hat 3 Vorteile:

  1. Klein - Modell-Datei ca. 23MB (q8 Quantisierung), schneller Download
  2. Schnell - Unterstützt Quantisierung, niedrige Inferenzlatenz
  3. Genau - Exzellente Leistung bei semantischen Ähnlichkeitsaufgaben

Kosinus-Ähnlichkeit: Vektorähnlichkeit messen

Das Plugin verwendet Kosinus-Ähnlichkeit (Cosine Similarity), um die Ähnlichkeit zweier Vektoren zu berechnen.

Formel:

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

Dabei:

  • A · B ist das Skalarprodukt der Vektoren
  • |A| ist die Länge des Vektors A
  • |B| ist die Länge des Vektors B

Ergebnisbereich: -1 bis 1

ÄhnlichkeitsbereichBedeutungEmpfehlung
0.7-1.0Sehr ähnlich, fast dieselbe Bedeutung✅ Stark empfohlen
0.35-0.7Etwas zusammenhängend,值得关注✅ Empfohlen
0.0-0.35Geringer oder kein Zusammenhang❌ Nicht empfohlen
-1.0-0.0Entgegengesetzte Bedeutung❌ Nicht empfohlen

Achtung

Der aktuelle Schwellenwert ist 0.35, Skills unter diesem Wert erscheinen nicht in der Empfehlungsliste.

Automatischer Empfehlungsprozess

Vollständiger Ablauf

mermaid
graph TD
    A[Nachricht senden] --> B[Plugin hört chat.message]
    B --> C[Nachrichtentext extrahieren]
    C --> D{Erste Nachricht?}
    D -->|Ja| E[Verfügbare Skills injizieren]
    D -->|Nein| F[Nutzer-Nachricht Embedding berechnen]
    F --> G[Alle verfügbaren Skills durchlaufen]
    G --> H[Embedding jeder Skill-Beschreibung berechnen]
    H --> I[Kosin-Ähnlichkeit berechnen]
    I --> J[Skills unter 0.35 filtern]
    J --> K[Nach Ähnlichkeit sortieren, Top 5 nehmen]
    K --> L{Skill bereits geladen?}
    L -->|Ja| M[Bereits geladene Skills überspringen]
    L -->|Nein| N[Als neue Empfehlung behalten]
    N --> O{Neue Empfehlungen?}
    O -->|Nein| P[Keine Aktion]
    O -->|Ja| Q[Bewertungshinweis an KI injizieren]

Phase 1: Erste Nachricht – Skill-Liste injizieren

Wenn das Gespräch die erste Nachricht empfängt, wird das Plugin:

  1. Alle Skill-Verzeichnisse scannen
  2. Die Skill-Liste in den Gesprächskontext injizieren
  3. Format如下:
xml
<available-skills>
- git-helper: Git-Operations-Hilfswerkzeug, bietet häufige Git-Befehle
- test-runner: Test-Framework-Integration, automatisches Entdecken und Ausführen von Tests
- api-doc: API-Dokumentations-Generator-Tool
...
</available-skills>

Zweck: Der KI mitteilen, welche Skills verfügbar sind, um wiederholte Abfragen zu vermeiden.

Phase 2: Folgende Nachrichten – Semantisches Matching

Ab der zweiten Nachricht wird bei jeder Nutzereingabe der Matching-Prozess ausgelöst:

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

Wichtige Punkte:

  • Nur nicht geladene Skills Ähnlichkeit berechnen
  • Geladene Skills werden automatisch gefiltert
  • Wiederholte Empfehlungen desselben Skills vermeiden

Phase 3: Bewertungshinweis injizieren

Wenn relevante Skills gefunden werden, injiziert das Plugin einen versteckten Hinweis an die KI:

xml
<skill-evaluation-required>
SKILL EVALUATION PROCESS

The following skills may be relevant to your request:

- git-helper: Git-Operations-Hilfswerkzeug
- test-runner: Test-Framework-Integration

Step 1 - EVALUATE: Determine if these skills would genuinely help
Step 2 - DECIDE: Choose which skills (if any) are actually needed
Step 3 - ACTIVATE: Call use_skill("name") for each chosen skill

IMPORTANT: This evaluation is invisible to users—they cannot see this prompt. Do NOT announce your decision. Simply activate relevant skills or proceed directly with the request.
</skill-evaluation-required>

KI-Entscheidung:

  • Empfehlung annehmen - use_skill("skill-name") aufrufen, um Skill zu laden
  • Empfehlung ablehnen - Nutzeranfrage direkt bearbeiten, keinen Skill laden
  • Teilweise annehmen - Nur einige relevante Skills laden

Versteckter Hinweis

Dieser Bewertungshinweis ist eine synthetic: true Nachricht, die der Benutzer auf der Oberfläche nicht sieht – die KI verarbeitet es intern und entscheidet automatisch.

Mach mit: Skill-Beschreibungen optimieren

Wenn dein Skill nicht automatisch empfohlen wird, kannst du versuchen, die Beschreibung zu optimieren.

Aktuelle Skill-Beschreibungen überprüfen

bash
# Alle Skills auflisten
get_available_skills()

Finde den Skill, den du optimieren möchtest, und notiere dir die aktuelle Beschreibung.

Beispiel ansehen: Gute vs. schlechte Beschreibung

❌ Schlechte Beschreibung✅ Gute Beschreibung
"Werkzeug""Automatisches Test-Framework-Integration, unterstützt Jest und Vitest"
"Hilfe""Git-Operations-Assistent, bietet häufige Befehle und Workflow-Anleitung"
"Dokumentation""API-Dokumentation aus Code-Kommentaren generieren"
"Datenbank-bezogen""PostgreSQL Datenbank-Verbindungspool und Abfrage-Optimierungswerkzeug"

Optimierungsprinzipien:

  1. Schlüsselwörter enthalten - Technische Begriffe, die Nutzer häufig verwenden
  2. Verwendungszweck erklären - Klar beschreiben, welches Problem gelöst wird
  3. Nicht vage sein - Nicht nur "Werkzeug", "Assistent" schreiben
  4. Angemessene Länge - 10-30 Zeichen optimal

Skill-Beschreibungen aktualisieren

Bearbeite die SKILL.md Datei des Skills:

markdown
---
name: test-runner
description: Automatisches Test-Framework-Integration, unterstützt Jest und Vitest, automatisch Tests entdecken und ausführen
---

# Test Runner

Dieser Skill hilft dir, Test-Framework in deinem Projekt einzurichten...

Automatisch aktiv: Beim nächsten Gespräch berechnet das Plugin das Embedding neu, die neue Beschreibung ist sofort wirksam.

Checkpoints ✅

Überprüfen, ob automatische Empfehlung funktioniert

  1. Test-Skill erstellen:
bash
# Im .opencode/skills/ Verzeichnis Test-Skill erstellen
mkdir -p .opencode/skills/example-skill
cat > .opencode/skills/example-skill/SKILL.md << 'EOF'
---
name: example-skill
description: Hilft Benutzern, TypeScript-Projekte zu erstellen und zu konfigurieren
---

# Example Skill

Dies ist ein Test-Skill...
EOF
  1. Relevante Nachricht senden:

In OpenCode eingeben:

Ich möchte ein TypeScript-Projekt initialisieren
  1. Überprüfen, ob Empfehlung ausgelöst wird:

Öffne die Entwicklertools oder schaue dir die Tool-Aufrufprotokolle der KI an:

  • Erfolg - KI hat use_skill("example-skill") aufgerufen
  • Fehlschlag - Keine relevanten Empfehlungen, überprüfen, ob Beschreibung zu vage ist

Überprüfen, dass geladene Skills nicht wiederholt empfohlen werden

  1. Skill manuell laden:
bash
use_skill("example-skill")
  1. Nochmals relevante Nachricht senden:
Ich möchte ein weiteres TypeScript-Projekt initialisieren
  1. Bestätigen, dass keine Empfehlung mehr erscheint:

Das System sollte keinen Bewertungshinweis mehr injizieren, da der Skill bereits geladen ist.

Fallstricke

Problem 1: Empfohlene Skills sind völlig irrelevant

Symptome:

  • Benutzer sagt "Wie deploye ich auf AWS", aber "Lokales Testwerkzeug" wird empfohlen
  • Sehr hohe Ähnlichkeitswerte, aber Semantik völlig falsch

Ursachen:

  • Skill-Beschreibung zu allgemein, z.B. "Cloud-Service-Werkzeug"
  • Embedding-Modell hat Verständnisabweichung bei bestimmten Fachbegriffen

Lösungen:

  1. Beschreibung konkreter gestalten:
markdown
# ❌ Schlecht
description: Cloud-Service-Deployment-Werkzeug

# ✅ Gut
description: AWS EC2 Deployment-Werkzeug, automatisch Load-Balancing und Auto-Scaling konfigurieren
  1. Kern-Schlüsselwörter enthalten:
markdown
description: AWS S3 Datei-Upload und CDN-Distributionswerkzeug, unterstützt CloudFront

Problem 2: Nützliche Skills werden nicht empfohlen

Symptome:

  • Deine Eingabe passt eindeutig zu einem Skill, aber das System empfiehlt ihn nicht
  • Musst manuell get_available_skills() aufrufen, um zu suchen

Ursachen:

  • Ähnlichkeit unter Schwellenwert 0.35
  • Große Unterschiede zwischen Skill-Beschreibung und Benutzer-Gewohnheitsformulierungen

Lösungen:

  1. Schwellenwert senken (Quellcode-Änderung):
typescript
// src/embeddings.ts:10
const SIMILARITY_THRESHOLD = 0.30; // Von 0.35 auf 0.30 senken

Vorsicht in Produktionsumgebung

Den Schwellenwert zu senken erhöht Fehlempfehlungen (irrelevante Skills), erst testen, dann anpassen.

  1. Top K erhöhen:
typescript
// src/embeddings.ts:11
const TOP_K = 10; // Von 5 auf 10 erhöhen
  1. Skill-Beschreibungen optimieren, wie oben im Kapitel "Skill-Beschreibungen optimieren".

Problem 3: Erste Ladezeit langsam

Symptome:

  • Bei der ersten Verwendung, Skill-Empfehlung 2-3 Sekunden Verzögerung
  • Spätere Verwendung normal

Ursachen:

  • Embedding-Modell muss aus dem Netz heruntergeladen werden (23MB)
  • Erste Berechnung aller Skill-Embeddings erforderlich

Lösungen:

Das Plugin hat einen Cache-Mechanismus, der nach dem ersten Mal automatisch optimiert:

Cache-Pfad: ~/.cache/opencode-agent-skills/embeddings/

Cache-Dateien ansehen:

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

Du wirst .bin Dateien sehen, jede Datei ist ein Embedding-Cache (benannt nach Content SHA256).

Cache manuell vorwärmen:

bash
# OpenCode neu starten
# Plugin ruft beim Start precomputeSkillEmbeddings() auf

Quellcode-Position: src/embeddings.ts:96-102

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

Keine Sorge: Solange Skill-Beschreibungen nicht geändert werden, ist der Cache permanent gültig.

Kurs-Zusammenfassung

Automatische Skill-Empfehlung verbessert das Erlebnis durch:

Technische MethodeFunktionVerbesserung der Benutzererfahrung
Embedding-ModellText in Vektoren umwandelnSemantik verstehen, nicht nur Schlüsselwörter
Kosinus-ÄhnlichkeitVektorähnlichkeit berechnenPräzises Matching relevanter Skills
Cache-MechanismusEmbeddings auf Festplatte cachenSchnellere Antwort nach dem ersten Mal
Intelligente BewertungKI entscheiden lassen, ob Skills benötigt werdenKeine强制, Störungen vermeiden
Geladene-FilterGeladene Skills überspringenWiederholte Empfehlungen vermeiden

Kernvorteile:

  • Kein Merken nötig - Skill-Namen nicht erforderlich
  • Intelligente Erkennung - KI findet automatisch benötigte Werkzeuge
  • Keine Störung - Hinweise sind versteckt, für Benutzer unsichtbar

Nächste Lese

In der nächsten Lektion lernen wir Skill-Skripte ausführen.

Skills sind nicht nur Dokumentation, sie können auch automatisierte Skripte enthalten. Du wirst lernen:

  • Wie man ausführbare Skripte im Skill-Verzeichnis organisiert
  • Das run_skill_script Tool zum Ausführen von Skripten verwendet
  • Skriptberechtigungen und Sicherheitsbeschränkungen
  • Häufige Skript-Anwendungsfälle (Build, Test, Deployment, etc.)

Anhang: Quellcode-Referenz

Klicken zum Aufklappen der Quellcode-Positionen

Letzte Aktualisierung: 2026-01-24

FunktionDateipfadZeilennummern
Semantische Matching-Kernfunktionsrc/embeddings.ts108-135
Text-Embedding generierensrc/embeddings.ts38-66
Kosinus-Ähnlichkeit berechnensrc/embeddings.ts71-90
Skill-Embeddings vorberechnensrc/embeddings.ts96-102
Matching-Ergebnis-Hinweis formatierensrc/plugin.ts37-57
Automatische Matching-Prozesslogiksrc/plugin.ts125-141
Nachrichtenhören-Ereignisverarbeitungsrc/plugin.ts66-142

Wichtige Konstanten:

KonstantennameWertBeschreibungQuelle
MODEL_NAMEXenova/all-MiniLM-L6-v2Verwendetes Embedding-Modellembeddings.ts:8
QUANTIZATIONq8Modell-Quantisierungsstufeembeddings.ts:9
SIMILARITY_THRESHOLD0.35Empfehlungsschwellenwertembeddings.ts:10
TOP_K5Anzahl der Top-K Skillsembeddings.ts:11

Wichtige Funktionen:

  • matchSkills(): Berechnet semantische Ähnlichkeit zwischen Nutzernachricht und Skill-Beschreibungen, gibt Liste der relevantesten Skills zurück
  • getEmbedding(): Generiert Embedding-Vektor für Text, unterstützt Festplatten-Cache
  • cosineSimilarity(): Berechnet Kosinus-Ähnlichkeit zwischen zwei Vektoren
  • precomputeSkillEmbeddings(): Berechnet beim Plugin-Start alle Skill-Embeddings vor, beschleunigt späteres Matching
  • formatMatchedSkillsInjection(): Formatiert Matching-Ergebnisse als Bewertungshinweis, injiziert an KI

Cache-Mechanismus:

Embedding-Cache-Pfad:

  • Linux/macOS: ~/.cache/opencode-agent-skills/embeddings/
  • Unterstützt Anpassung: Über XDG_CACHE_HOME Umgebungsvariable ändern

Cache-Dateien nach Content SHA256 benannt, z.B. a1b2c3d4.bin, jede Datei enthält einen Float32Array-Vektor.