استخدام textembedding-gecko@003 لتضمين المتجهات

1. مقدمة

تاريخ آخر تعديل: 2024-04-08

تضمين النص

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

النص يشبه لغة معقّدة، فهو مليء بالفروق الدقيقة والغموض.

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

مزايا تضمين النص

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

حالات استخدام Text Embedding

تتيح تضمينات النصوص، من خلال تحويل النصوص إلى تمثيلات رقمية، مجموعة متنوعة من التطبيقات في معالجة اللغة الطبيعية (NLP). في ما يلي بعض حالات الاستخدام الرئيسية:

1. محركات البحث واسترجاع المعلومات:

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

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

2. أنظمة الاقتراح:

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

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

3. رصد السرقة الأدبية:

يمكن أن تساعد مقارنة تضمينات قطعتَي نص في تحديد حالات الانتحال المحتملة من خلال العثور على تشابهات كبيرة في بنيتهما الدلالية.

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

textembedding-gecko@003

‫Textembedding-gecko@003 هو إصدار محدّد من نموذج تضمين نصي مدرَّب مسبقًا تقدّمه Google Cloud Platform (GCP) من خلال Vertex AI ومجموعة أدوات وخدمات الذكاء الاصطناعي.

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستنشئ نصًا برمجيًا بلغة Python. سيعمل هذا النص البرمجي على:

  • استخدِم Vertex API لاستدعاء نموذج textembedding-gecko@003 وتحويل النص إلى تضمينات نصية (متّجهات).
  • إنشاء قاعدة بيانات محاكاة تتألف من نصوص ومتّجهاتها
  • نفِّذ طلب بحث في قاعدة بيانات متّجهات محاكاة من خلال مقارنة المتّجهات والحصول على الرد الأكثر احتمالاً.

ما ستتعلمه

  • كيفية استخدام ميزة "تضمين النص" في "منصة Google Cloud"
  • كيفية استدعاء نموذج textembedding-gecko@003
  • كيفية تشغيل هذا الإجراء في Workbench
  • كيفية استخدام Vertex AI - Workbench لتنفيذ البرامج النصية

المتطلبات

  • إصدار حديث من Chrome
  • معرفة لغة Python
  • مشروع Google Cloud
  • الوصول إلى Vertex AI - Workbench

2. الإعداد

إنشاء مثيل Vertex AI Workbench

  1. في Google Cloud Console، في صفحة اختيار المشروع، اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
  1. الانتقال إلى أداة اختيار المشاريع
  2. تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud.
  3. فعِّل Notebooks API.

يمكنك إنشاء مثيل Vertex AI Workbench باستخدام Google Cloud Console أو gcloud CLI أو Terraform. لأغراض هذا البرنامج التعليمي، سننشئها باستخدام "وحدة تحكّم Google Cloud". يمكنك الاطّلاع على مزيد من المعلومات حول الطرق الأخرى هنا.

  1. في Google Cloud Console، انتقِل إلى صفحة "الأجهزة الافتراضية" التي يمكن الوصول إليها في قائمة Vertex AI، وقسم "دفاتر الملاحظات"، ثم انقر على Workbench. 56c087d619c464dd.png
  2. انتقِل إلى "المثيلات".
  3. انقر على "إنشاء مقارنة جديدة" 381ff9b895e77641.png.
  4. في مربّع الحوار "إنشاء مثيل" (Create instance)، ضَع المعلومات التالية في قسم "التفاصيل" (Details) للمثيل الجديد:

الاسم: أدخِل اسمًا لآلتك الافتراضية الجديدة. يجب أن يبدأ الاسم بحرف متبوعًا بما يصل إلى 62 حرفًا صغيرًا أو رقمًا أو شرطة (-) ولا يمكن أن ينتهي بشرطة.

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

لا حاجة إلى تثبيت وحدة معالجة الرسومات

في قسم "الربط الشبكي" (Networking)، قدِّم ما يلي:

الشبكات: اضبط خيارات الشبكة لاستخدام شبكة في مشروعك الحالي أو شبكة VPC مشتركة من مشروع مضيف، إذا تم ضبط إحداهما. في حال استخدام شبكة VPC مشتركة في المشروع المضيف، يجب أيضًا منح دور "مستخدم شبكة Compute" (roles/compute.networkUser) إلى "وكيل خدمة Notebooks" من مشروع الخدمة.

في حقل "الشبكة": اختَر الشبكة التي تريدها. يمكنك اختيار شبكة VPC، طالما أنّ ميزة "الوصول الخاص إلى Google" مفعّلة في الشبكة أو يمكنها الوصول إلى الإنترنت.

