# Comment chercher dans vos propres documents avec des plongements, et prouver que ça fonctionne?

Date: 2026-07-30 · Author: Robert Scales · https://guidetoartificialintelligence.com/fr/apprendre/chercher-documents-plongements-mesure/

**Answer:** Transformez chaque passage et chaque question en plongement avec un petit modèle ouvert, renvoyez les passages les plus proches, puis testez le tout avec des questions dont vous connaissez la bonne réponse. Dans un petit guide de test, la recherche par mots-clés a placé le bon passage en tête pour 21 % des questions reformulées et les plongements pour 79 %, alors que les questions en français exigeaient un modèle multilingue.

Un plongement est une liste de nombres qui place un bout de texte sur une carte du sens, comme l’explique [cette introduction](/fr/apprendre/plongements-recherche-par-le-sens/). Ce projet saute la théorie et s’attaque à la partie souvent négligée : bâtir un test étiqueté, pour savoir si votre recherche fonctionne avant de la mettre devant quiconque.

Les documents sont le guide d’un centre communautaire fictif, Harrow Bay : 24 courts passages sur les heures, les tarifs, le stationnement et ainsi de suite. Les questions forment trois ensembles, chacune avec un bon passage connu : 12 qui partagent des mots avec le document, 14 écrites exprès pour éviter ses mots et 12 en français. Le script `08_search_documents.py` contient tout cela. Les modèles se téléchargent gratuitement, sous licence Apache 2.0, et tout a été exécuté sur le processeur.

## La recherche en dix lignes

```python
import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2", device="cpu")
passages = ["The pool closes at 21:00 on weekdays.",
            "Households with low income can apply for a reduced rate.",
            "Only service animals may enter the building."]
vectors = model.encode(passages, normalize_embeddings=True)

question = "I can't afford the yearly price, is there help?"
scores = vectors @ model.encode([question], normalize_embeddings=True)[0]
for i in np.argsort(-scores):
    print(round(float(scores[i]), 2), passages[i])
```

