Plugin de inserción
Convierte el texto en vectores. Similitud coseno. Almacenamiento compacto. La infraestructura detrás del complemento RAG, también útil por sí sola.
El complemento Embed es un envoltorio ligero alrededor de /api/embeddings de Ollama, más tres ayudantes útiles: similitud coseno, empaquetado compacto en base64 e inverso desempaquetado. El complemento RAG lo utiliza internamente, pero también es útil por sí solo — para clustering, deduplicación, búsqueda semántica y detección de anomalías.
$embed = (new \Nibiru\Module\Ai\Ai())->embed();
$vec = $embed->one('controller'); / float[]$vectors = $embed->batch(['a', 'b', 'c']); / float[][]
$score = \Nibiru\Module\Ai\Plugin\Embed::cosine($a, $b); / 0..1$packed = \Nibiru\Module\Ai\Plugin\Embed::pack($vec); / base64 string$vec = \Nibiru\Module\Ai\Plugin\Embed::unpack($packed); / back to float[]Patrón: eliminar cadenas similares
Sección titulada «Patrón: eliminar cadenas similares»$embed = $ai->embed();$candidates = ['How do I create a module?', 'How can I make a new module?', 'What is MMVC?'];
$vecs = $embed->batch($candidates);foreach ($vecs as $i => $a) { foreach ($vecs as $j => $b) { if ($i >= $j) continue; $sim = \Nibiru\Module\Ai\Plugin\Embed::cosine($a, $b); if ($sim > 0.9) { echo "Near-dup: {$candidates[$i]} ≈ {$candidates[$j]} ($sim)\n"; } }}Patrón: etiquetado semántico
Sección titulada «Patrón: etiquetado semántico»$tags = ['authentication', 'forms', 'database', 'modules'];$tagVecs = array_combine($tags, $embed->batch($tags));
function bestTag(string $text, array $tagVecs, $embed): string { $tv = $embed->one($text); $best = ['_unknown', -INF]; foreach ($tagVecs as $tag => $vec) { $s = \Nibiru\Module\Ai\Plugin\Embed::cosine($tv, $vec); if ($s > $best[1]) $best = [$tag, $s]; } return $best[0];}
echo bestTag('User::isAuthorized', $tagVecs, $embed); / → 'authentication'echo bestTag('Pageination::setTable', $tagVecs, $embed); / → 'database' (probably)Almacenamiento
Sección titulada «Almacenamiento»Las incrustaciones son arreglos de flotantes — generalmente 768 flotantes para nomic-embed-text, 1024 para mxbai-embed-large. Eso es 3 KB o 4 KB por vector en bruto.
Utiliza Embed::pack() para codificarlos en base64 como flotantes de 4 bytes:
$compact = Embed::pack($vec); / ~4 KB → ~5.3 KB base64 string$vec = Embed::unpack($compact);El complemento RAG utiliza este formato internamente para sus archivos JSON.
Elecciones de modelos de incrustación
Sección titulada «Elecciones de modelos de incrustación»Ejecute una extracción en su Ollama.ai una vez:
curl https://your-ollama-host.example/api/pull -d '{"name":"nomic-embed-text"}' # 768 dim, defaultcurl https://your-ollama-host.example/api/pull -d '{"name":"mxbai-embed-large"}' # 1024 dim, higher qualityEn ai.ini:
[AI]embed.model = "nomic-embed-text"embed.dim = 768Trucos comunes
Sección titulada «Trucos comunes»- Llamando a
one()en un bucle ajustado. Cada llamada es una ronda HTTP. Para >100 elementos, prefierabatch()(todavía serial por debajo de la capa, pero con manejo de errores consistente). - Almacenando matrices de flotantes brutos en JSON. Use
pack()para archivos ~5 veces más pequeños y análisis más rápido. - Comparando coseno a un umbral fijo. Los modelos de incrustación diferentes tienen diferentes líneas base de “similares”. No codifique duro 0.85 — calibre por modelo.