في حقل "الشبكة الفرعية": اختَر الشبكة الفرعية التي تريدها. يمكنك اختيار الخيار التلقائي.

في "خصائص الجهاز الظاهري"، يمكنك ترك الجهاز التلقائي، أي e2-standard-4.

d47bdc2d7f516c46.png

  1. انقر على "إنشاء".

تنشئ أداة Vertex AI Workbench مثيلاً وتبدأه تلقائيًا. عندما يصبح الجهاز الظاهري جاهزًا للاستخدام، يفعّل Vertex AI Workbench رابط "فتح JupyterLab". انقروا عليها.

إنشاء دفتر ملاحظات Python 3

  1. داخل Jupyterlab، من "مشغّل التطبيقات"، في قسم "دفتر الملاحظات"، انقر على الرمز الذي يتضمّن شعار Python والمكتوب عليه Python3. e16bb118cd28256f.png
  2. يتم إنشاء دفتر ملاحظات Jupyter بالاسم "بلا عنوان" والامتداد ipynb. da9bd34cf307156c.png
  3. يمكنك إعادة تسميته باستخدام قسم "متصفّح الملفات" على يمين الصفحة أو تركه كما هو.

الآن، يمكننا البدء في وضع الرمز في دفتر الملاحظات.

3- استيراد المكتبات المطلوبة

بعد إنشاء الجهاز الافتراضي وفتح Jupyterlab، علينا تثبيت جميع المكتبات المطلوبة في هذا الدرس العملي.

سنحتاج إلى ما يلي:

  1. numpy
  2. باندا
  3. ‫TextEmbeddingInput وTextEmbeddingModel من vertexai.language_models

انسخ الرمز أدناه والصقه في إحدى الخلايا:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

وسيبدو مشابهًا لهذا:

6852d323eedcac93.png

4. إنشاء قاعدة بيانات متّجهة محاكاة

لاختبار الرمز، سننشئ قاعدة بيانات تتألف من نصوص ومتجهات ذات صلة تمت ترجمتها باستخدام نموذج تضمين النص gecko@003.

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

ستتضمّن قاعدة بيانات المتجهات 3 سجلات، وإليك كيفية إنشائها:

انسخ الرمز أدناه والصقه في خلية جديدة.

