AI Prompt Engineering · درس

إعادة صياغة الاستعلام وHyDE

تحسين استدعاء الاسترجاع.

الدرس 4 من 413 خطوة

إعادة صياغة الاستعلام وHyDE درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

الاستعلام هو الحلقة الأضعف

جودة الاسترجاع محدودة بالاستعلام. غالبًا ما تكون استعلامات المستخدم الأولية قصيرة أو غامضة أو مليئة بالضمائر، أو مصاغة بطريقة تختلف عن الوثائق. تعمل عملية تحويل الاستعلام على إعادة تشكيله قبل الاسترجاع لرفع الاستدعاء والدقة.

وهذه من أرخص التحسينات وأكثرها أثرًا مقارنةً بـ RAG الساذج: أصلح الاستعلام، وستستفيد كل مرحلة لاحقة.

def transform_query(raw, history):
    # Resolve references, expand, decompose, or hypothesize
    # BEFORE embedding and retrieving.
    return rewrite(raw, history)

إعادة صياغة الاستعلام

أبسط تحويل هو أن يعيد LLM صياغة استعلام المستخدم في شكل أوضح ومستقل بذاته وملائم للاسترجاع. فهو يصحح الأخطاء المطبعية، ويوسّع الاختصارات، ويزيل الضوضاء الحوارية.

وهذا مهم خصوصًا في المحادثات متعددة الأدوار، حيث تكون الرسالة الأخيرة غير مفهومة دون السياق (ماذا عن الثاني؟).

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()

تكثيف المحادثة

في RAG الحواري، كثّف الحوار والدور الجديد في سؤال مستقل بذاته. فمن دون ذلك، تجعل الضمائر وعلامات الحذف التضمين بلا معنى، وينهار الاسترجاع.

مرّر الأدوار السابقة حتى يتمكن معيد الصياغة من تحويل «ذلك» و«ذاك» و«السابق» إلى كيانات صريحة يستطيع المسترجع مطابقتها.

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()

توسيع الاستعلام

ينشئ التوسيع مرادفات أو مصطلحات ذات صلة أو صيغًا بديلة لتوسيع التغطية المعجمية والدلالية. وهو يعالج عدم تطابق المفردات: فقد تستخدم الوثيقة كلمة invalidate، بينما يستخدم المستخدم revoke.

وسّع الاستعلام لأغراض الاسترجاع، ثم أجرِ الاسترجاع باستخدام اتحاد النتائج؛ ولا تعرض الصيغة الموسعة للمستخدم. واحذر التوسيع المفرط، إذ قد يجلب نتائج خارجة عن الموضوع.

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

الاسترجاع متعدد الاستعلامات

أنشئ عدة إعادة صياغات متنوعة، ونفّذ الاسترجاع لكل منها، ثم ادمج قوائم النتائج (باستخدام reciprocal rank fusion). تكشف الصياغات المختلفة مقاطع ذات صلة مختلفة؛ ويجمع الدمج نقاط قوتها ويجعل الاستدعاء أكثر استقرارًا.

يقايض هذا الأسلوب زيادة عدد استدعاءات الاسترجاع بمتانة أكبر في مواجهة أي صياغة سيئة منفردة.

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)

تفكيك الاستعلام

تحتاج الأسئلة المعقدة ومتعددة القفزات إلى تفكيك إلى أسئلة فرعية، يُسترجع لكل منها على حدة، ثم تُركَّب النتائج. فلا يمكن الإجابة باسترجاع واحد عن سؤال مثل: أيّ رئيس تنفيذي للشركة التي استحوذت على X أكبر سنًا من...

فكّك السؤال، واسترجع النتائج لكل سؤال فرعي، ودع المولّد يدمج الأدلة المجموعة.

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 answer

HyDE: الفكرة الأساسية

يغيّر HyDE (Hypothetical Document Embeddings, Gao et al., 2022) طبيعة المشكلة. فبدلًا من إنشاء تضمين للاستعلام القصير، يطلب من LLM إنشاء وثيقة إجابة افتراضية، ثم ينشئ تضمينًا لها ويستخدمه في الاسترجاع.

تستخدم الوثيقة الافتراضية الأسلوب نفسه الذي تستخدمه الوثائق الحقيقية، لذلك يقع تضمينها أقرب إلى الإجابات الفعلية، مما يعالج عدم التطابق بين الاستعلام والوثيقة.

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 answer

لماذا يحسّن HyDE الاستدعاء

