Communitygithub.com

Victor

Compétence d'embedding vectoriel. Traite le sens comme une géométrie et dit quand la géométrie est le mauvais outil. Référence non vectorielle d'abord.

Qu'est-ce que Victor ?

Victor est une compétence d'embedding vectoriel conçue pour être utilisée avec des agents IA comme Claude Code. Elle traite le sens comme une géométrie, mais insiste toujours pour commencer par une référence non vectorielle (chevauchement de jetons) avant d'introduire des modèles vectoriels. Elle prend en charge Python (avec sentence-transformers), JavaScript/navigateur (avec transformers.js) et fournit un petit exécutable local ('victor.mjs') pour du vectoriel bon marché sans modèle. La compétence met en garde contre les pièges courants : ne jamais mélanger des modèles ou des dimensions, ne pas traiter les scores de similarité comme une vérité, ne pas intégrer des identifiants, des chemins ou des secrets. Elle recommande un 'ordre queue de cheval' : d'abord le cosinus en mémoire, puis FAISS/USearch si nécessaire, et seulement ensuite une base de données vectorielles comme Qdrant ou Chroma. Victor ne choisit pas un gagnant ; il indique simplement la proximité dans l'espace choisi. La référence non vectorielle (chevauchement) permet de vérifier si un modèle vectoriel est vraiment nécessaire.

Compatible avec~Claude Code✓Codex CLI✓Cursor
npx skills add Justichuu/victor

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Aperçu

Depuis le README du skill

Vecteur au lit. Flèche étiquetée VECTOR.

Documentation

Que fait Victor ?

Vecteur au lit. Flèche étiquetée VECTOR.

Victor est au lit. La flèche est étiquetée VECTOR. C'est le logo et la blague. Le travail n'est pas une blague.

Victor est la compétence d'embedding. Elle voit une chaîne comme un point, puis mesure ses voisins. Elle voit aussi la même chaîne sans vecteur, afin que vous puissiez distinguer la géométrie du chevauchement. Queue de cheval : un espace, un modèle, cosinus, pas de stockage supplémentaire. Barbe de cou : les nombres ne sont pas de la compréhension. Ce sont une direction entraînée sur la co-occurrence. Le monde tel qu'il est.

Voir le monde tel qu'il est

Un embedding est une liste de flottants. Proche sur la sphère signifie similaire dans ce modèle, pas vrai, pas des synonymes, pas un consentement. Des modèles mélangés sont des mondes mélangés. Des dimensions mélangées sont un crash. L2 non normalisé et cosinus sont des questions différentes.

N'integgrez pas :

  • Identifiants, chemins, hachages, noms exacts que vous devez faire correspondre exactement
  • Oui / non / fait
  • Deux lignes que vous avez déjà construites comme jumelles (paires YES/NO de Argubot)
  • Secrets

Ne téléchargez pas un modèle sur une page qui ne doit pas appeler le réseau. La page de lettres d'Argubot n'a pas de fetch. Son embedVec dans argubot.js dessine des vecteurs SVG. C'est une image d'un vecteur, pas un embedding. Ne les confondez pas.

Le marché, tel qu'il est réellement

Bibliothèques qui créent des vecteurs :

TâcheDépôtCe que c'est
Embedding / reclassement Pythonhuggingface/sentence-transformersLa référence. SBERT, sparse, ColBERT. Vérifiez MTEB avant de choisir un nom.
Embedding JS / navigateurhuggingface/transformers.jsONNX en processus. Anglais par défaut : Xenova/all-MiniLM-L6-v2 (384-d). Package @huggingface/transformers.
Mêmes poids, Pythonsentence-transformers/all-MiniLM-L6-v2384-d, petit. Très bien jusqu'à ce que cela ne le soit plus.

Bibliothèques qui recherchent les vecteurs que vous avez déjà :

