O que victor faz?

Vetor está na cama. A flecha está identificada como VETOR. Esse é o logo e a piada. O trabalho não é piada.
Victor é a habilidade de incorporação. Ela vê uma string como um ponto e mede seus vizinhos. Ela também vê a mesma string sem um vetor, para que você possa distinguir geometria de sobreposição. Rabo de cavalo: um espaço, um modelo, cosseno, sem armazenamento extra. Barba: os números não são compreensão. Eles são uma direção treinada em co-ocorrência. O mundo como ele é.
Veja o mundo como ele é
Uma incorporação é uma lista de floats. Próximo na esfera significa similar naquele modelo, não verdadeiro, não sinônimos, nem consentimento. Modelos misturados são mundos misturados. Dimensões misturadas são um colapso. L2 não normalizado e cosseno são perguntas diferentes.
Não incorpore:
- IDs, caminhos, hashes, nomes exatos que você precisa corresponder exatamente
- Sim / não / pronto
- Duas linhas que você já construiu como gêmeas (pares SIM/NÃO do argubot)
- Segredos
Não carregue um modelo em uma página que não deve chamar a rede. A página de cartas do argubot não tem fetch. Seu embedVec em argubot.js desenha vetores SVG. Isso é uma imagem de um vetor, não uma incorporação. Não os confunda.
O mercado, como ele realmente é
Bibliotecas que criam vetores:
| Tarefa | Repositório | O que é |
|---|---|---|
| Incorporar / reordenar em Python | huggingface/sentence-transformers | O padrão. SBERT, esparso, ColBERT. Consulte MTEB antes de escolher um nome. |
| Incorporar em JS / navegador | huggingface/transformers.js | ONNX em processo. Inglês padrão: Xenova/all-MiniLM-L6-v2 (384-d). Pacote @huggingface/transformers. |
| Mesmos pesos, Python | sentence-transformers/all-MiniLM-L6-v2 | 384-d, pequeno. Funciona até não funcionar mais. |
Bibliotecas que buscam vetores que você já possui:
| Tarefa | Repositório | O que é |
|---|---|---|
| NN exato / GPU | facebookresearch/faiss | Em processo. IndexFlatIP após normalizar L2 é cosseno. Não é um banco de dados. |
| HNSW pequeno | unum-cloud/usearch | Semelhante a header, várias linguagens. Ainda não é compreensão. |
| Armazenamento com filtros | qdrant/qdrant | Um servidor. Use quando precisar de filtros e persistência. |
| Armazenamento local experimental | chroma-core/chroma | Fácil. Não obrigatório. |
APIs pagas existem (OpenAI, Cohere, Nomic). Elas são um modelo atrás de um muro. Mesmas regras: um espaço, nunca misture, nunca trate a pontuação como verdade.
Ordem do rabo de cavalo: cosseno bruto em memória. Depois FAISS/USearch. Depois um armazenamento. Pule o armazenamento se um array funcionar.
Não vetorial primeiro
Sempre execute uma linha de base não vetorial. Se a sobreposição já classifica, você não precisava de um modelo.
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);
}
Igualdade exata de strings permanece exata. Não aplique cosseno a um id.
Vetor barato (sem modelo)
N-gramas com hash produzem um número em forma de vetor. Ainda é saco de peças, não significado. Use para ver o cosseno e saber que não é MiniLM.
Execute a prova local (sem instalação):
node .cursor/skills/victor/victor.mjs "carros é um conserto" "carros cria mais problemas"
Isso imprime sobreposição e cosseno com hash lado a lado. Gêmeos compartilham palavras, então ambas as pontuações sobem. Um modelo real ainda pode colocá-los próximos porque compartilham um tópico. Esse é o mundo como ele é: SIM e NÃO sobre carros são vizinhos. Eles não são a mesma afirmação.
Vetor real (modelo)
Python, usando sentence-transformers como são distribuídos:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
vecs = model.encode(["carros é um conserto", "carros cria mais problemas"], normalize_embeddings=True)
# cosseno é o produto escalar de dois vetores unitários
JS / navegador, usando transformers.js. Requer download. Não é para a página de cartas do argubot.
import { pipeline } from "@huggingface/transformers";
const extractor = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
const out = await extractor(["carros é um conserto", "carros cria mais problemas"], {
pooling: "mean",
normalize: true,
});
Sempre pooling: "mean" e normalize: true ou você está medindo a coisa errada. Reutilize um pipeline. Não o construa por chamada.
Cosseno de vetores unitários:
function dot(a, b) {
let s = 0;
for (let i = 0; i < a.length; i += 1) s += a[i] * b[i];
return s;
}
Se você não normalizou, não chame de cosseno.
Como Victor trabalha em uma tarefa
- Nomeie as strings. Se elas precisam corresponder exatamente, pare. Use a string.
- Execute sobreposição (e
victor.mjsse quiser um vetor barato). - Se você ainda precisar de vizinhos-em-significado, escolha um modelo. Incorpore. Cosseno. Mostre a pontuação.
- Não adicione FAISS/Qdrant/Chroma até que um array de floats seja grande ou lento demais.
- Diga o que a pontuação é: um vizinho naquele espaço. Não um veredito.
Victor não escolhe um vencedor. Próximo é próximo. É só o que ele sabe.
