Spaces:
Runtime error
Runtime error
Commit History
22 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
25 days ago
-
fix(ingestion): l'annee du numero est celle de l'acte, pas d'un texte modificatif
« Decret N°94/199 du 07 octobre 1994 portant…, modifie et complete par le decret n°2000/287 du 12 octobre 2000 » etait date du 12 octobre 2000 : le numero cherche dans tout le titre etait celui du texte modificatif, et la vraie date, trop loin de son annee, etait rejetee. Le numero est desormais lu avant l'objet de l'acte. Sur les 2287 titres des deux index, seule cette date change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>34508a7 -
feat(ingestion): textes venus d'ailleurs que prc.cm, Actes uniformes OHADA
Le corpus complementaire (Actes uniformes OHADA, Code CIMA, lois que prc.cm ne sert pas) passe par la meme ingestion que le reste. - L'index peut donner la reference du texte (« OHADA-AUA-2017 », « LOI-1992-007 ») ; sans elle, `PRC-{doc_id}` comme avant. Un Acte uniforme ne pretend plus venir de la Presidence. - « Acte uniforme » devient un type d'acte, en dernier dans la recherche sur tout le titre : « Decret portant ratification de l'Acte uniforme… » reste un decret. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c148f31
-
feat(groq): classement des lois par lots, sans repli silencieux, et suite isolee du reseau
GroqService (app/services/groq_service.py) : - chaque appel passe par le limiteur de son modele (les quotas Groq sont par modele) ; un 429 est respecte (Retry-After) puis rejoue ; une attente imposee de plus de GROQ_ATTENTE_MAX_429_S, ou un message de quota journalier, ferme le modele jusqu'a l'echeance (GroqQuotaError, sans requete) ; 5xx et pannes reseau : 4 essais ; - erreurs typees au lieu de None : GroqLimiteError, GroqQuotaError, GroqIndisponibleError, GroqReponseInvalideError ; - schema JSON strict, max_completion_tokens, temperature 0, reflexion coupee (qwen : « none ») ou reduite et masquee (gpt-oss) ; - la sonde de sante lit /models/{modele} au lieu de generer. Classement des lois (legal_domain_classifier.py) : - par LOTS de documents numerotes, codes courts en sortie : 2 226 lois une par une demandaient 11 jours de quota ; un lot incomplet est redemande (les manquants, ou le lot coupe en deux), un document qui manque encore est « a revoir » ; - modele prop…1a3d3f5
-
fix(ingestion): les doublons se reconnaissent sur tout le corpus, pas sur le lot
La reindexation passe par lots de 50 documents (--doc-id). Les doublons (meme PDF sous deux numeros d'acte) etaient determines sur la seule selection : PRC-10016, jumeau du 10018 reste dans un autre lot, a passe pour unique, est parti en traitement sans fichier, et son echec a arrete la reindexation entiere. Le canonique se choisit desormais sur le corpus complet, quelle que soit la selection traitee. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>2d6e405
-
feat(ingestion): le corpus en deux passes reprenables
Passe 1, scripts/extraire_corpus.py : Docling seul, sans base. Le travail se fait dans un processus enfant (spawn) recycle tous les 25 documents ou au-dela de 5 Go : la memoire de Docling grossit au fil des pages. Le superviseur compte une tentative au lot pendant lequel l'enfant meurt, tue un enfant bloque, s'arrete sur une panne generale (initialisation, echecs en serie) ou si .env et les paquets ont change depuis le lancement — sans quoi l'enfant ecrirait dans un autre cache et la boucle ne finirait pas. Arret propre par data/ingestion/STOP ; suivi dans progression.json. Passe 2, scripts/ingest_corpus.py : ne relit que le cache, jamais Docling. Reprend les lois pending, processing et refused ; une panne de base est rejouee avec attente croissante au lieu de compter chaque document en echec. Les PDF identiques sous deux numeros d'acte sont indexes une fois, l'autre signale. Type et date de l'acte relus dans le titre, l'annee controlee par le numero d'acte. Pipeline (process_law) : …1be6163
-
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
-
fix: autocompletion vide, categories jamais ecrites, titre de resultat inerte
Trois pannes constatees en utilisant l'application sur un corpus reel. 1. /search/suggest ne renvoyait RIEN, pour a peu pres toute saisie. Deux causes cumulees. similarity() compare la requete au titre ENTIER : sur ce corpus un titre fait quatre-vingt-dix caracteres et le mot cherche une dizaine, la similarite plafonne a 0,13 quand le seuil est a 0,3 — mesure sur la base. Et la branche prefixe ne rattrapait rien, aucun titre ne commencant par le mot cherche. word_similarity mesure la requete contre le MEILLEUR extrait du titre et vaut 1,0 dans ce meme cas ; l'operateur %> est celui que gin_trgm_ops sait accelerer. S'y ajoutait la sensibilite aux accents : "societe" contre un titre portant "societe" accentue donne 0,500, sous le seuil de 0,6 — or personne ne tape les accents. La migration a6b7c8d9e0f1 installe unaccent, un enrobage IMMUTABLE (unaccent est STABLE, donc inutilisable dans un index) et deux index trigrammes sur l'expression depliee, sans…a381e6a -
fix(gemini): aucun delai maximal sur les appels, blocage indefini possible
genai.Client etait construit sans http_options, donc sans le moindre delai. Constate en conditions reelles pendant l'ingestion du corpus : le processus est reste 40 MINUTES endormi sur une lecture de prise reseau au milieu d'un lot d'embeddings — vivant, 16 secondes d'UC en une heure, aucune trace. Comme aucune exception n'est levee, la boucle de reprise du service ne se declenche jamais : le blocage est silencieux et sans fin. settings.GEMINI_TIMEOUT_S (120 s) est applique aux deux clients, celui des embeddings et celui de la generation. Un appel qui depasse leve desormais, ce qui reactive les reprises deja en place. Deux tests verifient que le delai est bien pose sur chaque client. Ajout de scripts/ingest_corpus.py, qui a servi a trouver le probleme : ingestion d'un echantillon graine du corpus prc.cm par la chaine complete (copie, extraction LlamaParse, decoupage, embeddings, tsvector). Echantillonnage stratifie a 70 % de textes normatifs : un tirage uniforme donne 52,6 % de decr…7dc0e8b