Contextual Retrieval
La récupération contextuelle ajoute à chaque fragment une note rédigée par un LLM qui précise où il se trouve dans le document, afin que les embeddings et BM25 retrouvent les bons passages.
La récupération contextuelle est une technique d’indexation pour la génération augmentée par récupération (RAG) dans laquelle un grand modèle de langage (LLM) lit chaque document dans son intégralité et rédige une courte note, généralement de 50 à 100 jetons, qui situe un segment dans le document. Cette note est ajoutée au début du segment avant que celui-ci soit vectorisé et ajouté à un index de mots-clés ; la recherche peut ainsi faire ressortir des informations que le segment seul n’énonce pas. Anthropic a présenté la récupération contextuelle en septembre 2024.
Le problème résolu#
Les pipelines RAG divisent les documents en segments suffisamment petits pour être vectorisés avec précision et pour que plusieurs puissent tenir dans la fenêtre de contexte d’un modèle. Or, extrait de son document, un segment perd souvent les faits qui permettent de le retrouver. L’exemple d’Anthropic est un segment issu d’un dépôt financier : « Le chiffre d’affaires de l’entreprise a augmenté de 3 % par rapport au trimestre précédent. » Il ne précise ni le nom de l’entreprise ni le trimestre ; une question sur le chiffre d’affaires d’ACME au T2 2023 ne peut donc pas le faire ressortir, que ce soit par les représentations vectorielles ou par la recherche par mots-clés. La récupération contextuelle le stocke sous la forme suivante : « Ce segment provient d’un dépôt auprès de la SEC concernant les résultats d’ACME Corp au T2 2023 ; le chiffre d’affaires du trimestre précédent était de 314 millions de dollars. Le chiffre d’affaires de l’entreprise a augmenté de 3 % par rapport au trimestre précédent. »
Les recadrages d’objets perdent leur contexte de la même manière que les segments de texte. La solution de recadrage d’objets d’Ultralytics exécute YOLO26 sur des images ou des vidéos et enregistre chaque détection dans un fichier distinct, crop_1.jpg, crop_2.jpg, etc. Un recadrage peut ainsi montrer un camion sans indiquer de quelle caméra, de quel site ou de quelle scène il provient. L’indexation de chaque recadrage avec un court préfixe décrivant son image source — par exemple le nom de la caméra, l’heure et les autres objets détectés à proximité — rétablit ce contexte pour la recherche par mots-clés et la recherche sémantique.
Fonctionnement de la récupération contextuelle#
Pour chaque segment, le LLM reçoit le document complet et le segment, puis doit « fournir un bref contexte concis pour situer ce segment dans le document dans son ensemble, afin d’améliorer sa récupération lors des recherches ». Anthropic a utilisé Claude 3 Haiku avec la mise en cache des prompts, qui traite chaque document une seule fois et le réutilise pour tous ses segments. Le coût unique a été estimé à 1,02 $ par million de jetons de document. Les segments contextualisés sont ajoutés à un index de représentations vectorielles (« représentations vectorielles contextualisées ») et à un index de mots-clés BM25 (« BM25 contextualisé »). Au moment de la requête, les deux index sont interrogés et leurs résultats fusionnés, comme dans une recherche hybride, puis un réordonnanceur évalue les 150 meilleurs résultats et les 20 meilleurs segments sont intégrés au prompt.
L’intégration au modèle du segment d’exemple, avec et sans son contexte, montre l’effet sur la recherche vectorielle :
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Anthropic's example chunk and the context an LLM wrote for it from the full filing
chunk = "The company's revenue grew by 3% over the previous quarter."
context = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million."
other = "Globex Corporation reported that Q2 2023 revenue fell 2% on weaker demand."
query = "How did ACME's revenue change in Q2 2023?"
candidates = {"plain chunk": chunk, "contextual chunk": f"{context} {chunk}", "Globex chunk": other}
# Cosine similarity of the query to each indexed text
scores = model.similarity(model.encode(query), model.encode(list(candidates.values())))[0]
for name, score in zip(candidates, scores):
print(f"{name}: {score:.2f}")Le segment brut obtient un score de 0.49 par rapport à la question, soit le même score qu’un segment portant sur une autre entreprise. Avec son contexte ajouté au début, il obtient un score de 0.83 et arrive largement en première position.
Récupération contextuelle et techniques apparentées#
- Découpage tardif : donne à l’intégration de chaque segment le contexte du document grâce au mécanisme d’attention du modèle d’intégration, sans appel au LLM par segment. Le texte stocké du segment reste inchangé, les recherches par mots-clés n’y gagnent donc rien.
- Découpage sémantique : détermine où commencent et se terminent les segments. Il se combine à la récupération contextuelle, qui complète ce que chaque segment laisse sous-entendu.
- Préfixes de titre et de rubrique : une pratique plus ancienne et moins coûteuse qui consiste à ajouter le même titre de document ou la même rubrique au début de chaque segment. La récupération contextuelle rédige une note différente pour chaque segment.
- Ingénierie du contexte : pratique plus générale qui consiste à décider ce qui entre dans la fenêtre de contexte d’un modèle au moment de l’inférence. La récupération contextuelle intervient une étape plus tôt, sur ce qui est indexé.
Gains mesurés#
Anthropic a mesuré l’échec de la récupération comme étant égal à 1 moins le rappel@20, soit la proportion de requêtes dont le segment pertinent était absent des 20 premiers résultats. Le pipeline de référence échouait pour 5,7 % des requêtes. Les intégrations contextuelles ont ramené ce taux à 3,7 %, soit une réduction de 35 %, et l’ajout de BM25 contextuel l’a ramené à 2,9 %, soit une réduction de 49 %. Le reclassement des résultats combinés a porté le taux d’échec à 1,9 %, soit une réduction de 67 % par rapport à la référence.










