ما هي التضمينات (Embeddings)؟ تحويل النصوص البشرية إلى أرقام (Vectors)
ما هي التضمينات Embeddings؟
التضمينات Embeddings هي تمثيل عددي للنصوص أو الصور أو الأصوات على شكل متجهات Vectors. الفكرة الجوهرية هي أن الحاسوب لا “يفهم” الجمل بصيغتها البشرية، بل يحتاج إلى تحويلها إلى أرقام يمكن مقارنتها وقياس المسافة بينها. عندما نحول عبارة مثل “تعلم الآلة” وعبارة “Machine Learning” إلى تضمينات جيدة، نجد أن المتجهين الناتجين يكونان قريبين هندسياً داخل فضاء عددي عالي الأبعاد، لأن المعنى متقارب حتى لو اختلفت اللغة أو الصياغة.
هذا المفهوم أساسي في أنظمة البحث الدلالي، التصنيف، العنقدة، التوصية، وبشكل خاص في تطبيقات نماذج اللغة الكبيرة LLMs، لأنه يسمح بجلب السياق المناسب قبل التوليد. لذلك ستجد أن التضمينات هي العمود الفقري في أنظمة RAG، وقواعد البيانات المتجهة، وخطوط المعالجة الذكية التي تُبنى عبر LangChain.
كيف تتحول الجملة إلى متجه رقمي؟
تقنياً، تمر الجملة عبر نموذج مخصص لإنتاج Embeddings. قبل الوصول إلى المتجه النهائي، تحدث مراحل داخلية تبدأ عادة بـ Tokenization، أي تقسيم النص إلى وحدات أصغر. بعد ذلك تمر هذه الوحدات عبر طبقات تمثيل عصبية لاستخراج علاقات السياق والمعنى. الناتج النهائي يكون مصفوفة أو متجهاً بطول ثابت مثل 768 أو 1536 قيمة عددية.
هذه القيم لا تكون مفهومة للبشر مباشرة، لكنها تحمل بصمة دلالية للنص. كلما اقترب متجهان وفق مقياس مثل Cosine Similarity، كان المعنى بين النصين أقرب. لهذا السبب، بدلاً من البحث الحرفي عن كلمة مطابقة، يمكن للنظام العثور على مقاطع تتحدث عن الفكرة نفسها حتى لو استخدمت مفردات مختلفة.
المعمارية الداخلية المبسطة
- استقبال النص الخام من المستخدم أو من المستندات.
- تنظيف النص وتقسيمه إلى أجزاء عند الحاجة
Chunking. - تمرير كل جزء إلى نموذج التضمين لإنتاج متجه عددي.
- تخزين المتجه مع النص الأصلي والبيانات الوصفية داخل
Vector DB. - عند وصول استعلام جديد، يُحوَّل بدوره إلى متجه.
- تُحسب المسافات بين متجه الاستعلام والمتجهات المخزنة لاسترجاع الأقرب معنى.
لماذا تعد التضمينات حجر الأساس في تطبيقات RAG؟
في أنظمة Retrieval-Augmented Generation أو RAG، لا نعتمد فقط على ذاكرة النموذج العامة، بل نربطه بقاعدة معرفة خارجية. هنا يأتي دور التضمينات: نحول الوثائق إلى متجهات ونخزنها، ثم نحول سؤال المستخدم إلى متجه ونبحث عن أكثر المقاطع قرباً. بعد ذلك فقط نرسل هذه المقاطع مع السؤال إلى النموذج التوليدي ليجيب اعتماداً على معرفة مسترجعة وحديثة.
هذه البنية تقلل الهلوسة، وترفع دقة الإجابة، وتسمح بتحديث المعرفة دون إعادة تدريب النموذج بالكامل. لذلك إذا كنت تبني مساعداً للشركات، أو محرك بحث دلالياً، أو روبوت دعم داخلي، فإن التضمينات ليست إضافة تجميلية، بل طبقة استرجاع أساسية في تدفق البيانات.
تدفق البيانات في تطبيق توليدي يعتمد على التضمينات
- رفع ملفات
PDFأو نصوص قاعدة المعرفة. - تقسيم المستندات إلى مقاطع مناسبة سياقياً.
- توليد
Embeddingsلكل مقطع. - التخزين داخل قاعدة متجهية مع
metadataمثل العنوان والمصدر والتاريخ. - استقبال سؤال المستخدم وتحويله إلى متجه.
- تنفيذ بحث تشابه دلالي واسترجاع أفضل النتائج.
- حقن النتائج داخل برومبت منظم عبر
Prompt Engineering. - إرسال الطلب إلى النموذج التوليدي لإنتاج الإجابة النهائية.
أجب عن السؤال اعتماداً فقط على المقاطع المسترجعة أدناه. إذا لم تجد الإجابة بوضوح، اذكر أن المعلومات غير كافية. ثم قدّم الإجابة العربية بشكل منظم ومهني.
الفرق بين Embeddings وFine-tuning
كثيرون يخلطون بين التضمينات وFine-tuning. التضمينات لا تغيّر أوزان النموذج التوليدي، بل تتيح تمثيل البيانات واسترجاعها دلالياً. أما الضبط الدقيق فيُستخدم عندما تريد تعديل سلوك النموذج نفسه أو تعليمه نمط إخراج متخصص. إذا كان التحدي لديك هو “كيف أجعل النموذج يعرف وثائقي؟”، فغالباً التضمينات مع RAG هي الحل الأنسب. أما إذا كان السؤال “كيف أجعل النموذج يكتب بأسلوب قانوني ثابت أو يصنف بطريقة خاصة؟” فقد تحتاج إلى Fine-tuning.
مثال برمجي: توليد تضمين لنص باستخدام OpenAI API
قبل تنفيذ الكود، تأكد من أنك أعددت البيئة البرمجية بالشكل الصحيح كما في درس تثبيت مكتبات Python الأساسية، وكذلك من فهم آلية المفاتيح عبر درس الاتصال الأول مع API.
from openai import OpenAI
client = OpenAI()
text = "Embeddings transform human language into numerical vectors."
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
vector = response.data[0].embedding
print("Vector length:", len(vector))
print(vector[:10])
في هذا المثال، يستقبل النموذج النص ويعيد متجهاً عددياً ثابت الطول. لا نهتم عادة بالقيم الفردية نفسها، بل باستخدامها لاحقاً في المقارنة والبحث والاسترجاع. كما ينبغي الانتباه إلى تكلفة المعالجة واستهلاك الرموز في بقية خطوات النظام، ويمكنك التوسع في ذلك عبر مقال إدارة Tokens والتكلفة.
مثال عملي باستخدام LangChain
إذا كنت تبني خطوط عمل أكبر، فإن LangChain يسهّل توحيد طبقة التضمينات مع الاسترجاع والسلاسل. وقد يفيدك قبل هذا المثال قراءة إنشاء أول Chain.
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
documents = [
"Embeddings are useful for semantic search.",
"Vector databases store numerical representations of text.",
"Fine-tuning modifies model behavior, not retrieval quality directly."
]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = FAISS.from_texts(documents, embeddings)
query = "How can I search by meaning instead of exact words?"
results = vectorstore.similarity_search(query, k=2)
for i, doc in enumerate(results, 1):
print(f"Result {i}: {doc.page_content}")
هذا المثال يوضح قيمة التجريد البرمجي: النصوص تُحوَّل إلى متجهات، ثم تُفهرس داخل مخزن متجهي، وبعدها يصبح البحث دلالياً بدلاً من أن يكون بحثاً حرفياً. في الأنظمة الفعلية، يمكن استبدال FAISS بقواعد متخصصة مثل Pinecone أو Weaviate أو Chroma بحسب حجم البيانات ومتطلبات الإنتاج.
أفضل الممارسات الهندسية عند استخدام التضمينات
- اختر نموذج
Embeddingsمناسباً للغة العربية إذا كانت بياناتك عربية بكثافة. - طبّق
Chunkingبحجم متوازن؛ المقاطع الطويلة جداً تضعف الدقة، والقصيرة جداً تفقد السياق. - احفظ
metadataمفيدة مثل القسم والمصدر وتاريخ التحديث. - اختبر أكثر من مقياس تشابه، لكن يبدأ معظم المهندسين مع
Cosine Similarity. - قيّم النتائج يدوياً وبمقاييس استرجاع حقيقية، لا تكتفِ بانطباع بصري سريع.
- إن كانت المخرجات تحتاج صيغة منظمة، اربط الاسترجاع مع
Output ParsersلإنتاجJSONمضبوط.
الخلاصة
التضمينات Embeddings هي الجسر بين اللغة البشرية والتمثيل العددي القابل للمعالجة. من دونها، يصعب بناء بحث دلالي فعال أو نظام RAG موثوق أو طبقة استرجاع حديثة لتغذية LLMs. هندسياً، قيمتها ليست فقط في تحويل النص إلى أرقام، بل في تمكين الآلة من قياس المعنى، وبناء تدفق بيانات ذكي يبدأ من الوثائق وينتهي بإجابة أكثر دقة، أقل هلوسة، وأسهل في التوسع داخل التطبيقات الإنتاجية.
31 comments