DOCUMENT1 = {
    "title": "Operating the Climate Control System",
    "content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}

DOCUMENT2 = {
    "title": "Touchscreen",
    "content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}

DOCUMENT3 = {
    "title": "Shifting Gears",
    "content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

سيبدو على النحو التالي:

26baa3b876c0605d.png

لنتعرّف على الرمز

في المتغيرات DOCUMENT1 وDOCUMENT2 وDOCUMENT3، نخزّن قاموسًا يحاكي المستندات مع عناوينها ومحتواها. تشير هذه "المستندات" إلى دليل مستخدم محاكى لسيارة من صنع Google.

في السطر التالي، ننشئ قائمة من هذه المستندات الثلاثة (القواميس).

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

أخيرًا، باستخدام مكتبة pandas، ننشئ إطار بيانات من تلك القائمة وسنسمّيه df_initial_db.

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

5- إنشاء تضمينات نصية

سنحصل الآن على عملية تضمين نصية باستخدام نموذج gecko@003 لكل سجلّ في قاعدة بيانات المستندات المحاكية.

انسخ الرمز أدناه والصقه في خلية جديدة:

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input        
                                           
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

سيبدو على النحو التالي:

4c4af091c7a82861.png

لنتعرّف على الرمز

لقد حدّدنا دالة باسم embed_fn ستتلقّى كمدخل إطار بيانات pandas الذي يحتوي على النص المطلوب إجراء التضمين عليه. تعرض الدالة بعد ذلك النص المرمّز كمتّجه.

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input             

في القائمة المسماة list_embedded_values، سنخزّن النص المرمّز لكل صف ونضيفه.

باستخدام طريقة iterrows من مكتبة pandas، يمكننا تكرار كل صف في إطار البيانات، والحصول على القيم من العمود Text (الذي يحتوي على المعلومات اليدوية من قاعدة البيانات المحاكاة).

لإرسال نص عادي وعرض متّجهاته باستخدام نموذج gecko@003، علينا إعداد المتغيّر model الذي نضبط فيه النموذج المطلوب استخدامه من خلال استدعاء الدالة TextEmbeddingModel.from_pretrained.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                     

بعد ذلك، في تضمينات المتغيرات، نلتقط متّجه النص الذي نرسله من خلال الدالة model.get_embeddings.

في نهاية الدالة، ننشئ عمودًا جديدًا في إطار البيانات باسم "النص المضمّن" (Embedded text)، وسيتضمّن هذا العمود قائمة المتجهات التي تم إنشاؤها استنادًا إلى نموذج gecko@003.

df_input['Embedded text'] = list_embedded_values
return df_input             

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

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. طرح سؤال على قاعدة بيانات المتّجهات

بعد أن أصبحت قاعدة البيانات تحتوي على نصوص ومتجهات، يمكننا المتابعة لطرح سؤال والاستعلام من قاعدة البيانات للعثور على إجابة.

لإجراء ذلك، انسخ الرمز أدناه والصقه في خلية جديدة:

question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])        
text_to_search=embeddings[0].values
len(text_to_search)

ستبدو النتيجة على النحو التالي:

6b7cf9b08e3b4573.png

لنتعرّف على الرمز

على غرار الدالة من الخطوة السابقة، نبدأ أولاً بتهيئة متغيّر السؤال بما ننوي طرحه على قاعدة البيانات.

question='How do you shift gears in the Google car?'

بعد ذلك، نضبط النموذج الذي نريد استخدامه في متغيّر النموذج من خلال الدالة TextEmbeddingModel.from_pretrained، وهو في هذه الحالة نموذج gecko@003.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")

في المتغير embeddings، نستدعي الدالة model.get_embeddings ونمرّر النص المطلوب تحويله إلى متجه، وفي هذه الحالة، نمرّر السؤال المطلوب طرحه.

embeddings = model.get_embeddings([(question)])        

أخيرًا، يحتوي المتغيّر text_to_search على قائمة المتجهات المترجمة من السؤال.

نطبع طول الخط المتجه كمرجع فقط.

text_to_search=embeddings[0].values
len(text_to_search)

7. مقارنة المتجهات

لدينا الآن قائمة بالمتجهات في قاعدة البيانات المحاكية وسؤال تم تحويله إلى متجه. وهذا يعني أنّه يمكننا الآن مقارنة متجه السؤال بجميع المتجهات في قاعدة البيانات لمعرفة المتجه الأقرب للإجابة عن سؤالنا بدقة أكبر.

لتحقيق ذلك، سنقيس المسافة بين متجه السؤال وكل متجه في قاعدة البيانات. هناك عدة أساليب لقياس المسافات بين المتجهات، وفي هذا الدرس التطبيقي تحديدًا، سنستخدم المسافة الإقليدية أو معيار L2.

73ea8635c4570bea.png

في Python، يمكننا الاستفادة من دالة numpy لإنجاز ذلك.

انسخ الرمز أدناه والصقه في خلية جديدة:

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position
        
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')

يجب أن تبدو النتيجة على النحو التالي:

b70563b50ea86668.png

لنتعرّف على الرمز

نبدأ بتحويل العمود الذي يحتوي على النص المضمّن أو متجهات قاعدة البيانات إلى قائمة وتخزينها في list_embedded_text_from_db.

لقد أضفنا أيضًا قيمة ابتدائية للمتغير shortest_distance وهي 1 من أجل مواصلة تعديله إلى أن نعثر على أقصر مسافة فعلية.

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1

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

باستخدام الدالة linalg.norm من numpy، نحسب المسافة بينهما.

إذا كانت المسافة المحسوبة أقل من المسافة في المتغير shortest_distance، سيتم ضبط المسافة المحسوبة على هذا المتغير

بعد ذلك، نسجّل أقصر مسافة بالإضافة إلى الموضع في القائمة الذي تم العثور عليه فيه. في المتغيّرَين shortest_distance وshortest_position

for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position

8. النتائج

بعد معرفة الموضع في قائمة المتّجه الذي يتضمّن أقصر مسافة بين السؤال وقاعدة البيانات، يمكننا طباعة النتائج.

انسخ الرمز أدناه والصقه في خلية جديدة:

print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
      df_embedded_values_db.at[shortest_position, 'Title']+": "+
      df_embedded_values_db.at[shortest_position, 'Text'])

بعد تنفيذها، ستحصل على نتيجة مشابهة لما يلي:

7a0e429171a19afe.png

9- تهانينا

تهانينا، لقد نجحت في إنشاء تطبيقك الأول باستخدام نموذج textembedding-gecko@003 في حالة استخدام حقيقية.

تعرّفت على أساسيات عمليات تضمين النصوص وكيفية استخدام نموذج gecko003 على GCP Workbench.

أنت الآن تعرف الخطوات الأساسية المطلوبة لمواصلة تطبيق معرفتك على المزيد من حالات الاستخدام.

ما هي الخطوات التالية؟

اطّلِع على بعض دروس الترميز التطبيقية هذه...

المستندات المرجعية