Vingt-quatre questions posées à l'identique en français, anglais, arabe standard et darija, contre 157 passages français issus du site public d'une banque marocaine. Le français, l'anglais et l'arabe standard se tiennent entre 79 % et 88 %. Le darija tapé en caractères latins tombe à 17 %.
Le protocole tient en une phrase : même question, même passage attendu, seule la langue change.
Une banque marocaine publie sa documentation en français. Ses clients écrivent en français, en anglais, en arabe standard, et en darija — que la plupart tapent en caractères latins. La question est de savoir si le système retrouve encore le bon document quand la langue de la question s'éloigne de celle des documents.
Le contenu est public : aucune donnée personnelle, aucun accès authentifié, aucun système en production n'a été sollicité.
Hit@1 : le bon document arrive-t-il en première position. MRR : position moyenne inversée, 1,0 signifie toujours premier.
| Langue de la question | Hit@1 | Hit@3 | Hit@5 | MRR | Similarité | vs FR |
|---|---|---|---|---|---|---|
| Français référence | 83,3 % | 87,5 % | 91,7 % | 0,869 | 0,694 | — |
| Anglais | 79,2 % | 87,5 % | 91,7 % | 0,855 | 0,664 | −4,2 |
| Arabe standard | 87,5 % | 95,8 % | 95,8 % | 0,921 | 0,653 | +4,2 |
| Darija car. arabes | 54,2 % | 79,2 % | 79,2 % | 0,680 | 0,550 | −29,2 |
| Darija car. latins | 16,7 % | 50,0 % | 62,5 % | 0,354 | 0,475 | −66,7 |
La langue n'est pas un problème jusqu'au darija. Français, anglais et arabe standard se tiennent dans un mouchoir : sur 24 questions, 4,2 points représentent une seule question. Un assistant annoncé « français et anglais » n'a pas d'écart multilingue significatif.
L'écart apparaît avec le darija, et double lorsqu'il est écrit en caractères latins — wach ne9der nhel 7sab, avec des chiffres pour les sons arabes sans équivalent latin. C'est la forme que les clients tapent réellement dans une fenêtre de chat.
Le corpus compte 157 passages. La position du bon document décide de ce que le modèle reçoit.
Les autres écarts relevés suivent le même motif : le taux du crédit consommation passe du rang 1 au rang 45, le différé de remboursement du rang 5 au rang 47, le retrait sans carte du rang 15 au rang 77.
Ces échecs ne remontent nulle part. Le système ne tombe pas en panne, la latence ne bouge pas, aucune erreur n'est journalisée. Le modèle reçoit un document non pertinent, récupéré avec assurance, et rédige une réponse dessus.
Le chiffre qui concerne tout le monde, quelles que soient les langues prises en charge.
Sur les questions françaises posées à des documents français, 4 sur 24 ne placent pas le bon passage en tête, et trois l'enterrent au-delà du rang 5 : retrait au guichet sans carte au rang 15, délai de réponse crédit au rang 10, différé de remboursement au rang 5.
C'est pourtant le cas favorable : du contenu marketing court et riche en mots-clés, avec des questions rédigées pour être répondables. Une base de procédures internes, plus longue et plus spécialisée, se comporte moins bien.
Les deux écarts n'ont pas la même cause, donc pas le même remède.
L'écart au Hit@3 n'est que de 8,3 points contre 29,2 au Hit@1. Le bon document est souvent présent, mais pas en tête. Transmettre les 3 à 5 meilleurs passages au modèle plutôt que le premier seul récupère l'essentiel de la perte.
Ici le même réglage ne suffit pas : l'écart reste de 37,5 points au Hit@3 et 29,2 au Hit@5. La translittération n'est pas une traduction approximative. masarif n'est ni un mot français ni une chaîne arabe : le tokeniseur le découpe en fragments qui n'ont de sens dans aucune langue vue à l'entraînement. La piste est de normaliser le script avant la vectorisation, ce qui relève du développement et non du paramétrage.
Trois raisons de penser qu'un système réel fait moins bien, pas mieux.
Ce que cette mesure ne montre pas, et ne prétend pas montrer.
Le corpus se reconstruit depuis les pages publiques, la mesure se rejoue ensuite hors ligne.
# reconstruire le corpus depuis les pages publiques python build_corpus.py → 40 pages, 157 passages # vectoriser et scorer les 24 questions x 5 formes python run_bench.py → Hit@1, Hit@3, Hit@5, MRR, similarité
Les vecteurs sont mis en cache localement : la première exécution coûte environ 180 appels de vectorisation, les suivantes sont quasi gratuites. Le script de mesure lève une erreur lorsqu'une vectorisation échoue, au lieu de retourner un vecteur nul qui produirait un score net et faux.
Le code et le jeu de questions sont disponibles sur demande.