Communitygithub.com

Justichuu/victor

Habilidade de incorporação vetorial. Trata o significado como geometria e avisa quando a geometria é a ferramenta errada. Linha de base não vetorial primeiro.

O que é victor?

Victor é uma habilidade de incorporação vetorial (embedder) que trata strings como pontos em um espaço geométrico e mede vizinhanças, mas sempre compara com uma linha de base não vetorial (sobreposição de tokens) para evitar usar modelos quando uma simples correspondência de texto já é suficiente. Ela suporta plataformas como código Python (sentence-transformers), JavaScript no navegador (transformers.js) e ferramentas de busca como FAISS, USearch, Qdrant e Chroma. O funcionamento é simples: primeiro tenta correspondência exata ou sobreposição de tokens; se ainda precisar de significado semântico, escolhe um único modelo, incorpora os textos, calcula cosseno entre vetores normalizados e interpreta o resultado como vizinhança naquele espaço, nunca como verdade absoluta. A habilidade enfatiza que embeddings são direções treinadas em co-ocorrência, não entendimento real, e que misturar modelos ou dimensões diferentes produz resultados inválidos.

Funciona com~Claude Code✓Codex CLI✓Cursor
npx skills add Justichuu/victor

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Prévia

Do README da skill

Vetor na cama. Flecha identificada como VETOR.

Documentação

O que victor faz?

Vetor na cama. Flecha identificada como VETOR.

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:

TarefaRepositórioO que é
Incorporar / reordenar em Pythonhuggingface/sentence-transformersO padrão. SBERT, esparso, ColBERT. Consulte MTEB antes de escolher um nome.
Incorporar em JS / navegadorhuggingface/transformers.jsONNX em processo. Inglês padrão: Xenova/all-MiniLM-L6-v2 (384-d). Pacote @huggingface/transformers.
Mesmos pesos, Pythonsentence-transformers/all-MiniLM-L6-v2384-d, pequeno. Funciona até não funcionar mais.

Bibliotecas que buscam vetores que você já possui:

TarefaRepositórioO que é
NN exato / GPUfacebookresearch/faissEm processo. IndexFlatIP após normalizar L2 é cosseno. Não é um banco de dados.
HNSW pequenounum-cloud/usearchSemelhante a header, várias linguagens. Ainda não é compreensão.
Armazenamento com filtrosqdrant/qdrantUm servidor. Use quando precisar de filtros e persistência.
Armazenamento local experimentalchroma-core/chromaFá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

  1. Nomeie as strings. Se elas precisam corresponder exatamente, pare. Use a string.
  2. Execute sobreposição (e victor.mjs se quiser um vetor barato).
  3. Se você ainda precisar de vizinhos-em-significado, escolha um modelo. Incorpore. Cosseno. Mostre a pontuação.
  4. Não adicione FAISS/Qdrant/Chroma até que um array de floats seja grande ou lento demais.
  5. 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.

Habilidades Relacionadas