Commit Graph

2 Commits

Author SHA1 Message Date
Richard Loyer 655d65a655 chantier RAG #2 : modèle FR tranché (e5-small voie a) + .so CPU-only + patch converter
Réponses aux 3 demandes du dev :

#1 .so CPU-only livrée : dist/b-jni-cpu/libkazeia_engine.so (64 KB).
   DT_NEEDED = libllama/libggml/libggml-base (CPU-only dist/lib-cpu/) + système,
   AUCUNE dep libggml-hexagon -> pas de FastRPC -> pas de bloqueur SELinux.
   Validée tablette : charge e5+nomic, n_embd auto, déterministe, norme 1.0.

#2 modèle FR tranché = VOIE A (multilingual-e5-small), blocage XLM-R levé.
   Question décisive "petit patch ou trou architectural ?" -> PETIT PATCH, mesuré :
   - runtime C++ a déjà UGM (unigram/SPM), découplé de l'arch (tokenizer_model=t5
     -> LLAMA_VOCAB_TYPE_UGM). Pas de trou.
   - converter a déjà _xlmroberta_set_vocab (écrit t5/UGM) mais seul NomicBert le
     câblait. e5 declare architectures=[BertModel]+tokenizer Unigram -> tombait en
     BertModel.set_vocab -> chemin BPE -> get_vocab_base_pre échoue (hash inconnu).
   - fix = wiring dans BertModel (3 méthodes : __init__ détecte Unigram, set_vocab
     route xlmroberta, modify_tensors choppe positions) calqué sur Roberta/Nomic.
   Patch : dist/patches/bert_xlmroberta_unigram.diff (~25 lignes, à appliquer dans
   le fork ql par le dev — non commité dans ql par respect AGENTS.md).
   PROUVÉ end-to-end : converti e5-small-f16.gguf (384-dim) via converter patché,
   chargé sur build CPU-only tablette :
     cos(dormir,insomnie)=0.909 > cos(dormir,tarte)=0.821, marge FR 0.089
     (nomic 0.04 -> e5 2.2x mieux), ranking propre, norme 1.0, déterministe.
   Voie c (nomic stopgap) documentée si besoin de dérisquer l'E2E in-app d'abord.

#3 interface FIGÉE confirmée : loadEmbedder/embedText/freeEmbedder inchangées.

Bit-identique garanti sur le MÊME build (CPU vs HTP divergent ~1.5e-2 sur Q4_K_M ;
sans effet car ingestion+requête tournent sur le même build in-app).

Doc dist/RAG_INTEGRATION.md mise à jour (décision modèle, patch, reproduction GGUF,
interface figée, .so CPU-only). GGUF e5 = artefact distribution (non versionné git).
2026-06-09 22:46:02 +02:00
Richard Loyer 5cc8c22fc9 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).
2026-06-09 22:02:30 +02:00