secuprompt
Version:
Protect your AI from Prompt Injection
53 lines (52 loc) • 1.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.normalize = exports.cosine = exports.embed = exports.seg_text = exports.vec_dim = void 0;
exports.vec_dim = 64;
const token_re = /[^\p{L}\p{N}]+/u;
const seg_text = (txt) => {
const bits = txt
.split(/[\.\!\?\n\r]+/g)
.map(v => v.trim().toLowerCase())
.filter(Boolean);
if (!bits.length)
bits.push(txt.toLowerCase());
return bits;
};
exports.seg_text = seg_text;
const embed = (txt) => {
const v = new Array(exports.vec_dim).fill(0);
const toks = txt.toLowerCase().split(token_re).filter(Boolean);
if (!toks.length)
return v;
for (const t of toks) {
let h = 0;
for (let i = 0; i < t.length; i++) {
h = (h * 31 + t.charCodeAt(i)) >>> 0;
}
const idx = h % exports.vec_dim;
v[idx] += 1;
const idx2 = (h >>> 3) % exports.vec_dim;
v[idx2] += 0.5;
}
const mag = Math.sqrt(v.reduce((s, x) => s + x * x, 0));
if (mag === 0)
return v;
for (let i = 0; i < exports.vec_dim; i++)
v[i] /= mag;
return v;
};
exports.embed = embed;
const cosine = (a, b) => {
let dot = 0, ma = 0, mb = 0;
for (let i = 0; i < exports.vec_dim; i++) {
dot += a[i] * b[i];
ma += a[i] * a[i];
mb += b[i] * b[i];
}
if (ma === 0 || mb === 0)
return 0;
return dot / (Math.sqrt(ma) * Math.sqrt(mb));
};
exports.cosine = cosine;
const normalize = (v) => v < 0 ? 0 : v > 1 ? 1 : v;
exports.normalize = normalize;