AI Prompt Engineering · درس

الاختيار الديناميكي لعدة أمثلة

استرجاع أمثلة لكل استعلام.

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

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

من الأمثلة الثابتة إلى الأمثلة الديناميكية

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

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

class DynamicSelector:
    def __init__(self, pool, embedder, index):
        self.pool = pool          # candidate demonstrations
        self.embed = embedder
        self.index = index        # ANN index over pool embeddings
    def select(self, query, k):
        q = self.embed(query)
        ids = self.index.search(q, k)
        return [self.pool[i] for i in ids]

تضمين مجموعة الأمثلة التوضيحية

احسبوا مسبقًا التضمينات لكل مثال توضيحي مرشح وخزّنوها في فهرس الجار الأقرب التقريبي (FAISS أو HNSW أو قاعدة بيانات متجهية). وعند ورود الاستعلام، ضمّنوا الإدخال مرة واحدة واسترجعوا أفضل المطابقات.

اختاروا نموذج تضمين يتوافق مع دلالات مهمتكم؛ فقد يجمع نموذج التضمين العام العناصر وفق السمات السطحية بدل البعد الذي يتنبأ بالتصنيف الصحيح.

import numpy as np

def build_index(pool, embed):
    vecs = np.stack([embed(d.input) for d in pool]).astype('float32')
    vecs /= np.linalg.norm(vecs, axis=1, keepdims=True)  # cosine via dot
    index = HNSW(dim=vecs.shape[1])
    index.add(vecs)
    return index

التلقين باستخدام kNN

تسترجع الطريقة المعيارية (Liu et al., 2022) أقرب k من الجيران إلى الاستعلام من المجموعة الموسومة وتستخدمها أمثلة توضيحية. ويتفوق الاختيار القائم على الاسترجاع باستمرار على الاختيار العشوائي، لأن الأمثلة التوضيحية ذات الصلة تحدد المهمة بصورة أفضل وتوفر فضاء التصنيفات الصحيح.

وتعمل التصنيفات المسترجعة أيضًا كسابقة تصنيف kNN مرنة، فتدفع النموذج نحو إجابات الجيران.

def knn_prompt(query, selector, k, build):
    demos = selector.select(query, k)
    demos = order_by_similarity(embed(query), demos)  # most similar last
    return build(demos, query)

الاسترجاع المراعي للتنوع

قد يعيد اختيار أفضل k فقط نسخًا شبه متطابقة، مما يهدر مساحة السياق. طبّقوا MMR أو التجميع على المرشحين المسترجعين للحفاظ على الصلة مع ضمان أن تغطي الأمثلة التوضيحية المختارة جوانب متميزة من الاستعلام.

يهم هذا خصوصًا في المدخلات التركيبية التي يحتاج كل جانب فرعي فيها إلى مثال توضيحي ممثل.

def diverse_retrieve(query, selector, k, pool_n=30, lam=0.7):
    cand = selector.select(query, pool_n)
    q = embed(query)
    return mmr_against_query(cand, q, k, lam)  # relevance + diversity

زمن الاستجابة وميزانية الاسترجاع

يضيف الاختيار الديناميكي استدعاءً للتضمين وبحثًا في ANN إلى كل طلب. ضعوا ميزانية لذلك: خزّنوا تضمينات الاستعلامات المتكررة مؤقتًا، ونفّذوا الاسترجاع على دفعات، وأبقوا الفهرس في الذاكرة.

في الأنظمة ذات QPS المرتفع، يجب أن تستغرق خطوة الاسترجاع أقل من ميلي ثانية؛ وإلا فإن مكسب الصلة يضيع بسبب زيادة زمن الاستجابة في الطرف.

from functools import lru_cache

@lru_cache(maxsize=50_000)
def cached_embed(text):
    return embed(text)
# Plus: warm in-RAM HNSW, batched search, async prefetch

تعارض التخزين المؤقت مع الأمثلة الديناميكية

