Que fait Victor ?

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âche | Dépôt | Ce que c'est |
|---|---|---|
| Embedding / reclassement Python | huggingface/sentence-transformers | La référence. SBERT, sparse, ColBERT. Vérifiez MTEB avant de choisir un nom. |
| Embedding JS / navigateur | huggingface/transformers.js | ONNX en processus. Anglais par défaut : Xenova/all-MiniLM-L6-v2 (384-d). Package @huggingface/transformers. |
| Mêmes poids, Python | sentence-transformers/all-MiniLM-L6-v2 | 384-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âche | Dépôt | Ce que c'est |
|---|---|---|
| NN exact / GPU | facebookresearch/faiss | En processus. IndexFlatIP après normalisation L2 est le cosinus. Pas une base de données. |
| Petit HNSW | unum-cloud/usearch | De type en-tête, plusieurs langages. Ce n'est toujours pas de la compréhension. |
| Stockage filtré | qdrant/qdrant | Un serveur. Utilisez-le lorsque vous avez besoin de filtres et de persistance. |
| Petit stockage local | chroma-core/chroma | Facile. 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
- Nommez les chaînes. Si elles doivent correspondre exactement, arrêtez-vous. Utilisez la chaîne.
- Exécutez le chevauchement (et
victor.mjssi vous voulez un vecteur bon marché). - Si vous avez toujours besoin de voisins-en-sens, choisissez un modèle. Embeddez. Calculez le cosinus. Affichez le score.
- N'ajoutez pas FAISS / Qdrant / Chroma tant qu'un tableau de flottants n'est pas trop grand ou trop lent.
- 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.
