Query-Rewriting und HyDE
Den Retrieval-Recall verbessern
Query-Rewriting und HyDE ist eine kostenlose AI Prompt Engineering-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Prompt Engineering-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Die Query ist das schwächste Glied
Die Retrieval-Qualität ist durch die Query begrenzt. Rohe Benutzer-Queries sind oft kurz, mehrdeutig, voller Pronomen oder anders formuliert als die Dokumente. Query-Transformation formt die Query vor dem Retrieval um, um Recall und Präzision zu erhöhen.
Dies ist eine der kostengünstigsten Maßnahmen mit dem größten Hebel gegenüber naivem RAG: Wenn Sie die Query verbessern, profitieren alle nachgelagerten Stufen.
def transform_query(raw, history):
# Resolve references, expand, decompose, or hypothesize
# BEFORE embedding and retrieving.
return rewrite(raw, history)Query-Umschreibung
Die einfachste Transformation: Ein LLM schreibt die Benutzer-Query in eine klarere, in sich geschlossene und retrievalfreundliche Form um. Es korrigiert Tippfehler, erweitert Abkürzungen und entfernt Gesprächsrauschen.
Das ist besonders in Multi-Turn-Chats wichtig, in denen die letzte Nachricht ohne Kontext unverständlich ist („Wie sieht es mit dem zweiten aus?“).
def rewrite_query(raw):
prompt = (
'Rewrite the user question into a clear, standalone search '
'query optimized for document retrieval. Keep key entities.\n'
'Question: ' + raw
)
return llm(prompt, temperature=0).strip()Konversationelle Verdichtung
Verdichten Sie bei Chat-RAG den Dialog und den neuen Gesprächsbeitrag zu einer einzigen eigenständigen Frage. Ohne diesen Schritt machen Pronomen und Auslassungen die Embedding-Repräsentation bedeutungslos und das Retrieval bricht zusammen.
Übergeben Sie die vorherigen Gesprächsbeiträge, damit der Umschreiber „es“, „das“ oder „das vorherige“ in explizite Entitäten auflösen kann, die der Retriever abgleichen kann.
def condense(history, follow_up):
prompt = (
'Given the conversation, rewrite the follow-up as a standalone '
'question with all references resolved.\nConversation:\n' +
render(history) + '\nFollow-up: ' + follow_up
)
return llm(prompt, temperature=0).strip()Query-Erweiterung
Erweiterung erzeugt Synonyme, verwandte Begriffe oder alternative Formulierungen, um die lexikalische und semantische Abdeckung zu vergrößern. Sie wirkt einem Vokabular-Mismatch entgegen: Das Dokument sagt „invalidate“, der Benutzer sagt „revoke“.
Erweitern Sie für das Retrieval und führen Sie anschließend das Retrieval mit der Vereinigung durch. Zeigen Sie dem Benutzer die erweiterte Form nicht an. Achten Sie auf eine übermäßige Erweiterung, durch die themenfremde Ergebnisse abgerufen werden können.
def expand(query, n=3):
prompt = (
'List ' + str(n) + ' alternative phrasings of this query using '
'synonyms and domain terms, one per line.\n' + query
)
variants = parse_lines(llm(prompt, temperature=0.5))
return [query] + variantsMulti-Query-Retrieval
Erzeugen Sie mehrere unterschiedliche Umformulierungen, führen Sie für jede ein Retrieval durch und führen Sie die Ergebnislisten zusammen (Reciprocal Rank Fusion). Unterschiedliche Formulierungen bringen unterschiedliche relevante Chunks zum Vorschein; die Zusammenführung vereint ihre Stärken und stabilisiert den Recall.
Dafür sind zusätzliche Retrieval-Aufrufe erforderlich, im Gegenzug wird das Verfahren robuster gegenüber jeder einzelnen ungünstigen Formulierung.
def multi_query(raw, n=4):
queries = expand(raw, n)
rankings = [dense_retrieve(q, 30) for q in queries]
fused = rrf(*rankings)
return dedup(fused)Query-Dekomposition
Komplexe Multi-Hop-Fragen müssen in Teilfragen zerlegt werden, für die jeweils ein eigenes Retrieval durchgeführt wird, bevor die Ergebnisse zusammengeführt werden. Die Frage, welcher CEO des Unternehmens, das X übernommen hat, älter ist als ..., kann nicht durch ein einziges Retrieval beantwortet werden.
Zerlegen Sie die Frage, führen Sie für jede Teilfrage ein Retrieval durch und lassen Sie den Generator die gesammelten Belege zusammenführen.
def decompose_and_retrieve(question):
subs = parse_lines(llm(
'Break this into independent sub-questions, one per line.\n' +
question, temperature=0))
evidence = {s: rerank(s, dense_retrieve(s, 30))[:3] for s in subs}
return evidence # generator synthesizes the final answerHyDE: Die Grundidee
HyDE (Hypothetical Document Embeddings, Gao et al., 2022) stellt das Problem auf den Kopf. Statt die kurze Query einzubetten, bittet es das LLM, ein hypothetisches Antwortdokument zu generieren, bettet anschließend dieses ein und führt damit das Retrieval durch.
Das hypothetische Dokument verwendet dasselbe Sprachregister wie echte Dokumente. Daher liegt sein Embedding näher an echten Antworten, wodurch der Query-Dokument-Mismatch behoben wird.
def hyde(query):
hypo = llm(
'Write a short passage that would answer this question, as if '
'from a reference document.\nQuestion: ' + query,
temperature=0.3)
return dense_retrieve_by_vector(embed(hypo), k=30) # embed the answerWarum HyDE den Recall verbessert
Eine Frage und ihre Antwort sind unterschiedlich formuliert; eine Frage und eine erfundene, aber plausible Antwort ähneln in ihrer Formulierung der echten Antwort. HyDE nutzt das generative Vorwissen des LLM, um diese Lücke zu überbrücken, selbst wenn das hypothetische Dokument faktische Fehler enthält.
Die Korrektheit des hypothetischen Dokuments ist kaum entscheidend: Es benötigt lediglich das richtige Vokabular und die richtige Struktur, um im Embedding-Raum in die Nähe echter Dokumente zu gelangen.
# Robustness: average several hypothetical docs to reduce variance
def hyde_avg(query, n=3):
vecs = [embed(llm(HYDE_PROMPT + query, temperature=0.5))
for _ in range(n)]
centroid = sum(vecs) / n
return dense_retrieve_by_vector(centroid, 30)HyDE-Abwägungen und Fehlermodi
HyDE fügt vor dem Retrieval eine LLM-Generierung hinzu, wodurch Latenz und Kosten steigen. Außerdem kann es ein halluziniertes hypothetisches Dokument erzeugen, das vom Thema abweicht. Das verschlechtert den Recall bei Nischen- oder Out-of-Distribution-Queries, über die das Modell nichts weiß.
Mindern Sie dieses Risiko, indem Sie HyDE-Vektor-Retrieval per Fusion mit Retrieval anhand der Roh-Query kombinieren, sodass ein schlechtes hypothetisches Dokument den Recall nicht vollständig zunichtemachen kann.
def hyde_hybrid(query):
a = dense_retrieve_by_vector(embed(hyde_doc(query)), 30)
b = dense_retrieve(query, 30) # raw-query fallback
return dedup(rrf(a, b)) # robust to bad hypotheticalsTechniken auswählen und kombinieren
Diese Transformationen ergänzen sich. Verwenden Sie Verdichtung für Chat, Erweiterung/Multi-Query bei Vokabularlücken, Dekomposition für Multi-Hop-Fragen und HyDE bei einem Mismatch zwischen dem Sprachregister von Frage und Dokument. Viele Produktions-Stacks verketten zunächst die Verdichtung, wenden dann HyDE an, führen anschließend eine Fusion mit der Roh-Query durch und starten danach das Re-Ranking.
Jede zusätzliche Transformation verursacht einen LLM-Aufruf. Steuern Sie sie daher nach dem Query-Typ, statt immer alle auszuführen.
def route_transform(query, history, qtype):
q = condense(history, query) if history else query
if qtype == 'multi_hop': return decompose_and_retrieve(q)
if qtype == 'mismatch': return hyde_hybrid(q)
if qtype == 'vocab_gap': return multi_query(q)
return dense_retrieve(q, 30)Transformationen bewerten
Messen Sie jede Transformation anhand ihres Zugewinns beim retrieval recall@k und bei der Genauigkeit der endgültigen Antwort gegenüber der unveränderten Suchanfrage auf einem leckagefreien Datensatz. Erfassen Sie die zusätzliche Latenz und die LLM-Kosten, damit Sie nur Transformationen behalten, die sich lohnen.
Achtung: Eine Transformation, die den Recall verbessert, aber Ablenkungen hinzufügt, kann die Antwortgenauigkeit verringern, wenn sie nicht mit Re-Ranking und Komprimierung kombiniert wird.
def eval_transform(name, fn, eval_set):
return {
'recall@10': recall_at_k(eval_set, retriever=fn, k=10),
'answer_acc': answer_accuracy(eval_set, retriever=fn),
'extra_latency_ms': transform_latency(fn),
}Kurztest
Überlegen Sie, warum HyDE trotz unvollkommener hypothetischer Antworten funktioniert.
Zusammenfassung
Wichtigste Erkenntnisse:
- Die Retrieval-Leistung ist durch die Suchanfrage begrenzt; ihre Transformation ist ein kostengünstiges RAG-Upgrade mit großer Wirkung.
- Umschreiben und Kondensieren machen Chat-Anfragen eigenständig; Expansion und Multi-Query schließen Lücken im Vokabular.
- Dekomposition bewältigt Multi-Hop-Fragen, indem für jede Teilfrage separat abgerufen wird.
- HyDE bettet eine hypothetische Antwort ein, um die Diskrepanz zwischen dem sprachlichen Register der Frage und dem des Dokuments zu überbrücken; die hypothetische Antwort muss nicht korrekt sein.
- Kombinieren Sie Transformationen je nach Anfragetyp, fusionieren Sie sie für Robustheit mit der unveränderten Suchanfrage und bewerten Sie Recall, Antwortgenauigkeit, Latenz und Kosten.
Häufig gestellte Fragen
Ist die Lektion „Query-Rewriting und HyDE“ kostenlos?
Ja — der vollständige Text von „Query-Rewriting und HyDE“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Prompt Engineering-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Prompt Engineering-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Query-Rewriting und HyDE“?
Den Retrieval-Recall verbessern Du übst AI Prompt Engineering mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Prompt Engineering zu starten?
Keine Vorkenntnisse erforderlich. AI Prompt Engineering auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Query-Rewriting und HyDE“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Prompt Engineering-Lektion Code schreiben und ausführen?
Ja. Jede AI Prompt Engineering-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Über naives RAG hinaus
- Abgerufene Chunks neu bewerten
- Kontextkomprimierung
- Query-Rewriting und HyDE