Contextual Retrieval
Beim kontextbezogenen Retrieval wird jedem Abschnitt eine von einem LLM verfasste Notiz vorangestellt, die angibt, wo sich der Abschnitt im Dokument befindet. So finden Embeddings und BM25 die passenden Textstellen.
Kontextbezogener Abruf ist eine Indexierungstechnik für Retrieval-Augmented Generation (RAG). Dabei liest ein großes Sprachmodell (LLM) jedes vollständige Dokument und verfasst eine kurze Notiz, meist mit 50 bis 100 Token, die einen Textabschnitt in den Kontext des Dokuments einordnet. Die Notiz wird dem Abschnitt vorangestellt, bevor dieser eingebettet und einem Stichwortindex hinzugefügt wird. So kann die Suche Informationen finden, die im Abschnitt allein nicht genannt werden. Anthropic führte den kontextbezogenen Abruf im September 2024 ein.
Das zugrunde liegende Problem#
RAG-Pipelines teilen Dokumente in Abschnitte auf, die klein genug für präzise Einbettungen und für die Aufnahme mehrerer Abschnitte in das Kontextfenster eines Modells sind. Ein aus seinem Dokument herausgelöster Abschnitt verliert jedoch oft die Fakten, die ihn auffindbar machen. Anthropic nennt als Beispiel einen Abschnitt aus einem Finanzbericht: „Der Umsatz des Unternehmens stieg gegenüber dem Vorquartal um 3 %.“ Der Abschnitt nennt weder das Unternehmen noch das Quartal. Daher kann er weder eine Frage zum Umsatz von ACME im zweiten Quartal 2023 beantworten noch bei einer Suche über Einbettungen oder Stichwörter gefunden werden. Beim kontextbezogenen Abruf wird der Text so gespeichert: „Dieser Abschnitt stammt aus einem SEC-Bericht zur Geschäftsentwicklung der ACME Corp. im zweiten Quartal 2023. Der Umsatz im Vorquartal betrug 314 Millionen US-Dollar. Der Umsatz des Unternehmens stieg gegenüber dem Vorquartal um 3 %.“
Objektausschnitte verlieren auf dieselbe Weise ihren Kontext wie Textabschnitte. Die Lösung zum Ausschneiden von Objekten in Ultralytics führt YOLO26 auf Bildern oder Videos aus und speichert jede Erkennung als eigene Datei: crop_1.jpg, crop_2.jpg und so weiter. Ein Ausschnitt zeigt dann zwar einen Lastwagen, aber nicht, von welcher Kamera, welchem Standort oder welcher Szene er stammt. Wird jeder Ausschnitt mit einem kurzen Präfix indexiert, das sein Ausgangsbild beschreibt – etwa mit dem Kameranamen, der Uhrzeit und den weiteren erkannten Objekten in der Umgebung –, erhält die Stichwortsuche und die semantische Suche diesen Kontext zurück.
So funktioniert kontextbezogener Abruf#
Für jeden Abschnitt erhält das LLM das vollständige Dokument und den Abschnitt. Es soll „einen kurzen, prägnanten Kontext verfassen, der diesen Abschnitt in das Gesamtdokument einordnet und so das Auffinden des Abschnitts bei der Suche verbessert“. Anthropic nutzte Claude 3 Haiku mit Prompt-Caching. Dabei wird jedes Dokument einmal verarbeitet und für alle seine Abschnitte wiederverwendet. Die einmaligen Kosten betrugen laut Anthropic 1,02 US-Dollar pro Million Dokument-Token. Die kontextualisierten Abschnitte werden in einen Einbettungsindex („kontextbezogene Einbettungen“) und einen BM25-Stichwortindex („kontextbezogenes BM25“) aufgenommen. Bei einer Suchanfrage werden beide Indizes durchsucht und die Ergebnisse wie bei einer hybriden Suche zusammengeführt. Anschließend bewertet ein Reranker die 150 besten Kandidaten, und die 20 besten Abschnitte werden in die Eingabeaufforderung aufgenommen.
Ein Vergleich der Einbettung des Beispielabschnitts mit und ohne Kontext zeigt die Wirkung auf die Vektorsuche:
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}")Der einfache Abschnitt erreicht für die Frage einen Wert von 0,49 – genauso wie ein Abschnitt über ein anderes Unternehmen. Mit vorangestelltem Kontext erreicht er 0,83 und liegt mit deutlichem Abstand auf dem ersten Platz.
Kontextuelle Suche im Vergleich zu verwandten Techniken#
- Late Chunking: Gibt jedem Chunk über die Attention des Embedding-Modells den Dokumentkontext mit, ohne pro Chunk einen LLM-Aufruf auszuführen. Der gespeicherte Chunk-Text bleibt unverändert, sodass die Stichwortsuche keinen Vorteil erhält.
- Semantisches Chunking: Legt fest, wo Chunks beginnen und enden. Es lässt sich mit kontextueller Suche kombinieren, die ergänzt, was jeder Chunk unausgesprochen lässt.
- Titel- und Überschriftenpräfixe: Die günstigere, ältere Praxis, jedem Chunk denselben Dokumenttitel oder dieselbe Abschnittsüberschrift voranzustellen. Bei der kontextuellen Suche wird für jeden Chunk ein anderer Hinweis erstellt.
- Kontextgestaltung: Die umfassendere Praxis, festzulegen, was zum Inferenzzeitpunkt in das Kontextfenster eines Modells gelangt. Die kontextuelle Suche setzt einen Schritt früher an und betrifft die Inhalte, die indexiert werden.
Gemessene Verbesserungen#
Anthropic maß den Suchfehler als 1 minus Recall@20, also den Anteil der Suchanfragen, bei denen der relevante Chunk unter den 20 besten Treffern fehlte. Die Baseline-Pipeline scheiterte bei 5,7 % der Suchanfragen. Kontextuelle Embeddings senkten den Anteil auf 3,7 %, ein Rückgang um 35 %, und kontextuelles BM25 senkte ihn weiter auf 2,9 %, ein Rückgang um 49 %. Durch ein erneutes Ranking der kombinierten Ergebnisse sank die Fehlerquote auf 1,9 %, also um 67 % gegenüber der Baseline.










