Sofortantwort
Query Expansion einfach erklärt
Suchanfragen werden automatisch erweitert oder umformuliert, damit mehr relevante Dokumente gefunden werden.
- Kurz gesagt
- Erweitert Suchanfragen mit Synonymen, verwandten Begriffen oder Umformulierungen
- Typischer Einsatz
- RAG-Systeme, Enterprise-Suche, Chatbots
- Wichtig zu wissen
- Verbessert Recall in RAG-Systemen signifikant bei geringem Mehraufwand
Query Expansion im Überblick
Wenn ein Nutzer in einem KI-System nach etwas sucht, ist die ursprüngliche Anfrage oft zu kurz, zu vage oder nutzt andere Begriffe als die gespeicherten Dokumente. Query Expansion löst genau dieses Problem: Die Anfrage wird automatisch erweitert oder umformuliert, bevor die eigentliche Suche startet.
Ein einfaches Beispiel: Die Anfrage „Kosten senken” wird zu „Kosten senken, Ausgaben reduzieren, Budget optimieren, Effizienz steigern” – all das beschreibt dasselbe Ziel, aber mit unterschiedlichen Wörtern. Das System findet damit deutlich mehr relevante Dokumente.
Die vier wichtigsten Techniken:
| Technik | Wie es funktioniert | Bestes für |
|---|---|---|
| Synonym Expansion | Klassische Thesaurus-Suche | Einfache Keyword-Systeme |
| Query Rewriting | LLM formuliert Anfrage um | Vage Nutzerfragen |
| Multi-Query | LLM erzeugt 3–5 Varianten | RAG mit hohem Recall-Bedarf |
| HyDE | LLM generiert hypothetisches Dokument | Technische Wissensbasen |
Technisch betrachtet
Multi-Query Retrieval
Das LLM erzeugt mehrere Varianten der ursprünglichen Anfrage, jede wird separat ausgeführt, die Ergebnisse werden dedupliziert und zusammengeführt:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
# Intern generiert das LLM z.B.:
# 1. "Wie funktioniert Gradient Descent?"
# 2. "Erklärung Optimierungsalgorithmus neuronale Netze"
# 3. "Backpropagation Gewichtsanpassung Schritt für Schritt"
docs = retriever.get_relevant_documents("Gradient Descent erklären")
HyDE (Hypothetical Document Embeddings)
Statt der kurzen Nutzeranfrage wird ein hypothetisches Antwortdokument generiert und als Suchvektor verwendet:
from langchain.chains import HypotheticalDocumentEmbedder
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
base_embeddings = OpenAIEmbeddings()
llm = ChatOpenAI(model="gpt-4o-mini")
# HyDE-Embedder generiert erst ein hypothetisches Dokument,
# dann wird dessen Embedding für die Vektorsuche genutzt
hyde_embeddings = HypotheticalDocumentEmbedder.from_llm(
llm=llm,
base_embeddings=base_embeddings,
custom_prompt="Schreibe einen kurzen Fachtext, der folgende Frage beantwortet: {question}"
)
# Die Suchanfrage wird intern zu einem ~200-Wort-Text expandiert
results = vectorstore.similarity_search_by_vector(
hyde_embeddings.embed_query("Was ist Overfitting?")
)
Step-Back Prompting
Eine weniger bekannte, aber effektive Variante: Die Anfrage wird auf eine abstraktere Ebene gehoben, bevor gesucht wird.
step_back_prompt = """
Du bist ein hilfreicher Assistent. Formuliere eine allgemeinere Frage,
die hilft, die folgende spezifische Frage zu beantworten.
Spezifische Frage: {question}
Allgemeinere Frage:"""
# "Welche Lernrate soll ich für GPT-2 Fine-Tuning nehmen?"
# → "Wie wählt man Hyperparameter beim Fine-Tuning von Sprachmodellen?"
Wann welche Methode?
- Synonym Expansion: Einfach, deterministisch, kein LLM nötig – gut für Produktsuche
- Query Rewriting: Wenn Nutzersprache stark von Dokumentsprache abweicht
- Multi-Query: Wenn Recall wichtiger ist als Latenz (akzeptiert 3–5× mehr LLM-Calls)
- HyDE: Wenn Anfragen sehr kurz sind und Dokumente ausführliche Texte sind
- Step-Back: Wenn Anfragen sehr spezifisch sind und allgemeines Hintergrundwissen benötigt wird