Spaces:
Runtime error
Runtime error
Commit History
30 days ago
-
feat(embeddings): voyage-4-large remplace EmbeddingGemma (API Voyage, halfvec 1024)
Mesure sur tout le corpus (32 303 morceaux) et le jeu relu de 102 questions : en recherche dense, MRR@20 0,758 contre 0,537 pour EmbeddingGemma en francais, 0,680 contre 0,537 en anglais. Par le chemin du chat lui-meme (mots-cles en plein texte, question entiere vectorisee, 8 extraits envoyes au modele), l'article attendu figure parmi les extraits 92 % du temps en francais contre 61 % avec Gemma (MRR@8 0,504 contre 0,336), et 87 % en anglais contre 56 % (0,538 contre 0,282). Vectoriser la question entiere plutot que ses mots-cles gagne a lui seul +0,087 de MRR@8 en francais [IC 95 % +0,035 ; +0,143] et +0,127 en anglais [+0,067 ; +0,191]. - embedding_service.py : VoyageProvider (httpx, connexion gardee : 0,42 s par question contre 1,14 s avec une connexion neuve). Son corps de requete reproduit les vecteurs deja calcules du corpus : un test voyage_live le prouve, cosinus >= 0,999 sur deux questions et deux documents. Lots de 900 textes et 90 000 jetons estimes, refus definit…57c8117
-
feat(embeddings): EmbeddingGemma par defaut, et une panne qui se voit
EMBEDDING_PROVIDER vaut desormais gemma : les embeddings sont calcules en local, gratuitement, et Gemini ne sert plus qu'au chat. `gemini` reste disponible, a 768 dimensions lui aussi. LA PANNE LA PLUS PROBABLE DU SEMANTIQUE ETAIT LA SEULE INVISIBLE. Modele absent, fichier tronque, vecteurs d'un autre modele : dans chacun de ces cas, la recherche hybride avalait l'erreur et repondait en plein texte seul, pendant que GET /search/health disait « healthy ». Trois filets : - le modele est charge AU DEMARRAGE, et une question est reellement encodee. Un echec n'empeche pas l'API de demarrer — plein texte, chat et comptes s'en passent — mais il est journalise, et le service est ECARTE : garde, il retenterait de charger 300 Mo a chaque question ; - la sante passe en « degraded » si le service manque, si des vecteurs d'un AUTRE fournisseur sont en base (leurs cosinus ne veulent rien dire), ou si aucun vecteur n'est exploitable alors qu'il y a des articles a vectoriser. Ce dernier …7a1d560
-
fix(qualite): ruff devient une vraie barriere, et trouve un schema mort et casse
Ruff tournait sans jeu de regles declare : 1332 signalements, dont 98 faux positifs sur le motif `Depends()` de FastAPI et 615 modernisations de style. Un controle que personne ne peut passer n'est pas un controle. Le jeu retenu ne garde que ce qui signale un defaut reel (F, E4, E7, E9, I, RUF100), avec des exceptions nommees la ou l'ordre des imports EST la protection : env.py doit poser sys.path avant d'importer les modeles, conftest doit surcharger DATABASE_URL avant d'importer l'application. Ce que le controle a alors trouve : - UN SCHEMA MORT ET CASSE. `LawDetailResponse` existait deja, exposant `List[ArticleResponse]`. Il n'etait branche sur aucune route, et il etait doublement inutilisable : ArticleResponse porte le CONTENU integral de chaque article — pour le Code Minier, 166 Ko servis deux fois — et son `number` etait plafonne a 20 caracteres alors que la colonne en fait 64 depuis qu'elle accueille « QUATRE-VINGT-DIX-SEPTIEME ». Le plafond du schema est corrige, et…7435134
-
feat(search): retrieval au niveau chunk, embeddings 1536 indexables
La recherche travaillait au niveau document et ne pouvait pas etre indexee. 1. Niveau chunk. postgres_search_service appliquait un SELECT DISTINCT ON (law_id) ... ORDER BY law_id : les articles etaient ecrases a un par loi, et l'ordre transmis a la fusion RRF n'etait plus celui de la pertinence mais celui des identifiants. Cote semantique, la distance etait calculee par article puis passee a func.max() + GROUP BY Law.* : l'article gagnant etait jete, le resultat sortait avec matched_articles vide, highlights vide et content nul — soit aucun texte pour le prompt. Nouveau schema ChunkResult, une ligne par article, avec son numero, son titre, sa section, sa page et son contenu integral. SearchResult est inchangee champ pour champ et desormais DERIVEE des chunks : le front n'a rien a changer et recoit enfin des matched_articles remplis. SearchResponse.chunks est additif, avec un defaut, donc les reponses deja en cache se deserialisent encore. 2. Filtre…72be68d -
test: suppression des tests morts et resserrage des assertions permissives
tests/test_integration/test_rag_integration.py supprime (5 tests). Toutes ses fonctions dependaient de la fixture skip_if_ollama_unavailable, qui interroge settings.OLLAMA_URL — attribut disparu avec Ollama, donc AttributeError avalee par le except et skip systematique. Cinq tests verts qui n'executaient rien depuis le passage a Gemini. Le chemin RAG est couvert par test_rag_service.py (15 tests) et test_rag_routes.py (9), l'enchainement complet par test_full_pipeline.py. test_get_conversation_success supprime : le corps etait `pass`. Assertions qui validaient la panne autant que le fonctionnement : - rag_routes, conversation absente : "404 ou 500" devient 404. Les deux tests concernes utilisaient une fixture client locale sans redirection de get_db, donc frappaient la vraie base sur le port 5432 et recevaient un 500 de connexion refusee. Ils passent par le client de conftest ; la fixture locale, renommee sync_client, reste pour les tests dont le service est double. - categor…e3f1ef7 -
Etape 7 : type de colonne suggested_categories + tests d'embeddings
BUG DE SCHEMA : le modele Law declarait suggested_categories en JSON alors que la migration 001 cree la colonne en integer[]. Toute ecriture echouait en DatatypeMismatchError ("column is of type integer[] but expression is of type json") — donc toute creation de loi avec des categories suggerees. Ironie : un adaptateur get_array_type() existait juste au-dessus pour choisir ARRAY sous PostgreSQL, mais n'a jamais ete appele. Le projet ne ciblant que PostgreSQL, le type est declare directement et l'adaptateur mort supprime. embedding_service : la liste vide levait un AssertionError. Les assertions sautent sous python -O : la validation aurait disparu en production. -> ValueError. Tests : - test_embedding_service appelait la VRAIE API Gemini (echecs 400, et consommation de quota si la cle avait ete valide). Doublure deterministe installee : le vecteur derive du hash du texte, donc stable et discriminant, ce que supposent les tests de similarite. 131 s -> 0,4 s. - Les fixtures servi…bb367b5
-
chore: initial standalone backend for JuriX API (Render)
9cf9a2a