chantier RAG #1 : entrypoint embeddings (texte -> vecteur poolé) pour le RAG mobile
Spec /opt/Kazeia/docs/RAG_EMBEDDINGS_ENGINE_SPEC.md implémentée.
Préflight (point #2 du spec = LE bloqueur potentiel) :
- Arch BERT/nomic-bert/gemma-embedding TOUJOURS présentes dans le fork ql
(llama-arch.cpp + src/models/bert.cpp), malgré les mods Qwen/TTS.
- Outil de référence examples/embedding/embedding.cpp dispo = source de vérité.
- Confirmé : BERT encoder-only routé via llama_decode (PAS llama_encode) dans
ce fork ; le code ne bascule sur erreur que pour encoder+decoder (T5).
Ajouts kazeia_engine_jni.cpp (handle KEmbedder SÉPARÉ du KEngine, CPU pur) :
- loadEmbedder(path, nThreads, pooling) : embeddings=true, pooling MEAN/CLS/auto,
n_ctx=n_batch=n_ubatch=512 (contrainte pooling = séquence dans 1 ubatch),
n_gpu_layers=0, refus explicite des modèles encoder-decoder.
- embedText(h, text) : tokenize add_special + batch logits=1 + llama_decode +
llama_get_embeddings_seq + normalisation L2 -> float[n_embd] ou null.
- freeEmbedder(h).
- Reproduit À L'IDENTIQUE examples/embedding/embedding.cpp.
Bindings Kotlin (EngineLlmEngine.kt) : loadEmbedder/embedText/freeEmbedder +
wrapper EmbedderEngine(model, nThreads, pooling).embed(text).
Validation sur tablette SM8750 (adb shell, nomic-embed Q4_K_M, CPU) :
- Déterminisme : max|diff| = 0.0 bit-identique sur 2 runs
- Norme L2 = 1.0000
- PARITÉ RÉFÉRENCE : mon embedText vs llama-embedding = max|diff| 5e-7,
cos 1.000000 (probe rag_probe.cpp répliquant le chemin exact)
- Cohérence sémantique : OK avec bons préfixes
FINDING modèle (point #1 du spec confirmé par mesure) : nomic-embed est
anglo-centré, marge FR fine (cos insomnie 0.556 vs tarte 0.517 = 0.04, et
ordre s'inverse avec mauvais préfixe). => SHIPPER multilingual-e5-small comme
le spec l'exige, pas nomic. Le code est agnostique au modèle (n_embd auto).
⚠ Bloqueur SELinux identique LLM/TTS : l'embedder linke libllama->libggml-hexagon
qui ouvre /dev/fastrpc-cdsp au backend_init -> crash untrusted_app. DOIT tourner
sur le build CPU-only (GGML_HEXAGON=OFF). Documenté dans le code + RAG_INTEGRATION.md.
Doc : dist/RAG_INTEGRATION.md (format des 3 autres) + overview à jour (4 sous-systèmes).