تُصاغ الأسئلة وإجاباتها بطرائق مختلفة؛ أما السؤال والإجابة الزائفة المعقولة فتصاغ بطريقة تشبه الإجابة الحقيقية. يستفيد HyDE من المعرفة التوليدية السابقة لدى LLM لسد هذه الفجوة، حتى لو احتوت الوثيقة الافتراضية على أخطاء واقعية.

لا تهم صحة الوثيقة الافتراضية كثيرًا؛ فهي تحتاج فقط إلى المفردات والبنية الصحيحين لتقع بالقرب من الوثائق الحقيقية في فضاء التضمين.

# 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 وأنماط فشله

يضيف HyDE عملية توليد باستخدام LLM قبل الاسترجاع، مما يزيد زمن الاستجابة والتكلفة، وقد يهلوس وثيقة افتراضية تنحرف عن الموضوع، فيضعف الاستدعاء للاستعلامات المتخصصة أو الخارجة عن التوزيع التي لا يعرف النموذج عنها شيئًا.

خفّف ذلك بدمج الاسترجاع باستخدام HyDE-vector مع الاسترجاع باستخدام الاستعلام الخام عبر الدمج، حتى لا تتمكن وثيقة افتراضية سيئة من إسقاط الاستدعاء بالكامل.

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 hypotheticals

اختيار التقنيات ودمجها

هذه التحويلات متكاملة. استخدم التكثيف للمحادثات، والتوسيع/الاستعلامات المتعددة لسد فجوات المفردات، والتفكيك للاستعلامات متعددة القفزات، وHyDE عندما يختلف أسلوب صياغة السؤال عن أسلوب صياغة المستند. في كثير من حِزم الإنتاج، تُسلسَل هذه العمليات على النحو التالي: تكثيف الاستعلام، ثم HyDE، ثم دمج الناتج مع الاستعلام الخام، ثم إعادة الترتيب.

كل تحويل إضافي يستهلك استدعاءً إلى LLM، لذا فعّل هذه التحويلات بحسب نوع الاستعلام بدلًا من تشغيلها جميعًا دائمًا.

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)

تقييم التحويلات

قِس كل تحويل من خلال مقدار تحسينه في recall@k في الاسترجاع ودقة الإجابة النهائية مقارنةً بالاستعلام الخام، وذلك على مجموعة خالية من تسرّب البيانات. وتتبّع زمن الاستجابة المضاف وتكلفة LLM، بحيث لا تُبقي إلا على التحويلات التي تستحق تكلفتها.

انتبه: قد يؤدي تحويل يحسّن الاستدعاء لكنه يضيف مشتتات إلى خفض دقة الإجابة، ما لم يقترن بإعادة الترتيب والضغط.

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),
    }

تحقق سريع

فكّر في سبب نجاح HyDE رغم عدم كمال الفرضيات.

مراجعة

أهم النقاط:

  • يحدّ الاستعلام من الاسترجاع؛ وتحويله ترقية رخيصة وعالية الأثر لنظام RAG.
  • تجعل إعادة الكتابة والتكثيف استعلامات المحادثة مستقلة بذاتها؛ ويعالج التوسيع والاستعلامات المتعددة فجوات المفردات.
  • يتعامل التفكيك مع الأسئلة متعددة الخطوات من خلال الاسترجاع لكل سؤال فرعي.
  • يضمّن HyDE إجابة افتراضية لجسر الفجوة بين أسلوب السؤال وأسلوب المستند؛ ولا يُشترط أن تكون الفرضية صحيحة.
  • ادمج التحويلات بحسب نوع الاستعلام، وادمجها مع الاستعلام الخام لتحقيق المتانة، وقيّم الاستدعاء ودقة الإجابة وزمن الاستجابة والتكلفة.
البدء مجانًا

تعلم AI Prompt Engineering مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
53
الدروس
199

الأسئلة الشائعة

هل درس «إعادة صياغة الاستعلام وHyDE» مجاني؟

نعم — نص درس «إعادة صياغة الاستعلام وHyDE» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

ماذا ستتعلم في «إعادة صياغة الاستعلام وHyDE»؟

تحسين استدعاء الاسترجاع. تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟

لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إعادة صياغة الاستعلام وHyDE»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟

نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما بعد RAG الساذج
  2. إعادة ترتيب المقاطع المسترجعة
  3. ضغط السياق
  4. إعادة صياغة الاستعلام وHyDE
← العودة إلى AI Prompt Engineering