La recherche vectorielle retrouve l’idée, pas nécessairement le bon document
Le document contient la réponse, mais la personne n’utilise pas les mêmes mots pour la chercher. La recherche vectorielle aide justement à rapprocher des formulations. Elle ne sait pas automatiquement quelle version fait autorité ni si le passage répond vraiment.
À l’indexation, le système extrait le texte, le découpe en morceaux, conserve titre/version/droits, puis envoie chaque morceau à un modèle d’embedding. Le résultat est un vecteur de centaines ou milliers de nombres. La question passe par le même modèle. Une similarité cosinus compare l’angle :
cosinus(q, d) = (q · d) / (||q|| × ||d||)
Une valeur plus élevée indique une direction proche dans l’espace appris, pas une preuve logique. Un numéro AX-4182 et AX-4183 peut changer une pièce sans déplacer beaucoup le sens. Un index lexical reste meilleur pour l’identifiant exact.
Chercher chaque vecteur dans un million de passages coûte cher. Un index de voisins approximatifs, comme HNSW, construit un graphe navigable : la requête explore rapidement des nœuds prometteurs au lieu de calculer toutes les distances. Ce compromis échange mémoire, temps et parfois rappel; le bon passage peut être manqué si les paramètres sont trop agressifs.
question → embedding ─┐
├→ candidats vectoriels ─┐
question → mots-clés ─┘ ├→ fusion/reranking
filtres version/droits/date ───────────────────┘
→ passages pour RAG
Le découpage décide ce qu’on peut retrouver
Un morceau trop court perd le contexte; trop long dilue le concept et gaspille la fenêtre du modèle. Je testerais 300, 600 et 1 000 tokens avec chevauchement, en gardant les titres et sections. Les tableaux, listes et pages scannées ont besoin d’une extraction adaptée. L’OCR peut confondre 0 et O, donc le texte original et la page restent disponibles.
Une recherche hybride combine score lexical et vectoriel, puis un reranker évalue les meilleurs candidats ensemble avec la question. Les filtres excluent brouillons et anciennes versions. Les permissions s’appliquent avant de remettre les passages au grand modèle; lui demander d’ignorer un secret qu’il a déjà reçu serait une mauvaise frontière.
Mon jeu d’évaluation contient au moins :
- synonymes et paraphrases;
- identifiants exacts et numéros proches;
- bonne réponse dans une vieille et une nouvelle version;
- question qui combine deux sections;
- document non accessible au compte de test;
- question sans réponse dans le corpus;
- passage contenant une instruction malveillante;
- contenu français et anglais équivalent.
Je mesure Recall@k : la bonne source est-elle parmi les k résultats? Puis j’évalue citation, fidélité et abstention de la réponse. Une mauvaise récupération ne peut pas être réparée de façon fiable par une meilleure consigne. Les questions sans réponse doivent produire « source insuffisante », pas une réponse générale du modèle.
Changer de modèle d’embedding exige de recalculer l’index; mélanger les espaces de deux versions rend les distances incohérentes. Je versionne modèle, découpage et index, reconstruis en parallèle, rejoue les tests puis bascule. Une panne garde la recherche lexicale comme repli et n’expose jamais un index incomplet sans indication de fraîcheur.
La pratique est de garder mots exacts, vecteurs, métadonnées et droits dans le même design. Je veux voir le passage, la version et le score, puis ouvrir la source. Retrouver une idée est une excellente première étape; choisir le document officiel et savoir quand il ne répond pas restent des fonctions séparées.