neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Catches silent embedding-model swaps under a vector index before they corrupt similarity search.
Translation pending
Developer toolsTypeScriptGitHub @jayblast-specOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Catches silent embedding-model swaps under a vector index before they corrupt similarity search -- provider-agnostic, zero dependencies.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Catches silent embedding-model swaps under a vector index before they corrupt similarity search — dimension checks plus canary-probe drift detection, provider-agnostic.Read the full README ↗
Catches silent embedding-model swaps under a vector index before they corrupt similarity search — dimension checks plus canary-probe drift detection, provider-agnostic.
When you change the embedding model behind a vector index — upgrade a version, switch providers, change chunking — vectors already in the index were produced by the old model, and new query vectors come from the new one. The two spaces are incompatible: similarity scores and rankings become meaningless, and nothing errors. This is a widely-felt, well-documented failure mode across the RAG/vector-database ecosystem, and today it's usually caught by hand-rolled, per-project scripts (or not caught at all until search quality visibly degrades). The general-purpose ML drift-monitoring platforms (Evidently, Alibi Detect) that do exist are heavyweight Python observability stacks meant for full model-monitoring infrastructure — there wasn't a small, embeddable, provider-agnostic library that just answers the specific question: is the embedding model that produced this vector still the one this index was built with?
embedguard never calls an embedding provider itself — you bring the vectors from whatever model/provider you already use, and it does the math and bookkeeping:
createFingerprint({ canaries, modelId? })Builds a small fingerprint from a handful of "canary" probe strings you've embedded with your current model: their dimension, and the embeddings themselves. Store this alongside your index's metadata.
checkDimension(fingerprint, embedding)The cheap, unambiguous check — does a vector even have the right number of dimensions. Catches an obviously different model immediately.
checkDrift(fingerprint, freshCanaries, { threshold? })The subtle, dangerous case dimension checking can't catch: a swap between models that happen to produce the same dimensionality (common within a provider's model family). Re-embed your fingerprint's exact canary probes with whatever model is currently configured, and this compares cosine similarity per probe — a real model swap shows up as a sharp similarity drop even when dimensions still match.
npm install embedguard
import { createFingerprint, checkDimension, checkDrift } from "embedguard";
// Once, when you build your index -- embed a handful of representative strings yourself:
const fingerprint = createFingerprint({
modelId: "text-embedding-3-small",
canaries: [
{ probe: "return policy", embedding: await embed("return policy") },
{ probe: "shipping times", embedding: await embed("shipping times") },
],
});
// Store `fingerprint` next to your index (a metadata row, a JSON file, whatever you already use).
// Later -- before trusting a batch of new vectors, or on a schedule:
const freshCanaries = await Promise.all(
fingerprint.canaries.map(async (c) => ({ probe: c.probe, embedding: await embed(c.probe) }))
);
const drift = checkDrift(fingerprint, freshCanaries);
if (!drift.ok) {
throw new Error(`embedding model drift detected: ${JSON.stringify(drift.probes)}`);
}
Run the annotated demo (simulates exactly this bug — a same-dimension model swap that dimension-checking alone would miss):
npx tsx examples/demo.ts
npm install
npm run typecheck
npm test
npm run build
MIT
This is one of 8 independent open-source infrastructure tools, each built against a real, researched gap:
Built by ArkNet Digital.