0Pricing
AI Engineering Academy · درس

تجميع Embeddings وتصويرها

طبّقوا تجميع k-means على مجموعة من embeddings وصوّروها ثنائيًا باستخدام UMAP لاكتشاف التجمعات الموضوعية الطبيعية في بياناتكم.

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

لماذا نُجمّع Embeddings؟

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

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

نظرة عامة على التجميع باستخدام K-Means

يقسم K-means عددًا n من نقاط البيانات إلى k من العناقيد، وذلك بإسناد كل نقطة تكراريًا إلى أقرب مركز، ثم إعادة حساب المراكز باعتبارها متوسط النقاط المسندة إليها. ويتوقف عندما تتوقف الإسنادات عن التغير.

بالنسبة إلى embeddings، يعثر k-means على المستندات المتقاربة في فضاء embeddings عالي الأبعاد، فيجمعها فعليًا وفق تشابهها الدلالي.

from sklearn.cluster import KMeans
import numpy as np

# corpus_embeddings: (n_docs, 1536) — pre-computed
corpus_embeddings = np.random.randn(200, 1536)  # placeholder

kmeans = KMeans(n_clusters=5, random_state=42, n_init='auto')
kmeans.fit(corpus_embeddings)

labels = kmeans.labels_
print(f'Cluster assignments: {labels[:10]}')
print(f'Unique clusters: {set(labels)}')

اختيار العدد المناسب من العناقيد

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

تقيس درجة الصورة الظلية مدى ملاءمة النقطة لعنقودها مقارنة بأقرب عنقود آخر؛ وتكون الدرجات الأقرب إلى 1 أفضل. جرّب قيم k من 3 إلى 20 واختر أعلى درجة.

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np

corpus_embeddings = np.random.randn(200, 50)  # placeholder (50D for speed)

best_k, best_score = 2, -1
for k in range(2, 11):
    km = KMeans(n_clusters=k, random_state=42, n_init='auto')
    labels = km.fit_predict(corpus_embeddings)
    score = silhouette_score(corpus_embeddings, labels, sample_size=100)
    print(f'k={k}: silhouette={score:.3f}')
    if score > best_score:
        best_score, best_k = score, k

print(f'Best k: {best_k}')

وضع تسميات للعناقيد باستخدام LLM

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

from openai import OpenAI

client = OpenAI()

def label_cluster(cluster_docs, n_examples=3):
    examples = '\n'.join(f'- {d}' for d in cluster_docs[:n_examples])
    prompt = f'Given these documents, provide a 3-word category label:\n{examples}\nLabel:'
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}],
        max_tokens=20
    )
    return response.choices[0].message.content.strip()

# Example usage:
# cluster_0_docs = [documents[i] for i in range(len(documents)) if labels[i] == 0]
# print(label_cluster(cluster_0_docs))

تقليل الأبعاد باستخدام UMAP

لا يمكن رسم المتجهات ذات 1536 بُعدًا مباشرةً. تعمل UMAP (Uniform Manifold Approximation and Projection) على تقليل البيانات عالية الأبعاد إلى بُعدين أو ثلاثة أبعاد مع الحفاظ على بنية الجوار المحلي. وعلى خلاف PCA، فإن UMAP غير خطية وأفضل بكثير في الحفاظ على العناقيد.

تُعد UMAP الخيار القياسي لتصوير embeddings النصية، لأن المستندات المتشابهة تظل متقاربة في الرسم ثنائي الأبعاد.

import umap
import numpy as np

corpus_embeddings = np.random.randn(200, 1536)  # placeholder

reducer = umap.UMAP(
    n_components=2,
    metric='cosine',   # important for text embeddings
    random_state=42
)

embeddings_2d = reducer.fit_transform(corpus_embeddings)
print(f'Reduced shape: {embeddings_2d.shape}')  # (200, 2)

تصوير العناقيد باستخدام Matplotlib

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

import matplotlib.pyplot as plt
import numpy as np

# Assume: embeddings_2d (n, 2), labels (n,), documents list
# Placeholder data:
np.random.seed(42)
embeddings_2d = np.random.randn(50, 2)
labels = np.random.randint(0, 5, 50)

fig, ax = plt.subplots(figsize=(10, 7))
scatter = ax.scatter(
    embeddings_2d[:, 0],
    embeddings_2d[:, 1],
    c=labels,
    cmap='tab10',
    s=60,
    alpha=0.8
)
plt.colorbar(scatter, label='Cluster')
ax.set_title('Document Embedding Clusters (UMAP)')
plt.tight_layout()
plt.savefig('/tmp/clusters.png', dpi=150)
print('Saved cluster plot')

معاملات UMAP المهمة