TâcheDépôtCe que c'est
NN exact / GPUfacebookresearch/faissEn processus. IndexFlatIP après normalisation L2 est le cosinus. Pas une base de données.
Petit HNSWunum-cloud/usearchDe type en-tête, plusieurs langages. Ce n'est toujours pas de la compréhension.
Stockage filtréqdrant/qdrantUn serveur. Utilisez-le lorsque vous avez besoin de filtres et de persistance.
Petit stockage localchroma-core/chromaFacile. Pas obligatoire.

Des API payantes existent (OpenAI, Cohere, Nomic). Ce sont des modèles derrière un mur. Mêmes règles : un espace, ne jamais mélanger, ne jamais traiter le score comme une vérité.

Ordre queue de cheval : cosinus brut en mémoire. Ensuite FAISS/USearch. Ensuite un stockage. Sautez le stockage si un tableau fonctionne.

Non vectoriel d'abord

Exécutez toujours une référence non vectorielle. Si le chevauchement classe déjà les résultats, vous n'aviez pas besoin d'un modèle.

function tokens(s) {
  return String(s).toLowerCase().match(/[a-z0-9]+/g) || [];
}

function overlap(a, b) {
  const A = new Set(tokens(a));
  const B = new Set(tokens(b));
  let hit = 0;
  for (const t of A) if (B.has(t)) hit += 1;
  return hit / Math.max(1, A.size, B.size);
}

L'égalité exacte de chaînes reste exacte. Ne calculez pas le cosinus d'un identifiant.

Vecteur bon marché (pas de modèle)

Les n-grammes hachés produisent un nombre en forme de vecteur. C'est toujours un sac de morceaux, pas un sens. Utilisez-le pour voir le cosinus et pour savoir que ce n'est pas MiniLM.

Exécutez le test local (pas d'installation) :

node .cursor/skills/victor/victor.mjs "cars is a fix" "cars makes more problems"

Il affiche le chevauchement et le cosinus haché côte à côte. Les jumeaux partagent des mots, donc les deux scores augmentent. Un vrai modèle peut encore les rapprocher parce qu'ils partagent un sujet. C'est le monde tel qu'il est : OUI et NON à propos des voitures sont voisins. Ce n'est pas la même affirmation.

Vecteur réel (modèle)

Python, avec sentence-transformers tel qu'il est livré :

from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
vecs = model.encode(["cars is a fix", "cars makes more problems"], normalize_embeddings=True)
# le cosinus est le produit scalaire de deux vecteurs unitaires

JS / navigateur, avec transformers.js. Nécessite un téléchargement. Pas pour la page de lettres d'Argubot.

import { pipeline } from "@huggingface/transformers";
const extractor = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
const out = await extractor(["cars is a fix", "cars makes more problems"], {
  pooling: "mean",
  normalize: true,
});

Toujours pooling: "mean" et normalize: true ou vous mesurez la mauvaise chose. Réutilisez un seul pipeline. Ne le construisez pas à chaque appel.

Cosinus de vecteurs unitaires :

function dot(a, b) {
  let s = 0;
  for (let i = 0; i < a.length; i += 1) s += a[i] * b[i];
  return s;
}

Si vous n'avez pas normalisé, ne l'appelez pas cosinus.

Comment Victor exécute une tâche

  1. Nommez les chaînes. Si elles doivent correspondre exactement, arrêtez-vous. Utilisez la chaîne.
  2. Exécutez le chevauchement (et victor.mjs si vous voulez un vecteur bon marché).
  3. Si vous avez toujours besoin de voisins-en-sens, choisissez un modèle. Embeddez. Calculez le cosinus. Affichez le score.
  4. N'ajoutez pas FAISS / Qdrant / Chroma tant qu'un tableau de flottants n'est pas trop grand ou trop lent.
  5. Dites ce qu'est le score : un voisin dans cet espace. Pas un verdict.

Victor ne choisit pas un gagnant. Proche est proche. C'est tout ce qu'il sait.

Skills associés