Build retrieval around evidence, not a demo prompt.Construisez la recherche autour des preuves, pas d’un prompt de démonstration.
Archived, downloadable architecture source for extracting legal material, creating retrievable units and carrying evidence toward a cited answer.Une source d’architecture archivée et téléchargeable pour extraire le droit, créer des unités retrouvables et porter les preuves vers une réponse citée.
Not hosted
No active ingestion or retrieval endpoint
Non hébergé
Aucun endpoint actif d’ingestion ou de recherche
This captured schema explains the architecture; it is not a builder interface.
The manifested image is source-code proof captured from this site’s native architecture schema. The downloadable Python package is pinned separately to the historical commit where it exists.
Ce schéma capturé explique l’architecture ; ce n’est pas une interface du builder.
L’image du manifeste est une preuve issue du code source, capturée depuis le schéma d’architecture natif de ce site. Le package Python téléchargeable est épinglé séparément au commit historique où il existe.
401928a
Source and evidence limitsSource et limites de la preuve
- Architecture and source-code proof only; this is not a builder product interface.
- The public package CTA is pinned to its historical repository commit because the package is absent from the current primary branch snapshot.
- No hosted RAG execution, model call, or customer dataset is represented.
- Preuve d’architecture et de code source uniquement ; il ne s’agit pas d’une interface du produit Builder.
- Le lien vers le package public est épinglé à son commit historique, car ce package est absent de l’instantané actuel de la branche principale.
- Aucune exécution RAG hébergée, aucun appel de modèle ni aucun jeu de données client ne sont représentés.
https://github.com/AndriusPetrenas/QueryLexV6 · 401928a0d20107545673641e228a9869b1806c16 · /solutions/rag-builder
A RAG system is a chain of evidence decisions.
The archived package makes ingestion, chunking, indexing, retrieval, reranking, completion and evaluation boundaries inspectable. It is source architecture, not a hosted builder.
Python package pinned to a historical commit.
The code can be inspected and downloaded from GitHub.
No active ingestion, retrieval or model endpoint.
Seven stages. Every boundary is inspectable.
Select a stage to inspect its input, output, technology, source path and evaluation implication.
134e52cUn système RAG est une chaîne de décisions sur les preuves.
Le package archivé rend inspectables les frontières d’ingestion, de découpage, d’indexation, de recherche, de réordonnancement, de complétion et d’évaluation. C’est une architecture source, pas un builder hébergé.
Package Python épinglé à un commit historique.
Le code peut être inspecté et téléchargé depuis GitHub.
Aucun endpoint actif d’ingestion, de recherche ou de modèle.
Sept étapes. Chaque frontière est inspectable.
Sélectionnez une étape pour examiner son entrée, sa sortie, sa technologie, son fichier source et son implication pour l’évaluation.
134e52cFourteen techniques — what each does, the problem it solves, and when to switch it on.
Quatorze techniques — ce que fait chacune, le problème qu’elle résout, et quand l’activer.
Costs, timings and accuracy figures are the published figures for this pipeline architecture, not fresh benchmarks of the archived package. Each technique names the file that implements it.
Les coûts, les temps et les gains de précision sont les chiffres publiés pour cette architecture de pipeline, et non de nouveaux benchmarks du package archivé. Chaque technique nomme le fichier qui l’implémente.
Phase 1 · Document processing
Phase 1 · Traitement des documents
7 techniques7 techniquesStep 1Étape 1 Text extraction & legal tokenization
Regex-based parsing and legal tokenization
Extraction du texte et tokenisation juridique
Analyse par expressions régulières et tokenisation juridique
What it does
- Extracts raw text from PDF (PyPDF2/pdfplumber), DOCX (python-docx) and TXT files.
- Applies legal tokenization: protects 100+ legal abbreviations from being split.
- Protected examples: “Art.”, “Sec.”, “Corp.”, “Inc.”, “Ltd.”, “TFEU”, “GDPR”, “BGH”, “§”, “No.”, “v.”, “et al.”
- Converts “Art. 101” → “Art__DOT__ 101” during chunking, then restores it.
Ce que fait la technique
- Extrait le texte brut des fichiers PDF (PyPDF2/pdfplumber), DOCX (python-docx) et TXT.
- Applique une tokenisation juridique : plus de 100 abréviations juridiques sont protégées du découpage.
- Exemples protégés : « Art. », « Sec. », « Corp. », « Inc. », « Ltd. », « TFUE », « RGPD », « BGH », « § », « n° », « c. », « et al. »
- Convertit « Art. 101 » → « Art__DOT__ 101 » pendant le découpage, puis rétablit la forme d’origine.
Problem it solves
- Standard tokenizers split “Art. 101” into [“Art”, “.”, “101”] across chunk boundaries.
- That breaks legal citations, so a search for “Article 101” fails to match “Art. 101”.
- Legal documents use abbreviation patterns absent from standard NLP tokenizers.
Le problème résolu
- Les tokeniseurs standards découpent « Art. 101 » en [« Art », « . », « 101 »] de part et d’autre des chunks.
- Les citations juridiques sont cassées : une recherche « Article 101 » ne trouve plus « Art. 101 ».
- Les documents juridiques ont des schémas d’abréviation absents des tokeniseurs NLP standards.
When to use it
- Always active during ingestion.
Quand l’utiliser
- Toujours actif lors de l’ingestion.
- Cost
- Coût
- $0
- 0 $
- Time
- Temps
- +2 ms per document
- +2 ms par document
- Accuracy
- Précision
- +15% on citation queries
- +15 % sur les requêtes de citation
Step 2Étape 2 Semantic chunking
256-token chunks with overlap
Découpage sémantique
Chunks de 256 tokens avec recouvrement
What it does
- Token-based splitting via tiktoken (cl100k_base).
- Default: 256 tokens per chunk, 50 tokens of overlap (20%).
- Model-aware sizing: Isaacus (512), Voyage/Cohere (384), OpenAI (256).
- Structure-aware: prefers paragraph boundaries over mid-sentence cuts.
- Metadata prefix: “Document: {file}, Page: {pg}, Section: {sec}”.
Ce que fait la technique
- Découpage par tokens via tiktoken (cl100k_base).
- Par défaut : 256 tokens par chunk, 50 tokens de recouvrement (20 %).
- Taille adaptée au modèle : Isaacus (512), Voyage/Cohere (384), OpenAI (256).
- Respect de la structure : préfère les frontières de paragraphe aux coupes en milieu de phrase.
- Préfixe de métadonnées : « Document : {fichier}, Page : {pg}, Section : {sec} ».
Problem it solves
- Character-based chunking cuts mid-word or mid-sentence and destroys meaning.
- Fixed-size chunks ignore document structure (articles, sections, paragraphs).
- Without overlap, the context at each boundary is lost for good.
Le problème résolu
- Le découpage par caractères coupe au milieu d’un mot ou d’une phrase et détruit le sens.
- Les chunks de taille fixe ignorent la structure du document (articles, sections, paragraphes).
- Sans recouvrement, le contexte aux frontières est définitivement perdu.
When to use it
- Standard strategy for all text-based documents.
- Use when documents have a clear paragraph structure.
- Optimal for legal texts where a concept fits within ~200–300 words.
Quand l’utiliser
- Stratégie standard pour tous les documents textuels.
- À utiliser quand les documents ont une structure de paragraphes claire.
- Optimal pour les textes juridiques où un concept tient en ~200–300 mots.
- Cost
- Coût
- $0
- 0 $
- Time
- Temps
- +5 ms per 1,000 tokens
- +5 ms par 1 000 tokens
- Chunks per document
- Chunks par document
- ~20–100 depending on size
- ~20–100 selon la taille
Step 3Étape 3OptionalOptionnel Metadata extraction
Extracts jurisdiction, type and dates
Extraction des métadonnées
Extrait la juridiction, le type et les dates
What it does
- Sends the first 3,000 characters of the document to an LLM for classification.
- Extracts structured metadata: document type, jurisdiction, practice area, date, parties, key provisions.
- Falls back to regex heuristics if the LLM call fails.
Ce que fait la technique
- Envoie les 3 000 premiers caractères du document à un LLM pour classification.
- Extrait des métadonnées structurées : type de document, juridiction, domaine, date, parties, dispositions clés.
- Bascule sur des heuristiques par expressions régulières si l’appel au LLM échoue.
Problem it solves
- Users want to filter: “show me only EU antitrust regulations”.
- Manual tagging does not scale once a corpus grows past a few hundred documents.
- A filename alone does not capture document type or jurisdiction.
Le problème résolu
- Les utilisateurs veulent filtrer : « montre-moi seulement les règlements antitrust de l’UE ».
- L’étiquetage manuel ne passe pas à l’échelle au-delà de quelques centaines de documents.
- Le nom de fichier seul ne dit ni le type de document ni la juridiction.
When to use it
- Use when users need to filter results by jurisdiction or document type.
- Ideal for mixed corpora (for example EU and US law together).
- When an automated taxonomy is preferable to manual tagging.
Quand l’utiliser
- À utiliser quand les utilisateurs doivent filtrer par juridiction ou type de document.
- Idéal pour les corpus mixtes (par exemple droit de l’UE et droit américain ensemble).
- Quand une taxonomie automatique est préférable à l’étiquetage manuel.
- Cost
- Coût
- ~$0.005 per document
- ~0,005 $ par document
- Time
- Temps
- +800 ms per document
- +800 ms par document
- Filtering accuracy
- Précision du filtrage
- +5–15%
- +5–15 %
Step 4Étape 4OptionalOptionnel SAC — summary-augmented chunking
Summary-augmented chunking
SAC — découpage augmenté par résumé
Summary-Augmented Chunking
What it does
- For each chunk, an LLM generates a two-to-three sentence contextual summary.
- The summary captures document type, main topic, key concepts and position in the document.
- The summary is prepended to the chunk before embedding.
Ce que fait la technique
- Pour chaque chunk, un LLM génère un résumé contextuel de deux à trois phrases.
- Le résumé capture le type de document, le sujet principal, les concepts clés et la position dans le document.
- Le résumé est ajouté en tête du chunk avant l’embedding.
Problem it solves
- Chunk 47 of 100 has no idea it comes from an “EU Merger Regulation”.
- The query “EU merger control” will not match a chunk that only says “the undertakings shall…”.
- Middle chunks become orphans, semantically disconnected from the document’s purpose.
Le problème résolu
- Le chunk 47 sur 100 n’a aucune idée qu’il provient d’un « règlement européen sur les concentrations ».
- La requête « contrôle des concentrations UE » ne correspondra pas à un chunk qui dit seulement « les entreprises doivent… ».
- Les chunks du milieu deviennent orphelins, sémantiquement coupés de l’objet du document.
When to use it
- Crucial for long, complex regulations where context is lost in the middle chunks.
- Use when queries relate to the document globally (“what does this update say?”).
- When higher accuracy is worth the extra processing cost.
Quand l’utiliser
- Crucial pour les règlements longs et complexes où le contexte se perd dans les chunks du milieu.
- À utiliser quand les requêtes portent sur le document dans son ensemble (« que dit cette mise à jour ? »).
- Quand un gain de précision justifie le coût de traitement supplémentaire.
- Cost
- Coût
- ~$0.001 per chunk
- ~0,001 $ par chunk
- Time
- Temps
- +500 ms per chunk
- +500 ms par chunk
- Retrieval accuracy
- Précision de la recherche
- +10–20%
- +10–20 %
Step 5Étape 5 Multi-provider embedding
OpenAI / Cohere / Voyage / Isaacus
Embeddings multi-fournisseurs
OpenAI / Cohere / Voyage / Isaacus
What it does
- Converts a text chunk into a dense vector.
- Supports multiple providers: OpenAI (1536 dim), Isaacus Legal (1792 dim), Voyage (1024 dim), Cohere (1024 dim).
- Each chunk becomes a vector such as [0.023, -0.847, …].
Ce que fait la technique
- Convertit un chunk de texte en vecteur dense.
- Prend en charge plusieurs fournisseurs : OpenAI (1536 dim), Isaacus Legal (1792 dim), Voyage (1024 dim), Cohere (1024 dim).
- Chaque chunk devient un vecteur du type [0,023, -0,847, …].
Problem it solves
- Keyword search (BM25) only matches exact words: “automobile” ≠ “car”.
- General embeddings miss legal nuance: “consideration” in contract law versus everyday use.
- A single provider is a single point of failure.
Le problème résolu
- La recherche par mots-clés (BM25) ne trouve que les mots exacts : « automobile » ≠ « voiture ».
- Les embeddings généralistes passent à côté de la nuance juridique : « consideration » en droit des contrats face à son sens courant.
- Dépendre d’un seul fournisseur crée un point de défaillance unique.
When to use it
- Always required for semantic search.
- Use Isaacus Legal for specialised legal terminology.
- Use OpenAI for general-purpose versatility.
Quand l’utiliser
- Toujours nécessaire pour la recherche sémantique.
- Utiliser Isaacus Legal pour la terminologie juridique spécialisée.
- Utiliser OpenAI pour la polyvalence générale.
- Cost
- Coût
- $0.02–$0.35 per 1M tokens
- 0,02–0,35 $ par million de tokens
- Time
- Temps
- ~50–200 ms per batch
- ~50–200 ms par lot
- Quality
- Qualité
- Foundation of retrieval
- Socle de la recherche
Step 6Étape 6OptionalOptionnel ColBERT sentence embeddings
Sentence-level embeddings stored beside each chunk
Embeddings de phrases ColBERT
Embeddings au niveau de la phrase, stockés à côté de chaque chunk
What it does
- Splits each chunk into three to eight sentences.
- Embeds each sentence separately, instead of one embedding for the whole chunk.
- Stores the sentence embeddings alongside the chunk embedding.
- At search time, MaxSim scoring takes MAX(similarity(query, sentence_i)) across the sentences.
Ce que fait la technique
- Découpe chaque chunk en trois à huit phrases.
- Encode chaque phrase séparément, au lieu de produire un seul embedding pour tout le chunk.
- Stocke les embeddings de phrases à côté de l’embedding du chunk.
- Au moment de la recherche, le score MaxSim prend MAX(similarité(requête, phrase_i)) sur l’ensemble des phrases.
Problem it solves
- A single chunk embedding is an average of all its sentences, which dilutes specific matches.
- A query about “fines” matches poorly against a chunk that is 80% about procedure.
- Important specific information stays buried in irrelevant surrounding text.
Le problème résolu
- Un embedding unique par chunk est la moyenne de toutes ses phrases, ce qui dilue les correspondances précises.
- Une requête sur les « amendes » correspond mal à un chunk consacré à 80 % à la procédure.
- L’information précise reste noyée dans le texte environnant non pertinent.
When to use it
- Use for needle-in-a-haystack retrieval.
- When users ask very specific questions buried in long paragraphs.
- When storage space matters less than precision.
Quand l’utiliser
- À utiliser pour retrouver une aiguille dans une botte de foin.
- Quand les utilisateurs posent des questions très précises noyées dans de longs paragraphes.
- Quand l’espace de stockage compte moins que la précision.
- Cost
- Coût
- ~$0.002 per chunk
- ~0,002 $ par chunk
- Time
- Temps
- +100 ms per query (rerank)
- +100 ms par requête (réordonnancement)
- Precision
- Précision
- +5–15%
- +5–15 %
Step 7Étape 7 Vector storage (Supabase)
Supabase pgvector
Stockage vectoriel (Supabase)
Supabase pgvector
What it does
- Stores chunks in PostgreSQL with the pgvector extension.
- Multiple embedding columns for different dimensions: 1024, 1536, 1792.
- Stores content, metadata (JSON), source, page, chunk index and sentence embeddings.
Ce que fait la technique
- Stocke les chunks dans PostgreSQL avec l’extension pgvector.
- Plusieurs colonnes d’embeddings pour différentes dimensions : 1024, 1536, 1792.
- Stocke le contenu, les métadonnées (JSON), la source, la page, l’index du chunk et les embeddings de phrases.
Problem it solves
- You need performant vector similarity search together with rich metadata filtering.
- Proprietary vector databases are expensive and disconnected from application data.
Le problème résolu
- Il faut une recherche vectorielle performante et un filtrage riche sur les métadonnées.
- Les bases vectorielles propriétaires sont coûteuses et déconnectées des données de l’application.
When to use it
- Always used, as the central knowledge base.
Quand l’utiliser
- Toujours utilisé, comme base de connaissances centrale.
- Storage
- Stockage
- ~1 KB per chunk plus vectors
- ~1 Ko par chunk, vecteurs en sus
- Query
- Requête
- <50 ms for 1M vectors
- <50 ms pour 1 million de vecteurs
Phase 2 · Query processing
Phase 2 · Traitement des requêtes
7 techniques7 techniquesStep 1Étape 1OptionalOptionnel Query decomposition
Break complex queries into focused sub-queries
Décomposition de la requête
Diviser les requêtes complexes en sous-requêtes ciblées
What it does
- Analyses query complexity with heuristics (word count, “and”/“or”, question form).
- If complex, an LLM breaks it into two to four focused sub-queries.
- Each sub-query searches independently.
- Results are merged with Reciprocal Rank Fusion (RRF).
Ce que fait la technique
- Analyse la complexité de la requête à l’aide d’heuristiques (nombre de mots, « et »/« ou », forme interrogative).
- Si elle est complexe, un LLM la divise en deux à quatre sous-requêtes ciblées.
- Chaque sous-requête effectue sa propre recherche.
- Les résultats sont fusionnés par Reciprocal Rank Fusion (RRF).
Problem it solves
- Complex queries carry several information needs at once.
- One embedding cannot represent “EU fines” and “US fines” and “comparison” equally.
- A user asking about several jurisdictions needs documents from each.
- Long queries get diluted into vague embeddings.
Le problème résolu
- Les requêtes complexes portent plusieurs besoins d’information à la fois.
- Un seul embedding ne peut représenter à égalité « amendes dans l’UE », « amendes aux États-Unis » et « comparaison ».
- Un utilisateur qui interroge plusieurs juridictions a besoin de documents de chacune.
- Les requêtes longues se diluent en embeddings vagues.
When to use it
- Use for multi-part questions (“compare X and Y”).
- When queries are long and contain several distinct concepts.
- Not recommended for simple keyword lookups: it adds latency.
Quand l’utiliser
- À utiliser pour les questions à plusieurs volets (« comparer X et Y »).
- Quand les requêtes sont longues et contiennent plusieurs concepts distincts.
- Déconseillé pour une simple recherche par mot-clé : cela ajoute de la latence.
- Cost
- Coût
- ~$0.002 per query
- ~0,002 $ par requête
- Time
- Temps
- +300 ms
- +300 ms
- Recall
- Rappel
- +15–25% on complex queries
- +15–25 % sur les requêtes complexes
Step 2Étape 2OptionalOptionnel HyDE — hypothetical embeddings
Hypothetical document embeddings
HyDE — embeddings hypothétiques
Hypothetical Document Embeddings
What it does
- An LLM generates a hypothetical document that would answer the query.
- That hypothetical document is embedded instead of, or alongside, the query.
- The hypothesis uses document-like vocabulary, so it matches indexed documents better.
Ce que fait la technique
- Un LLM génère un document hypothétique qui répondrait à la requête.
- Ce document hypothétique est encodé à la place de la requête, ou en plus de celle-ci.
- L’hypothèse emploie le vocabulaire d’un document, elle correspond donc mieux aux documents indexés.
Problem it solves
- Vocabulary mismatch: users ask questions, documents state facts.
- “What are the fines?” (a question) versus “Fines shall not exceed…” (a statement).
- Short queries produce sparse, uninformative embeddings.
Le problème résolu
- Décalage de vocabulaire : les utilisateurs posent des questions, les documents énoncent des faits.
- « Quelles sont les amendes ? » (question) face à « Les amendes ne peuvent excéder… » (affirmation).
- Les requêtes courtes produisent des embeddings pauvres et peu informatifs.
When to use it
- Use when queries are very short or abstract.
- When there is a vocabulary gap between user questions and legal text.
- Effective for concept search rather than keyword search.
Quand l’utiliser
- À utiliser quand les requêtes sont très courtes ou abstraites.
- Quand il existe un écart de vocabulaire entre les questions et le texte juridique.
- Efficace pour la recherche par concept plutôt que par mot-clé.
- Cost
- Coût
- ~$0.003 per query
- ~0,003 $ par requête
- Time
- Temps
- +400 ms
- +400 ms
- Semantic matching
- Correspondance sémantique
- +10–30%
- +10–30 %
Step 3Étape 3 Hybrid search
Vector + keyword (BM25) with RRF
Recherche hybride
Vectoriel + mots-clés (BM25) avec RRF
What it does
- Runs two searches in parallel: vector search (semantic) and BM25 keyword search (exact).
- Merges the results with Reciprocal Rank Fusion (RRF).
Ce que fait la technique
- Lance deux recherches en parallèle : vectorielle (sémantique) et BM25 par mots-clés (exacte).
- Fusionne les résultats par Reciprocal Rank Fusion (RRF).
Problem it solves
- Vector search: “Article 101” might match “Article 102”, because they are semantically similar.
- Keyword search: “car” will not match “automobile”, because there is no semantic understanding.
- Legal citations need an exact match; concepts need a semantic one.
Le problème résolu
- Recherche vectorielle : « Article 101 » peut correspondre à « Article 102 », car les deux sont sémantiquement proches.
- Recherche par mots-clés : « voiture » ne correspond pas à « automobile », faute de compréhension sémantique.
- Les citations juridiques exigent une correspondance exacte ; les concepts, une correspondance sémantique.
When to use it
- Always recommended for legal search.
- Essential when users search for specific entities: case IDs, article numbers.
- Combines the precision of keywords with the recall of semantics.
Quand l’utiliser
- Toujours recommandé pour la recherche juridique.
- Indispensable quand les utilisateurs cherchent des entités précises : numéros d’affaire, numéros d’article.
- Combine la précision des mots-clés et le rappel de la sémantique.
- Cost
- Coût
- $0 (local)
- 0 $ (local)
- Time
- Temps
- +50 ms
- +50 ms
- Recall
- Rappel
- +20–30%
- +20–30 %
Step 4Étape 4OptionalOptionnel ColBERT re-ranking
MaxSim scoring
Réordonnancement ColBERT
Score MaxSim
What it does
- Takes the top N candidates from hybrid search.
- Computes MaxSim: for each stored sentence, the similarity to the query.
- The ColBERT score is the maximum sentence similarity.
- Re-ranks the candidates by that score.
Ce que fait la technique
- Reprend les N meilleurs candidats de la recherche hybride.
- Calcule MaxSim : pour chaque phrase stockée, la similarité avec la requête.
- Le score ColBERT est la plus élevée de ces similarités.
- Réordonne les candidats selon ce score.
Problem it solves
- A single chunk embedding is an average.
- A query about “fines” matches poorly against a chunk that is 80% about procedure.
- You need to find the exact sentence inside 256 tokens.
Le problème résolu
- Un embedding unique par chunk est une moyenne.
- Une requête sur les « amendes » correspond mal à un chunk consacré à 80 % à la procédure.
- Il faut trouver la phrase exacte à l’intérieur de 256 tokens.
When to use it
- Use when it was configured in phase 1: it requires sentence embeddings.
- When users need to pinpoint exact sentences or clauses.
- Ideal for fact-checking applications.
Quand l’utiliser
- À utiliser si l’option a été activée en phase 1 : elle exige des embeddings de phrases.
- Quand les utilisateurs doivent localiser une phrase ou une clause exacte.
- Idéal pour les usages de vérification des faits.
- Cost
- Coût
- $0 (pre-computed)
- 0 $ (précalculé)
- Time
- Temps
- +100 ms
- +100 ms
- Precision
- Précision
- +5–15%
- +5–15 %
Step 5Étape 5OptionalOptionnel Cross-encoder re-ranking
Deep relevance scoring
Réordonnancement par cross-encoder
Score de pertinence approfondi
What it does
- Takes the top candidates from the previous stages.
- Uses a cross-encoder model (ms-marco-MiniLM-L-6-v2) to process query and document together.
- Outputs a relevance score from 0 to 1 for each pair.
- Re-ranks by that score.
Ce que fait la technique
- Reprend les meilleurs candidats des étapes précédentes.
- Utilise un modèle cross-encoder (ms-marco-MiniLM-L-6-v2) qui traite la requête et le document ensemble.
- Produit un score de pertinence de 0 à 1 pour chaque paire.
- Réordonne selon ce score.
Problem it solves
- Bi-encoders encode query and document independently, so they miss interaction patterns.
- Cross-encoders are too slow for initial retrieval: they must compare every document.
- Bi-encoders struggle with subtle negation and with the direction of a relationship.
Le problème résolu
- Les bi-encoders encodent la requête et le document séparément et passent à côté des schémas d’interaction.
- Les cross-encoders sont trop lents pour la recherche initiale : ils doivent comparer chaque document.
- Les bi-encoders peinent sur la négation subtile et sur le sens d’une relation.
When to use it
- Use to sort the final top ten for the highest possible relevance.
- When nuances such as negation (“not liable”) are critical.
- Runs locally, which avoids external API latency and cost.
Quand l’utiliser
- À utiliser pour ordonner les dix premiers résultats avec la meilleure pertinence possible.
- Quand des nuances comme la négation (« non responsable ») sont déterminantes.
- Fonctionne en local, ce qui évite la latence et le coût d’une API externe.
- Cost
- Coût
- $0 (local)
- 0 $ (local)
- Time
- Temps
- +50–100 ms
- +50–100 ms
- Precision
- Précision
- +15–25%
- +15–25 %
Step 6Étape 6OptionalOptionnel Agentic RAG
Iterative search and refinement
RAG agentique
Recherche et affinage itératifs
What it does
- An LLM agent controls the search process with iterative refinement.
- Loop: plan → search → evaluate → refine, up to three iterations.
- Self-evaluation: is the retrieved context sufficient to answer?
Ce que fait la technique
- Un agent LLM pilote la recherche avec un affinage itératif.
- Boucle : planifier → chercher → évaluer → affiner, jusqu’à trois itérations.
- Auto-évaluation : le contexte retrouvé suffit-il à répondre ?
Problem it solves
- The first search attempt may miss relevant documents.
- The user does not know the right keywords to search for.
- Complex legal topics span several document types and vocabularies.
Le problème résolu
- La première recherche peut manquer des documents pertinents.
- L’utilisateur ne connaît pas les bons mots-clés.
- Les sujets juridiques complexes recouvrent plusieurs types de documents et plusieurs vocabulaires.
When to use it
- Use for open-ended research questions (“what is the case law on X?”).
- When the user is unsure of the exact terminology.
- For comprehensive reports, where thoroughness matters more than speed.
Quand l’utiliser
- À utiliser pour les questions de recherche ouvertes (« quelle est la jurisprudence sur X ? »).
- Quand l’utilisateur n’est pas sûr de la terminologie exacte.
- Pour les rapports exhaustifs, où la rigueur importe plus que la vitesse.
- Cost
- Coût
- ~$0.01 per query
- ~0,01 $ par requête
- Time
- Temps
- +1–3 s
- +1–3 s
- Complex query improvement
- Gain sur requêtes complexes
- +20–40%
- +20–40 %
Step 7Étape 7 Answer generation
LLM with citation grounding
Génération de la réponse
LLM avec ancrage des citations
What it does
- Builds a prompt from system instructions (a legal role) plus the retrieved chunks.
- The LLM generates an answer grounded in the retrieved documents.
- Includes source citations for verification.
Ce que fait la technique
- Construit un prompt à partir d’instructions système (un rôle de juriste) et des chunks retrouvés.
- Le LLM génère une réponse ancrée dans les documents retrouvés.
- Inclut les citations des sources pour vérification.
Problem it solves
- Pure LLMs hallucinate facts and references.
- Users need to be able to verify claims.
Le problème résolu
- Les LLM seuls hallucinent des faits et des références.
- Les utilisateurs doivent pouvoir vérifier les affirmations.
When to use it
- The final destination for all chat-based interactions.
- When users need a synthesised answer, not a list of links.
- To produce draft responses, summaries or analyses.
Quand l’utiliser
- La destination finale de toute interaction conversationnelle.
- Quand les utilisateurs veulent une réponse synthétisée, pas une liste de liens.
- Pour produire des projets de réponse, des synthèses ou des analyses.
- Cost
- Coût
- ~$0.01–0.05 per answer
- ~0,01–0,05 $ par réponse
- Quality
- Qualité
- Grounded, verifiable answers
- Réponses ancrées et vérifiables
Cost and performance summary
Coûts et performances
Document processing
Traitement des documents
- Legal tokenization
- Tokenisation juridique
- $0
- 0 $
- Semantic chunking
- Découpage sémantique
- $0
- 0 $
- Metadata extraction
- Extraction des métadonnées
- $0.005 / doc
- 0,005 $ / doc
- SAC summaries
- Résumés SAC
- $0.001 / chunk
- 0,001 $ / chunk
- Total (100 pages)
- Total (100 pages)
- ~$1.21
- ~1,21 $
Query processing
Traitement des requêtes
- Query decomposition
- Décomposition de la requête
- $0.002
- 0,002 $
- HyDE
- HyDE
- $0.003
- 0,003 $
- Agentic loop (3×)
- Boucle agentique (3×)
- $0.01
- 0,01 $
- Answer generation
- Génération de la réponse
- $0.01
- 0,01 $
- Full complexity
- Complexité maximale
- ~$0.025 / query
- ~0,025 $ / requête
Real-world scenario — a 10-page regulation
- 10 pages, roughly 5,000 words.
- ~50 chunks of 256 tokens each.
- Goal: analytical search — “what are the penalties?”
Cas réel — un règlement de 10 pages
- 10 pages, environ 5 000 mots.
- ~50 chunks de 256 tokens chacun.
- Objectif : recherche analytique — « quelles sont les sanctions ? »
- Basic (embedding only)
- Base (embedding seul)
- ~$0.001 (2 s)
- ~0,001 $ (2 s)
- + metadata extraction
- + extraction des métadonnées
- ~$0.006 (3 s)
- ~0,006 $ (3 s)
- + SAC summaries
- + résumés SAC
- ~$0.050 (30 s)
- ~0,050 $ (30 s)
- + ColBERT re-ranking
- + réordonnancement ColBERT
- ~$0.100 (20 s)
- ~0,100 $ (20 s)
- Full pipeline total
- Total du pipeline complet
- ~$0.16 (45 s)
- ~0,16 $ (45 s)
Chunking — default parameters
Découpage — paramètres par défaut
| Parameter | Value | Purpose |
|---|---|---|
| Paramètre | Valeur | Rôle |
| chunk_size | 256 tokens | Target size (~1,024 characters) |
| chunk_size | 256 tokens | Taille cible (~1 024 caractères) |
| overlap | 50 tokens | Context overlap (20%) |
| overlap | 50 tokens | Recouvrement de contexte (20 %) |
| min_chunk | 25 tokens | Skip small chunks |
| min_chunk | 25 tokens | Ignorer les chunks trop courts |
Model-aware chunk sizes
Tailles de chunk selon le modèle
| Model | Size | Overlap | Why |
|---|---|---|---|
| Modèle | Taille | Recouvrement | Pourquoi |
| OpenAI small | 256 | 50 | General balance |
| OpenAI small | 256 | 50 | Équilibre général |
| Cohere v3 | 384 | 75 | Prefers smaller chunks |
| Cohere v3 | 384 | 75 | Préfère des chunks plus courts |
| Isaacus Legal | 512 | 100 | Needs more context |
| Isaacus Legal | 512 | 100 | A besoin de plus de contexte |
Embedding models — benchmarks and use cases
Modèles d’embedding — benchmarks et usages
| Model | Focus and benchmarks | Use case |
|---|---|---|
| Modèle | Points forts et benchmarks | Cas d’usage |
| OpenAI text-embedding-3-small | Higher multilingual and retrieval accuracy than ada-002 (MIRACL/MTEB). Captures semantic relationships with low latency. | Cost-sensitive, general RAG |
| OpenAI text-embedding-3-small | Précision supérieure à ada-002 en multilingue comme en recherche (MIRACL/MTEB). Capte les relations sémantiques avec une faible latence. | RAG général, sensible au coût |
| Cohere embed-v3 | High ELO/nDCG on noisy real-world datasets. Advanced semantic similarity and classification. | Document ranking, quality focus |
| Cohere embed-v3 | ELO/nDCG élevés sur des jeux de données réels bruités. Similarité sémantique et classification avancées. | Classement de documents, priorité à la qualité |
| Isaacus kanon-2-embedder | Ranked first on the Massive Legal Embedding Benchmark (MLEB). Trained on 38+ jurisdictions (US, UK, EU, AU) specifically for legal retrieval. | Legal domain specialist |
| Isaacus kanon-2-embedder | Classé premier au Massive Legal Embedding Benchmark (MLEB). Entraîné sur plus de 38 juridictions (US, UK, UE, AU) spécifiquement pour la recherche juridique. | Spécialiste du domaine juridique |
| Voyage AI voyage-3-large | Top performance on nDCG@10 (RTEB/MTEB). Consistently high-quality rankings for complex RAG tasks. | High-precision RAG |
| Voyage AI voyage-3-large | Meilleures performances sur nDCG@10 (RTEB/MTEB). Classements de qualité constante pour les tâches RAG complexes. | RAG haute précision |
| OpenRouter qwen3-embedding-8b | State of the art on multilingual MTEB and code tasks. Strong cross-lingual and code representation quality. | Multilingual and code |
| OpenRouter qwen3-embedding-8b | État de l’art sur MTEB multilingue et sur le code. Forte qualité de représentation multilingue et de code. | Multilingue et code |
Feature configuration guide
Guide de configuration des fonctionnalités
| Feature | Trigger — when to use | Rationale — why | Example |
|---|---|---|---|
| Fonctionnalité | Déclencheur — quand l’utiliser | Raison — pourquoi | Exemple |
| Metadata extraction | Users need to filter by specific fields (jurisdiction, date, type). | Vector search ignores structured attributes; this enables SQL-like filtering. | “Show me only GDPR regulations from 2023.” |
| Extraction des métadonnées | Les utilisateurs doivent filtrer par champs précis (juridiction, date, type). | La recherche vectorielle ignore les attributs structurés ; cela permet un filtrage de type SQL. | « Montre-moi seulement les règlements RGPD de 2023. » |
| SAC | Long, complex documents where chunks lose their context. | Injects document-level context into every chunk, so they are retrieved even when they do not name the topic. | “What are the obligations?” (context: “under the AI Act…”) |
| SAC | Documents longs et complexes où les chunks perdent leur contexte. | Injecte le contexte du document dans chaque chunk : celui-ci est alors retrouvé même s’il ne nomme pas le sujet. | « Quelles sont les obligations ? » (contexte : « au titre du règlement IA… ») |
| ColBERT | Precision-critical tasks that need exact sentence pinpointing. | Prevents important details from being averaged out. Finds the needle in the haystack. | “What is the exact fine amount for Article 83(2)?” |
| ColBERT | Tâches où la précision est critique et qui exigent de localiser la phrase exacte. | Évite que les détails importants soient noyés dans une moyenne. Trouve l’aiguille dans la botte de foin. | « Quel est le montant exact de l’amende pour l’article 83(2) ? » |
| Query decomposition | Multi-part questions covering distinct topics. | Breaks one confusing vector into several focused vectors, for higher recall. | “Compare data privacy laws in the EU versus the US.” |
| Décomposition de la requête | Questions à plusieurs volets portant sur des sujets distincts. | Divise un vecteur confus en plusieurs vecteurs ciblés, pour un meilleur rappel. | « Compare les lois sur la protection des données dans l’UE et aux États-Unis. » |
| HyDE | Short or abstract questions; a gap between user and document vocabulary. | Turns a question vector into a plausible-answer vector, for better matching. | “Liability?” matches “The provider shall be liable for…” |
| HyDE | Questions courtes ou abstraites ; écart entre le vocabulaire de l’utilisateur et celui du document. | Transforme un vecteur de question en vecteur de réponse plausible, pour une meilleure correspondance. | « Responsabilité ? » correspond à « Le fournisseur est responsable de… » |
| Cross-encoder | Subtle nuances — negation, order — matter for the top results. | Reads query and document together to understand the real relationship. Costly, so use only for re-ranking. | “Can a company not be fined?” |
| Cross-encoder | Les nuances fines — négation, ordre — comptent pour les premiers résultats. | Lit la requête et le document ensemble pour comprendre la relation réelle. Coûteux : réservé au réordonnancement. | « Une entreprise peut-elle ne pas être sanctionnée ? » |
| Agentic RAG | Research tasks requiring reasoning, planning or several searches. | An autonomous loop that does not stop until the retrieved context is sufficient. | “Summarise the evolution of case law on cookie consent since 2018.” |
| RAG agentique | Travaux de recherche exigeant du raisonnement, de la planification ou plusieurs recherches. | Une boucle autonome qui ne s’arrête pas avant que le contexte retrouvé soit suffisant. | « Résume l’évolution de la jurisprudence sur le consentement aux cookies depuis 2018. » |
Dynamic batch sizing
Taille de lot dynamique
| Configuration | Batch size | Reason |
|---|---|---|
| Configuration | Taille de lot | Raison |
| SAC + ColBERT | 5 | Most API-intensive: a summary plus three to eight sentence embeddings. |
| SAC + ColBERT | 5 | Le plus intensif en API : un résumé et trois à huit embeddings de phrases. |
| ColBERT only | 25 | Many API calls: three to eight embeddings per chunk. |
| ColBERT seul | 25 | Beaucoup d’appels API : trois à huit embeddings par chunk. |
| SAC only | 50 | Moderate: one LLM call and one embedding per chunk. |
| SAC seul | 50 | Modéré : un appel LLM et un embedding par chunk. |
| Basic | 100 | Light: one embedding per chunk. |
| Base | 100 | Léger : un embedding par chunk. |
Quick reference
Référence rapide
| Feature | Phase | Cost | Time | Accuracy |
|---|---|---|---|---|
| Fonctionnalité | Phase | Coût | Temps | Précision |
| Legal tokenization | Upload | $0 | +2 ms / doc | +15% |
| Tokenisation juridique | Ingestion | 0 $ | +2 ms / doc | +15 % |
| Token chunking | Upload | $0 | +5 ms / 1K tokens | Foundation |
| Découpage par tokens | Ingestion | 0 $ | +5 ms / 1 000 tokens | Socle |
| SAC (optional) | Upload | ~$0.001 / chunk | +500 ms / chunk | +10–20% |
| SAC (optionnel) | Ingestion | ~0,001 $ / chunk | +500 ms / chunk | +10–20 % |
| Metadata extraction (optional) | Upload | ~$0.005 / doc | +800 ms / doc | +5–15% |
| Extraction des métadonnées (optionnelle) | Ingestion | ~0,005 $ / doc | +800 ms / doc | +5–15 % |
| Embedding | Upload | $0.02–0.35 / 1M | +50–200 ms / batch | Foundation |
| Embedding | Ingestion | 0,02–0,35 $ / 1 M | +50–200 ms / lot | Socle |
| ColBERT indexing (optional) | Upload | ~$0.002 / chunk | +300 ms / chunk | +5–15% |
| Indexation ColBERT (optionnelle) | Ingestion | ~0,002 $ / chunk | +300 ms / chunk | +5–15 % |
| Query decomposition (optional) | Query | ~$0.002 / query | +300 ms | +15–25% |
| Décomposition de la requête (optionnelle) | Requête | ~0,002 $ / requête | +300 ms | +15–25 % |
| HyDE (optional) | Query | ~$0.003 / query | +400 ms | +10–30% |
| HyDE (optionnel) | Requête | ~0,003 $ / requête | +400 ms | +10–30 % |
| Hybrid search | Query | $0 | +50 ms | +20–30% |
| Recherche hybride | Requête | 0 $ | +50 ms | +20–30 % |
| ColBERT re-score (optional) | Query | $0 | +100 ms | +5–15% |
| Réordonnancement ColBERT (optionnel) | Requête | 0 $ | +100 ms | +5–15 % |
| Cross-encoder (optional) | Query | $0 | +50–100 ms | +15–25% |
| Cross-encoder (optionnel) | Requête | 0 $ | +50–100 ms | +15–25 % |
| Agentic RAG (optional) | Query | ~$0.01 / query | +1–3 s | +20–40% |
| RAG agentique (optionnel) | Requête | ~0,01 $ / requête | +1–3 s | +20–40 % |
Other functionality can be added if you need it. Email andrius@querylex.com and we will code it.D’autres fonctionnalités peuvent être ajoutées si vous en avez besoin. Écrivez à andrius@querylex.com et nous les coderons.
Excluded on purpose, and why
Ce que nous excluons volontairement, et pourquoi
Knowledge graphs
Graphes de connaissances
Not implementedNon implémentéNo — not at 4k chunks, and not even at 40k.
- Knowledge graphs only pay off on corpora orders of magnitude larger than this one.
- And only when the same entities recur across a large share of those documents.
- At this scale, extraction costs dominate.
- The graph itself would be tiny.
- Traversal adds milliseconds and no benefit.
- A graph database adds roughly $200 a month for no measurable gain.
Non — ni à 4 000 chunks, ni même à 40 000.
- Les graphes de connaissances ne deviennent rentables qu’à partir de dizaines de milliers de documents.
- Et seulement quand les mêmes entités se répètent dans des milliers d’entre eux.
- À cette échelle, le coût d’extraction domine.
- Le graphe lui-même serait minuscule.
- Le parcours du graphe ajoute des millisecondes, sans aucun bénéfice.
- Une base de graphes coûte environ 200 $ par mois sans aucun gain mesurable.
GraphRAG
GraphRAG
Not implementedNon implémentéAbsolutely not — not before 100k documents.
- GraphRAG is designed for large corpora, millions of tokens, where themes must be discovered rather than retrieved.
- At this scale, ingestion would cost too much.
- Community detection would cluster trivially.
- Hours would go into summaries that add no value.
- Latency and cost become unacceptable.
Absolument pas — pas avant 100 000 documents.
- GraphRAG est conçu pour de grands corpus, des millions de tokens, où les thèmes doivent être découverts plutôt que retrouvés.
- À cette échelle, l’ingestion coûterait trop cher.
- La détection de communautés produirait des regroupements triviaux.
- Des heures seraient consacrées à des résumés sans valeur ajoutée.
- La latence et le coût deviendraient inacceptables.
The architecture image and the downloadable source prove different things.
L’image d’architecture et la source téléchargeable prouvent des choses différentes.
Architecture explainer
Explication d’architecture
The manifested image captures this site’s native schema at source commit 401928a. It is architecture and source-code proof, never a builder interface.
L’image du manifeste capture le schéma natif de ce site au commit 401928a. C’est une preuve d’architecture et de code source, jamais une interface du builder.
Archived Python package
Package Python archivé
The pinned rag-pipeline tree proves downloadable implementation source at 134e52c. It does not prove hosting, uptime, answer quality or a live product.
L’arborescence rag-pipeline épinglée prouve une source d’implémentation téléchargeable au commit 134e52c. Elle ne prouve ni hébergement, ni disponibilité, ni qualité des réponses, ni produit actif.
Seven files ground the complete architecture path.
Sept fichiers ancrent le parcours architectural complet.
Each link opens the exact file at the verified historical commit, not the moving default branch.
Chaque lien ouvre le fichier exact au commit historique vérifié, pas sur la branche par défaut changeante.
- 01Open sourceOuvrir la source
document_processor.pyCoordinates PDF processing, token-bounded chunking, indexing and candidate retrieval.
Coordonne le traitement PDF, la segmentation bornée en jetons, l’indexation et la recherche de candidats.
- 02Open sourceOuvrir la source
embedding_service.pyExposes the configurable embedding boundary used before vector storage.
Expose la frontière d’embedding configurable utilisée avant le stockage vectoriel.
- 03Open sourceOuvrir la source
supabase_client.pyStores and retrieves vectors with document metadata through dimension-specific pgvector paths.
Stocke et retrouve les vecteurs avec leurs métadonnées documentaires par des voies pgvector propres à chaque dimension.
- 04Open sourceOuvrir la source
legal_filters.pyResolves legal-source selections into metadata conditions for filtered retrieval.
Convertit les sélections de sources juridiques en conditions de métadonnées pour la recherche filtrée.
- 05Open sourceOuvrir la source
reranker.pyScores query–document pairs and returns a shorter ordered candidate set.
Note les paires requête–document et renvoie un ensemble candidat ordonné plus court.
- 06Open sourceOuvrir la source
llm_utils.pyReturns raw completion text only; citation mapping is not implemented here.
Renvoie uniquement un texte de complétion brute ; la correspondance des citations n’y est pas implémentée.
- 07Open sourceOuvrir la source
agentic_rag.pyContains the optional retrieval-sufficiency prompt, bounded iteration and search history.
Contient le prompt facultatif de suffisance de recherche, l’itération bornée et l’historique.
A toolkit is not a production knowledge system.
The archive has no active hosting, identity, tenant isolation, document-retention service, monitoring layer or managed model credentials.
Retrieval evaluation
The optional agentic loop prompts for retrieval sufficiency. It is not an end-to-end benchmark.
Citation boundary
Source metadata is retained, but the package supplies no answer assembler or citation renderer.
Human review
A cited RAG response remains an information-retrieval output. Legal authority, currency, completeness and application require professional review.
The excluded operating layer is substantial.
- There is no hosted ingestion, indexing or retrieval endpoint.
- Parsing and extraction errors can propagate into every later stage.
- The optional evaluator checks retrieval sufficiency, not legal correctness or end-to-end answer quality.
- The package does not include an answer assembler, citation renderer or human-review workflow.
Une boîte à outils n’est pas un système de connaissance en production.
L’archive ne comprend ni hébergement actif, ni identité, ni isolation tenant, ni service de rétention, ni supervision, ni identifiants de modèles gérés.
Évaluation de la recherche
La boucle agentic facultative évalue la suffisance des résultats à partir d’un prompt. Ce n’est pas un benchmark de bout en bout.
Frontière des citations
Les métadonnées de source sont conservées, mais le package ne fournit ni assembleur de réponse ni moteur d’affichage des citations.
Revue humaine
Une réponse RAG citée reste une sortie de recherche. Autorité, actualité, exhaustivité et application exigent une revue professionnelle.
La couche opérationnelle exclue est importante.
- Aucun endpoint hébergé d’ingestion, d’indexation ou de recherche.
- Les erreurs d’analyse et d’extraction peuvent se propager à chaque étape suivante.
- L’évaluateur facultatif vérifie la suffisance de la recherche, pas la correction juridique ni la qualité de bout en bout.
- Le package ne comprend ni assembleur de réponse, ni moteur d’affichage des citations, ni workflow de revue humaine.
Inspect the archived source before you build around its outputs.
The pinned package is public and downloadable. QueryLex can discuss the archive or a governed retrieval product built around your sources.
Inspectez la source archivée avant de construire autour de ses sorties.
Le package épinglé est public et téléchargeable. QueryLex peut discuter de l’archive ou d’un produit de recherche gouverné construit autour de vos sources.