Sorgu Yeniden Yazımı ve HyDE
Bilgi alma duyarlılığını artırma.
Sorgu Yeniden Yazımı ve HyDE, CoddyKit'te ücretsiz bir AI Prompt Engineering dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Prompt Engineering öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
Sorgu Zayıf Halkadır
Getirme kalitesi sorguyla sınırlıdır. Ham kullanıcı sorguları genellikle kısadır, belirsizdir, zamirlerle doludur veya belgelerdekinden farklı biçimde ifade edilir. Sorgu dönüştürme, geri çağırmayı ve kesinliği artırmak için getirmeden önce sorguyu yeniden şekillendirir.
Bu, basit RAG'e kıyasla en ucuz ve en yüksek getirili iyileştirmelerden biridir: sorguyu düzeltin, sonraki her aşama bundan yararlansın.
def transform_query(raw, history):
# Resolve references, expand, decompose, or hypothesize
# BEFORE embedding and retrieving.
return rewrite(raw, history)Sorguyu Yeniden Yazma
En basit dönüşüm şudur: bir LLM, kullanıcı sorgusunu daha açık, kendi başına anlaşılır ve getirmeye uygun bir biçimde yeniden yazar. Yazım hatalarını düzeltir, kısaltmaları açar ve konuşmaya özgü gereksiz gürültüyü kaldırır.
Bu, özellikle son mesajın bağlam olmadan anlaşılmadığı çok turlu sohbetlerde önemlidir (Peki ya ikincisi?).
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()Konuşma Yoğunlaştırması
Sohbet RAG'inde diyaloğu ve yeni turu tek bir bağımsız soruda yoğunlaştırın. Aksi hâlde zamirler ve eksiltili ifadeler gömmeyi anlamsız hâle getirir ve getirme çöker.
Önceki turları aktarın; böylece yeniden yazıcı o, şu ve önceki gibi ifadeleri getiricinin eşleştirebileceği açık varlıklara dönüştürebilir.
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()Sorgu Genişletme
Genişletme, sözlüksel ve anlamsal kapsamı genişletmek için eş anlamlılar, ilişkili terimler veya alternatif ifadeler üretir. Söz varlığı uyuşmazlığıyla mücadele eder: belgede geçersiz kılmak, kullanıcıda iptal etmek olarak ifade edilebilir.
Getirme için expand edin, ardından birleşimle getirme yapın; genişletilmiş biçimi kullanıcıya göstermeyin. Aşırı genişletmeye dikkat edin; bu, konu dışı sonuçların gelmesine neden olabilir.
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] + variantsÇoklu Sorgu Getirme
Birbirinden farklı birkaç yeniden ifade üretin, her biri için getirme yapın ve sonuç listelerini birleştirin (karşılıklı sıra birleştirmesi). Farklı ifadeler farklı ilgili parçaları ortaya çıkarır; birleştirme bunların güçlü yönlerini toplar ve geri çağırmayı daha kararlı hâle getirir.
Bu yaklaşım, tek bir kötü ifadeye karşı dayanıklılık için ek getirme çağrılarını göze alır.
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)Sorgu Ayrıştırma
Karmaşık, çok adımlı soruların alt sorulara ayrıştırılması, her biri için ayrı getirme yapılması ve ardından birleştirilmesi gerekir. X'i satın alan şirketin CEO'sunun kimden daha yaşlı olduğunu sormak, tek bir getirmeyle yanıtlanamaz.
Ayrıştırın, her alt soru için getirme yapın ve üreticinin toplanan kanıtları birleştirmesine izin verin.
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: Temel Fikir
HyDE (Varsayımsal Belge Gömüleri, Gao et al., 2022) sorunu tersine çevirir. Kısa sorguyu gömmek yerine LLM'den varsayımsal bir yanıt belgesi üretmesini ister, ardından bu belgeyi gömer ve onunla getirme yapar.
Varsayımsal belge, gerçek belgelerle aynı üsluptadır; bu nedenle gömmesi gerçek yanıtlara daha yakın konumlanır ve sorgu-belge uyuşmazlığını giderir.
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 answerHyDE Geri Çağırmayı Neden İyileştirir
Bir soru ve yanıtı farklı biçimde ifade edilir; bir soru ile sahte ama makul bir yanıt ise gerçek yanıta benzer biçimde ifade edilir. HyDE, varsayımsal metin olgusal hatalar içerse bile bu boşluğu kapatmak için LLM'nin üretici önselinden yararlanır.
Varsayımsal metnin doğruluğu çok önemli değildir: gömme uzayında gerçek belgelere yakın konumlanması için doğru söz varlığına ve yapıya sahip olması yeterlidir.
# 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'nin Ödünleri ve Hata Modları
HyDE, getirmeden önce bir LLM üretimi ekler; bu da gecikmeyi ve maliyeti artırır. Ayrıca konu dışına kayan bir varsayımsal metin halüsinasyonu üretebilir ve modelin hakkında hiçbir şey bilmediği niş veya dağılım dışı sorgularda geri çağırmayı düşürebilir.
Kötü bir varsayımsal metnin geri çağırmayı tamamen bozmasını önlemek için HyDE-vektör getirmesini ham sorgu getirmesiyle birleştirme yoluyla kullanın.
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 hypotheticalsTeknikleri Seçme ve Birleştirme
Bu dönüşümler birbirini tamamlar. Sohbet için yoğunlaştırma, söz varlığı boşlukları için genişletme/çoklu sorgu, çok adımlı sorular için ayrıştırma ve soru-belge üslup uyuşmazlığı için HyDE kullanın. Birçok üretim sistemi önce condense uygular, ardından HyDE kullanır, sonra ham sorguyla birleştirir ve yeniden sıralar.
Eklenen her dönüşüm bir LLM çağrısına mal olur; bu nedenle hepsini her zaman çalıştırmak yerine sorgu türüne göre devreye alın.
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)Dönüşümleri Değerlendirme
Her dönüşümü, sızıntısız bir kümede ham sorguya kıyasla geri getirme oranı@k kazanımı ve nihai yanıt doğruluğu üzerinden ölçün. Eklenen gecikmeyi ve LLM maliyetini izleyin; böylece yalnızca maliyetini karşılayan dönüşümleri tutun.
Dikkat: Geri getirmeyi iyileştirip dikkat dağıtıcı sonuçlar ekleyen bir dönüşüm, yeniden sıralama ve sıkıştırmayla eşleştirilmezse yanıt doğruluğunu düşürebilir.
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),
}Hızlı Kontrol
Kusurlu varsayımsal yanıtlarına rağmen HyDE'nin neden işe yaradığını düşünün.
Özet
Temel çıkarımlar:
- Bilgi getirme sorguyla sınırlıdır; sorguyu dönüştürmek ucuz ve etkisi yüksek bir RAG yükseltmesidir.
- Yeniden yazma ve yoğunlaştırma sohbet sorgularını bağımsız hâle getirir; genişletme ve çoklu sorgu, kelime dağarcığı boşluklarını giderir.
- Ayrıştırma, her alt soru için bilgi getirerek çok adımlı soruların üstesinden gelir.
- HyDE, soru ile belge arasındaki dil düzeyi uyumsuzluğunu gidermek için varsayımsal bir yanıtın vektör temsilini kullanır; varsayımın doğru olması gerekmez.
- Dönüşümleri sorgu türüne göre birleştirin, dayanıklılık için ham sorguyla kaynaştırın ve geri getirme oranını, yanıt doğruluğunu, gecikmeyi ve maliyeti değerlendirin.
Sıkça Sorulan Sorular
“Sorgu Yeniden Yazımı ve HyDE” dersi ücretsiz mi?
Evet — “Sorgu Yeniden Yazımı ve HyDE” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Prompt Engineering kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Prompt Engineering kursu toplamda 4 dersten oluşur.
“Sorgu Yeniden Yazımı ve HyDE” dersinde ne öğreneceğim?
Bilgi alma duyarlılığını artırma. AI Prompt Engineering ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Prompt Engineering öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Prompt Engineering, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Sorgu Yeniden Yazımı ve HyDE” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Prompt Engineering dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Prompt Engineering dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Naif RAG'ın Ötesi
- Alınan Parçaları Yeniden Sıralama
- Bağlam Sıkıştırma
- Sorgu Yeniden Yazımı ve HyDE