Omskrivning af forespørgsler og HyDE
Forbedr retrieval-recall.
Omskrivning af forespørgsler og HyDE er en gratis Promptteknik til AI-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Promptteknik til AI, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Promptteknik til AI-kurset indeholder 4 lektioner i alt.
Forespørgslen er det svage led
Søgekvaliteten er begrænset af forespørgslen. Rå brugerforespørgsler er ofte korte, tvetydige, fulde af stedord eller formuleret anderledes end dokumenterne. Transformation af forespørgslen ændrer forespørgslen før søgningen for at øge genfinding og præcision.
Det er en af de billigste forbedringer med størst effekt sammenlignet med naiv RAG: Ret forespørgslen, så får alle efterfølgende faser fordel af det.
def transform_query(raw, history):
# Resolve references, expand, decompose, or hypothesize
# BEFORE embedding and retrieving.
return rewrite(raw, history)Omskrivning af forespørgslen
Den enkleste transformation er, at en LLM omskriver brugerens forespørgsel til en tydeligere, selvstændig og søgevenlig formulering. Den retter slåfejl, udfolder forkortelser og fjerner samtalestøj.
Det er især vigtigt i chat med flere beskeder, hvor den seneste besked er uforståelig uden kontekst (Hvad med den anden?).
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()Samtalekondensering
I chat-RAG skal du kondensere dialogen og den nye besked til ét selvstændigt spørgsmål. Uden dette gør stedord og ellipser indlejringen meningsløs, og søgningen bryder sammen.
Giv omskriveren de tidligere beskeder, så den kan omsætte stedord som den, det og den forrige til eksplicitte entiteter, som søgemaskinen kan matche.
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()Udvidelse af forespørgslen
Udvidelse genererer synonymer, relaterede termer eller alternative formuleringer for at øge den leksikalske og semantiske dækning. Det bekæmper uoverensstemmelser i ordforrådet: Dokumentet siger invalidér, mens brugeren siger tilbagekald.
Udvid til søgningen, og søg derefter i den samlede mængde resultater. Vis ikke den udvidede formulering til brugeren. Vær opmærksom på overudvidelse, som kan hente uvedkommende resultater.
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] + variantsSøgning med flere forespørgsler
Generér flere forskellige omformuleringer, søg med hver af dem, og sammenflet resultatlisterne (fusion af reciprok rangering). Forskellige formuleringer finder forskellige relevante tekststykker; sammenfletningen kombinerer deres styrker og stabiliserer genfindingen.
Det kræver flere søgninger, men gør systemet mere robust over for en enkelt dårlig formulering.
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)Opdeling af forespørgslen
Komplekse spørgsmål med flere trin kræver opdeling i delspørgsmål, som hver især søges efter, hvorefter resultaterne samles. Spørgsmålet om, hvilken administrerende direktør i den virksomhed, der opkøbte X, der er ældre end ..., kan ikke besvares med én søgning.
Opdel spørgsmålet, søg efter hvert delspørgsmål, og lad generatoren samle det indsamlede belæg.
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: Grundideen
HyDE (Hypothetical Document Embeddings, Gao et al., 2022) vender problemet på hovedet. I stedet for at indlejre den korte forespørgsel beder den LLM'en om at generere et hypotetisk svardokument, indlejrer derefter dokumentet og søger med det.
Det hypotetiske dokument bruger samme sproglige register som virkelige dokumenter, så dets indlejring ligger tættere på ægte svar og løser misforholdet mellem forespørgsel og dokument.
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 answerHvorfor HyDE forbedrer genfinding
Et spørgsmål og dets svar er formuleret forskelligt; et spørgsmål og et falsk, men plausibelt svar ligner i formuleringen det virkelige svar. HyDE udnytter LLM'ens generative forhåndsviden til at bygge bro over denne forskel, selv hvis det hypotetiske dokument indeholder faktuelle fejl.
Det hypotetiske dokuments korrekthed betyder ikke så meget: Det skal blot have det rigtige ordforråd og den rigtige struktur for at placere sig tæt på ægte dokumenter i indlejringsrummet.
# 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: Afvejninger og fejltilstande
HyDE tilføjer en LLM-generering før søgningen, hvilket øger latenstid og omkostninger, og kan hallucinere et hypotetisk dokument, der bevæger sig væk fra emnet. Det skader genfindingen for nicheforespørgsler eller forespørgsler uden for fordelingen, som modellen ikke kender.
Afhjælp dette ved at kombinere søgning med HyDE-vektorer og søgning med den rå forespørgsel via fusion, så et dårligt hypotetisk dokument ikke kan ødelægge genfindingen fuldstændigt.
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 hypotheticalsValg og kombination af teknikker
Disse transformationer supplerer hinanden. Brug kondensering til chat, udvidelse/flere forespørgsler ved mangler i ordforrådet, dekomponering til forespørgsler med flere hop og HyDE ved forskel på spørgsmålets og dokumentets sproglige register. Mange produktionsstakke kæder først kondensering og derefter HyDE sammen med den rå forespørgsel, hvorefter de omrangerer resultaterne.
Hver ekstra transformation koster et LLM-kald, så aktivér dem kun ud fra forespørgselstypen i stedet for altid at køre dem alle.
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)Evaluering af transformationer
Mål hver transformation ud fra dens forbedring af hentningsrecall@k og nøjagtigheden af det endelige svar sammenlignet med den rå forespørgsel på et lækagefrit datasæt. Følg den ekstra latenstid og LLM-omkostningen, så du kun beholder transformationer, der kan betale sig.
Vær opmærksom på, at en transformation, der forbedrer recall, men tilføjer distraktorer, kan sænke svarnøjagtigheden, medmindre den kombineres med genrangering og komprimering.
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),
}Hurtigt tjek
Overvej, hvorfor HyDE virker trods ufuldkomne hypotetiske svar.
Opsummering
Vigtigste pointer:
- Hentning er begrænset af forespørgslen; en transformation af den er en billig RAG-opgradering med stor effekt.
- Omskrivning og kondensering gør chatforespørgsler selvstændige; udvidelse og flere forespørgsler afhjælper huller i ordforrådet.
- Dekomponering håndterer flertrins spørgsmål ved at hente resultater for hvert delspørgsmål.
- HyDE indlejrer et hypotetisk svar for at bygge bro over forskellen mellem spørgsmålets og dokumentets sproglige register; det hypotetiske svar behøver ikke være korrekt.
- Kombiner transformationer efter forespørgselstype, flet dem sammen med den rå forespørgsel for større robusthed, og evaluer recall, svarnøjagtighed, latenstid og omkostninger.
Lær Promptteknik til AI med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 53
- Lektioner
- 199
Ofte stillede spørgsmål
Er lektionen “Omskrivning af forespørgsler og HyDE” gratis?
Ja — alle 3 lektioner i læringssporet Promptteknik til AI, inklusive “Omskrivning af forespørgsler og HyDE”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Promptteknik til AI-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Omskrivning af forespørgsler og HyDE”?
Forbedr retrieval-recall. Du øver dig i Promptteknik til AI med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Promptteknik til AI?
Der kræves ingen tidligere erfaring. Promptteknik til AI på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Omskrivning af forespørgsler og HyDE”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Promptteknik til AI-lektion?
Ja. Alle Promptteknik til AI-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Ud over naiv RAG
- Omrangering af hentede chunks
- Komprimering af kontekst
- Omskrivning af forespørgsler og HyDE