معاملات UMAP الفائقة الأساسية التي تؤثر في جودة التصوير:

  • n_neighbors (القيمة الافتراضية 15): تلتقط القيم الأكبر بنية عالمية أكثر، بينما تكشف القيم الأصغر العناقيد المحلية
  • min_dist (القيمة الافتراضية 0.1): تحدد مدى تقارب النقاط؛ فالقيمة الأصغر تعني عناقيد أكثر تماسكًا، لكنها تزيد التداخل بينها
  • metric: استخدم دائمًا 'cosine' مع embeddings النصية؛ فالمسافة الإقليدية غير مناسبة

جرّب n_neighbors بقيم تتراوح بين 5 و50 للعثور على التصوير الذي يكشف بنية بياناتك بأفضل شكل.

بديل التجميع الهرمي

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

from sklearn.cluster import AgglomerativeClustering
import numpy as np

corpus_embeddings = np.random.randn(100, 50)  # placeholder

cluster = AgglomerativeClustering(
    n_clusters=None,
    distance_threshold=1.5,
    metric='cosine',
    linkage='average'
)
labels = cluster.fit_predict(corpus_embeddings)

n_clusters = len(set(labels))
print(f'Found {n_clusters} natural clusters')

العثور على القيم الشاذة والتكرارات شبه المطابقة

تُعد embeddings ممتازة أيضًا للعثور على المستندات شبه المكررة. احسب التشابه الجيبي زوجيًا بين جميع المستندات، واعتبر الأزواج التي يتجاوز تشابهها 0.95 تكرارات محتملة. وهذا أكثر متانة من مقارنة النصوص، لأنه يكتشف التكرارات المعادَة الصياغة.

import numpy as np

def find_near_duplicates(corpus_vecs, threshold=0.95):
    # corpus_vecs assumed L2-normalized
    sim_matrix = corpus_vecs @ corpus_vecs.T  # (n, n)
    duplicates = []
    n = len(corpus_vecs)
    for i in range(n):
        for j in range(i + 1, n):
            if sim_matrix[i, j] >= threshold:
                duplicates.append((i, j, float(sim_matrix[i, j])))
    return duplicates

# pairs = find_near_duplicates(corpus_embeddings)
# print(f'Found {len(pairs)} near-duplicate pairs')

سير عمل عملي للتجميع

يتبع سير عمل التجميع الحقيقي الخطوات التالية بالترتيب:

  1. أنشئ embeddings لجميع المستندات باستخدام text-embedding-3-small
  2. اختياريًا، قلّل الأبعاد إلى 50 بُعدًا باستخدام UMAP قبل التجميع (لتسريع k-means)
  3. أجرِ التجميع باستخدام k-means، وجرّب قيم k للعثور على أفضل درجة للصورة الظلية
  4. ضع تسمية لكل عنقود باستخدام LLM مع 5 مستندات ممثلة
  5. صوّر مخطط UMAP المبعثر ثنائي الأبعاد، مع تلوينه حسب العنقود
  6. راجع القيم الشاذة (النقاط البعيدة عن أي مركز)

قيود التجميع

ينبغي الانتباه إلى قيود مهمة عند تجميع embeddings:

  • يفترض K-means أن العناقيد كروية — قد تُقسّم مجموعات الموضوعات الممدودة أو غير المنتظمة الشكل بطريقة غير صحيحة
  • تضغط embeddings المعنى — قد يكون مستندان متقاربين دلاليًا، لكنهما ينتميان إلى فئتين مختلفتين من حيث الإجراء المطلوب
  • تحتاج تسميات العناقيد إلى التحقق — خذ دائمًا عينة من المستندات في كل عنقود للتحقق من سلامة التسمية التي أنشأها LLM

استخدم التجميع أداةً للاستكشاف، وليس نظامًا مرجعيًا لتصنيف الحقيقة.

تحقق سريع

اختبر مدى فهمك لمفاهيم هندسة الذكاء الاصطناعي الواردة في هذا الدرس.

مراجعة الدرس

في هذا الدرس تعلمتم أن: خوارزمية k-means تجمع المستندات بحسب التقارب الدلالي في فضاء التضمين، وتعمل UMAP على تقليل التضمينات عالية الأبعاد إلى بُعدين للتصور باستخدام مسافة جيب التمام، وتساعد درجة silhouette على اختيار العدد المناسب من العناقيد من دون بيانات معنونة. ننتقل بعد ذلك إلى ما يتجاوز البحث داخل الذاكرة، ونستكشف قواعد بيانات المتجهات المخصصة لبيئات الإنتاج.

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

هل درس «تجميع Embeddings وتصويرها» مجاني؟

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

ماذا ستتعلم في «تجميع Embeddings وتصويرها»؟

طبّقوا تجميع k-means على مجموعة من embeddings وصوّروها ثنائيًا باستخدام UMAP لاكتشاف التجمعات الموضوعية الطبيعية في بياناتكم. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «تجميع Embeddings وتصويرها»؟

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

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

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

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

  1. ما هي Vector Embeddings؟
  2. إنشاء Embeddings باستخدام OpenAI
  3. البحث الدلالي باستخدام NumPy
  4. تجميع Embeddings وتصويرها
← العودة إلى AI Engineering Academy