`normalize_embeddings=True` ramène chaque vecteur à une longueur de un, si bien qu’une simple multiplication donne la similarité cosinus, un score de proximité qui vaut 1 pour des directions identiques. C’est toute la [recherche sémantique](https://sbert.net/examples/sentence_transformer/applications/semantic-search/README.html) à cette échelle. Pour des millions de passages, on ajouterait un index, une structure qui trouve vite les voisins. Pour quelques milliers, une simple boucle comme celle-ci suffit.

Le script compagnon cherche aussi dans un dossier de vos propres fichiers `.txt` et `.md` :

```bash
python 08_search_documents.py --ask "how long do you keep lost items?" --folder my_notes/
```

## La comparaison mesurée

**Top 1** signifie que le bon passage est arrivé en tête. **Top 3** signifie qu’il figurait parmi les trois premiers, ce qui compte si une personne ou un modèle de langage lit les résultats. BM25 est une formule classique de pointage par mots-clés, écrite dans le script en une quinzaine de lignes.

| Questions | Mots-clés BM25 | all-MiniLM-L6-v2 | paraphrase-multilingual-MiniLM-L12-v2 |
|---|---|---|---|
| Partageant des mots avec le document (12), top 1 | 83 % | 100 % | 100 % |
| Évitant ses mots (14), top 1 | 21 % | 79 % | 64 % |
| Évitant ses mots (14), top 3 | 29 % | 93 % | 93 % |
| Questions en français (12), top 1 | 8 % | 33 % | 83 % |
| Questions en français (12), top 3 | 25 % | 58 % | 100 % |
| Vitesse d’encodage, millisecondes par passage | | 2,0 | 9,1 |

Mesuré ici : 24 passages, 38 questions, processeur Apple M5 Max, sentence-transformers 6.2. Avec si peu de questions, une seule question déplace un chiffre de 7 ou 8 points. Ne lisez que les grands écarts. Un test plus grand sur vos propres documents vous en dira plus que ce tableau.

Deux résultats pratiques ressortent pour une organisation bilingue. Le modèle anglais ne peut pas servir les francophones : il est tombé à 33 %. Et le [modèle multilingue](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) a cédé un peu de qualité en anglais en échange d’un fonctionnement dans plusieurs langues.

## Deux résultats qui vont contre les attentes

On recommande souvent de combiner la recherche par mots-clés et la recherche par le sens. Ici, ça n’a pas aidé. La fusion des deux classements par rang réciproque, qui additionne des scores selon la position dans chaque liste, a obtenu 62 % en top 1 avec le premier modèle, sous les 88 % des plongements seuls. Les mots-clés étaient si faibles sur les questions reformulées qu’ils ont tiré les bons résultats vers le bas. La recherche hybride aide surtout quand les mots-clés trouvent ce que les plongements manquent, comme des numéros de pièces et des noms rares, et ce guide en contenait peu. Testez-la sur vos données avant de l’adopter.

La taille des passages a aussi donné un résultat intéressant. Le script a joint le guide en un seul long texte et l’a coupé à l’aveugle, comme le ferait un pipeline naïf.

| Mots par morceau | Morceaux | Réponse en top 1 | Réponse en top 3 | Mots à lire pour le top 3 |
|---|---|---|---|---|
| 10 | 49 | 81 % | 100 % | 30 |
| 20 | 25 | 85 % | 96 % | 60 |
| 40 | 13 | 73 % | 92 % | 120 |
| 80 | 7 | 69 % | 100 % | 240 |
| 160 | 4 | 69 % | 96 % | 480 |
| 320 | 2 | 50 % | 100 % | 960 |

Le « 100 % » des très grands morceaux est creux : avec deux morceaux, le top 3 est le guide entier. La dernière colonne montre le vrai coût. Les petits morceaux ont bien réussi parce que ce guide est fait de courts passages autonomes. De longs rapports dont les phrases dépendent des paragraphes précédents se comporteront autrement. Notez aussi que [le modèle coupe les longues entrées](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) : par défaut, le texte au-delà de 256 morceaux de mots est ignoré sans aucune erreur.

> **À essayer :** écrivez 20 questions qu’une vraie personne pourrait poser sur vos notes, indiquez le bon fichier pour chacune et calculez le top 1 et le top 3 avant de changer le moindre réglage.

## Comment l’empêcher de répondre quand rien ne correspond?

Une recherche renvoie toujours quelque chose, même pour une question à laquelle vos documents ne peuvent pas répondre. Dix questions hors sujet, comme la façon de réparer un robinet, montrent le problème. La solution est un score minimal, choisi à partir de vos propres chiffres.

| Score minimal, all-MiniLM-L6-v2 | Bonnes questions encore traitées | Questions hors sujet traitées à tort |
|---|---|---|
| 0,2 | 100 % | 30 % |
| 0,3 | 92 % | 10 % |
| 0,4 | 81 % | 0 % |
| 0,5 | 50 % | 0 % |

Le modèle multilingue exige un autre réglage : à 0,4, il a traité 77 % des bonnes questions et 10 % des questions hors sujet. Les scores d’un modèle ne veulent rien dire pour un autre : refaites ce tableau chaque fois que vous changez de modèle.

La ligne à choisir dépend du coût d’une mauvaise réponse. Pour un outil de recherche destiné au personnel, trop répondre ne pose pas de problème, puisqu’une personne regarde le résultat. Pour un assistant public, préférez « Je n’ai pas trouvé » et un lien vers un être humain. Dès qu’un modèle de langage rédige des réponses à partir des passages, vous avez un deuxième système à tester, et [cet article sur l’évaluation du RAG](/fr/apprendre/evaluer-un-systeme-rag/) couvre la suite. Si vous hésitez entre la recherche et l’entraînement d’un modèle, [le projet suivant](/fr/apprendre/adapter-petit-modele-langage-quand-ne-pas/) mesure directement ce choix.

## Sources

- Semantic Search: https://sbert.net/examples/sentence_transformer/applications/semantic-search/README.html
- all-MiniLM-L6-v2 model card: https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2
- paraphrase-multilingual-MiniLM-L12-v2 model card: https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2

---

Tiré du Guide de l’intelligence artificielle, par Robert Scales, publié par Holistic Hybrid inc. Partage et adaptation permis selon la licence CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/) : citez le guide, mettez un lien vers https://guidetoartificialintelligence.com/fr/apprendre/chercher-documents-plongements-mesure/, pas d’usage commercial sans permission, et gardez la même licence.