تُعطّل الأمثلة الديناميكية التخزين المؤقت لبادئة التلقين لأن كتلة الأمثلة تتغير مع كل استعلام. خففوا ذلك بالحفاظ على مقدمة ثابتة مخزّنة مؤقتًا (تضم التعليمات وبعض الأمثلة التوضيحية العامة) وإلحاق الأمثلة التوضيحية المسترجعة الخاصة بالاستعلام بعدها فقط.

يستعيد هذا معظم وفورات التخزين المؤقت مع الحفاظ على الصلة الخاصة بكل استعلام في الذيل.

prompt = (
    STATIC_PREAMBLE          # cached: instructions + anchor demos
    + render(diverse_retrieve(query, selector, k))  # dynamic tail
    + format_query(query)
)

تجنب تسرّب بيانات التدريب والاختبار

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

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

def leak_safe_select(query, selector, k, sim_cap=0.97):
    cand = selector.select(query, k + 5)
    q = embed(query)
    cand = [d for d in cand if cos(q, d.emb) < sim_cap]
    return cand[:k]

البدء البارد ونمو المجموعة

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

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

def maybe_add_to_pool(trace, verified):
    if verified and novelty(trace, index) > THRESH:
        emb = embed(trace.input)
        index.add(emb)
        pool.append(Demo(trace.input, trace.output, trace.meta))

الاختيار بما يتجاوز التشابه

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

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

def select_by_uncertainty_reduction(query, pool, k):
    base = entropy(model_probs(build([], query)))
    gains = []
    for d in pool:
        h = entropy(model_probs(build([d], query)))
        gains.append((d, base - h))   # info gain per demo
    return [d for d, _ in sorted(gains, key=lambda x: -x[1])[:k]]

تقييم المسار الديناميكي

قارنوا النظام الديناميكي بخطّي أساس ثابت وعشوائي على بيانات محجوزة للاختبار مع ضبط تسرّب البيانات. أبلغوا عن الدقة وتوزيع تشابهات الاسترجاع وزمن الاستجابة من البداية إلى النهاية ومعدل إصابة التخزين المؤقت.

قد يكون النظام الديناميكي الذي يتفوق في الدقة لكنه يضعف إعادة استخدام التخزين المؤقت سلبيًا من حيث التكلفة؛ قيّموا الهدف الكامل، لا الجودة وحدها.

def eval_pipeline(eval_set):
    return {
        'acc_dynamic': run(dynamic, eval_set),
        'acc_static':  run(static, eval_set),
        'acc_random':  run(random_sel, eval_set),
        'p95_latency': latency_p95(),
        'cache_hit':   cache_hit_rate(),
    }

البنية المرجعية

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

تحوّل هذه البنية التلقين قليل الأمثلة إلى نظام استرجاع يتمتع بالانضباط التشغيلي الذي يقتضيه ذلك.

def answer(query):
    demos = leak_safe_select(query, selector, k=4)
    demos = mmr_against_query(demos, embed(query), 4)
    demos = order_by_similarity(embed(query), demos)
    prompt = STATIC_PREAMBLE + render(demos) + format_query(query)
    out = llm(prompt)
    log_for_pool_growth(query, out)
    return out

تحقق سريع

شخّصوا نتيجة تقييم قوية على نحو مضلل.

مراجعة

أهم النقاط المستخلصة:

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

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

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

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

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

هل درس «الاختيار الديناميكي لعدة أمثلة» مجاني؟

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

ماذا ستتعلم في «الاختيار الديناميكي لعدة أمثلة»؟

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

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

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

كم من الوقت يستغرق درس «الاختيار الديناميكي لعدة أمثلة»؟

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

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

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

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

  1. صفر، ومثال واحد، وعدة أمثلة
  2. تصميم أمثلة فعّالة
  3. ترتيب الأمثلة وحداثتها
  4. الاختيار الديناميكي لعدة أمثلة
← العودة إلى AI Prompt Engineering