الفصل 1: تحويل الاستعلام
لماذا نحوّل الاستعلامات؟
غالبًا ما تكون استعلامات المستخدم:
- غامضة أو ناقصة
- تستخدم مفردات مختلفة عن الوثائق
- قصيرة جدًا لـ embedding جيد
إعادة كتابة الاستعلام
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
rewrite_prompt = PromptTemplate.from_template("""
Rewrite the following query to be more specific and searchable.
Original: {query}
Rewritten:""")
llm = ChatOpenAI(model="gpt-4")
chain = rewrite_prompt | llm
# "how does it work?" → "How does retrieval augmented generation work?"
rewritten = chain.invoke({"query": "how does it work?"})
توسيع الاستعلام
أضف مصطلحات مرتبطة:
expansion_prompt = PromptTemplate.from_template("""
Expand this query with related terms and synonyms:
Query: {query}
Expanded query with alternatives:""")
# "ML" → "machine learning ML deep learning artificial intelligence AI"
HyDE (Hypothetical Document Embeddings)
ولّد إجابة افتراضية، حوّلها إلى embedding، وابحث بها:
def hyde_retrieval(query, llm, retriever):
# Step 1: Generate hypothetical document
hyde_prompt = f"""Write a short paragraph that would
answer this question: {query}"""
hypothetical_doc = llm.invoke(hyde_prompt)
# Step 2: Embed the hypothetical document
# (embeddings will be closer to real documents)
# Step 3: Retrieve using hypothetical embedding
results = retriever.get_relevant_documents(
hypothetical_doc.content
)
return results
لماذا يعمل HyDE:
- تستخدم الإجابة الافتراضية مفردات الوثائق
- محاذاة embedding أفضل مع المدوّنة
- جيّد خصوصًا للاستعلامات المعقّدة
ملخص
| التقنية | متى تستخدمها | التحسين |
|---|---|---|
| إعادة الكتابة | استعلامات غامضة | الوضوح |
| التوسيع | مرادفات ناقصة | الاستدعاء |
| HyDE | أسئلة معقّدة | الدقة |