Codelab - إنشاء روبوت دردشة لاقتراح الأفلام باستخدام Neo4j وVertex AI

Codelab - إنشاء روبوت دردشة لاقتراح الأفلام باستخدام Neo4j وVertex AI

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: أبريل 4, 2025
account_circleتأليف: Romin Irani and Siddhant Agarwal(GDE)

1. نظرة عامة

في هذا الدليل التعليمي حول رموز البرامج، ستنشئ برنامجًا محادثة ذكيًا لاقتراح الأفلام باستخدام مجموعة من Neo4j وVertex AI وGemini. يستخدم تطبيق المحادثة الآلية "مخطّط معلومات Neo4j" كأساس لتمثيل الأفلام والممثلين والمخرجين والمنتجين والأنواع وما إلى ذلك. لتحسين تجربة البحث، عليك إنشاء embeddings متّجه من النظرة العامة على حبكة الفيلم باستخدام نموذج text-embedding-004 من Vertex AI.

أخيرًا، يمكنك دمج Gemini لتوفير واجهة حوارية يمكن للمستخدمين من خلالها طرح أسئلة بلغة طبيعية، مثل "ما الذي يجب مشاهدته إذا أعجبني فيلم Interstellar؟"، والحصول على اقتراحات مخصّصة للأفلام استنادًا إلى التشابه الدلالي والسياق المستنِد إلى الرسم البياني.

من خلال ورشة رموز البرامج، ستطبّق نهجًا خطوة بخطوة على النحو التالي:

  1. إنشاء رسم بياني معرفي في Neo4j باستخدام بيانات متعلقة بالأفلام
  2. يمكنك تحسين بيانات الأفلام من خلال إنشاء embeddings نصية في المقتطفات أو الحبكات باستخدام embeddings النصية في Vertex AI.
  3. أنشئ واجهة محادثة آلية في Gradio مدعومة بخدمة Gemini لإجراء البحث الدلالي والاسترجاع من Neo4j الذي يجمع كل شيء معًا.
  4. يمكنك اختياريًا نشره على Google Cloud Run كتطبيق ويب مستقل كما هو موضّح أدناه:

ما ستتعرّف عليه

  • كيفية إنشاء رسم بياني للمعرفة حول الأفلام باستخدام Cypher وNeo4j
  • كيفية استخدام Vertex AI لإنشاء نماذج إدراج دلالية للنص
  • كيفية دمج Neo4j وGemini لاسترداد المعلومات الذكي المستنِد إلى المتجهات
  • كيفية إنشاء واجهة مستخدم لخدمة محادثة مبرمَجة وتشغيلها باستخدام Gradio

المتطلبات

  • متصفّح الويب Chrome
  • حساب Gmail
  • مشروع على Google Cloud مفعّلة فيه الفوترة
  • حساب مجاني على قاعدة بيانات Neo4j Aura
  • الإلمام الأساسي بطلبات وحدة التحكّم الطرفية ولغة Python

تم تصميم هذا الدرس التطبيقي حول الترميز للمطوّرين من جميع المستويات (بما في ذلك المبتدئون)، ويستخدم لغة Python وNeo4j في نموذج تطبيقه. على الرغم من أنّ الإلمام الأساسي بلغة Python وقواعد بيانات الرسوم البيانية يمكن أن يكون مفيدًا، لا يلزم وجود خبرة سابقة لفهم المفاهيم أو اتّباع الخطوات. 121747afa89e0e6.png

2. إعداد Neo4j AuraDB

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

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

على سبيل المثال، في مجموعة بيانات الأفلام:

  • يمكن أن تمثّل العقدة Movie أو Actor أو Director.
  • يمكن أن تكون العلاقة ACTED_IN أو DIRECTED.

تتيح لك هذه البنية طرح أسئلة بسهولة، مثل:

  • ما هي الأفلام التي ظهر فيها هذا الممثل؟
  • مَن هم صنّاع الأفلام الذين عملوا مع كريستوفر نولان؟
  • ما هي الأفلام المشابهة استنادًا إلى الممثلين أو الأنواع المشتركة؟

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

يوفّر Neo4j خيارات نشر متعددة حسب احتياجاتك:

  • الإدارة الذاتية: يمكنك تشغيل Neo4j على البنية الأساسية الخاصة بك باستخدام Neo4j Desktop أو كصورة Docker (داخل مقرّ الشركة أو في السحابة الإلكترونية الخاصة بك). 397a3c535b52d3f6.png
  • مُدار من خلال السحابة الإلكترونية: يمكنك نشر Neo4j على مزوّدي خدمات السحابة الإلكترونية الرائجين باستخدام عروض السوق.
  • مُدارة بالكامل: استخدِم Neo4j AuraDB، وهي خدمة قاعدة بيانات على السحابة الإلكترونية مُدارة بالكامل من Neo4j، وتتولى هذه الخدمة إدارة عمليات التوفير والتوسيع والاحتفاظ بنسخة احتياطية والأمان نيابةً عنك.

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

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

أهمية الرسوم البيانية

في قواعد البيانات الارتباطية التقليدية، سيتضمّن الإجابة عن أسئلة مثل "ما هي الأفلام المشابهة لفيلم Inception استنادًا إلى فريق التمثيل أو النوع المشترك؟" عمليات JOIN معقّدة على مستوى جداول متعددة. ومع زيادة عمق العلاقات، ينخفض الأداء وسهولة القراءة.

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

من خلال الجمع بين هذه البيانات المرتبطة والنماذج اللغوية الكبيرة مثل Gemini وعمليات إدراج المتجهات من Vertex AI، يمكننا تحسين تجربة محادثة chatbot، ما يتيح لها الاستدلال والاسترجاع والردّ بطريقة أكثر تخصيصًا وصلة بالموضوع.

إنشاء Neo4j AuraDB مجاني

  1. انتقِل إلى https://console.neo4j.io.
  2. سجِّل الدخول باستخدام حسابك على Google أو بريدك الإلكتروني.
  3. انقر على "إنشاء مثيل مجاني".
  4. أثناء توفير المثيل، ستظهر نافذة منبثقة تعرض بيانات اعتماد الاتصال بقاعدة بياناتك.

احرص على تنزيل التفاصيل التالية من النافذة المنبثقة وحفظها بأمان، فهذه التفاصيل ضرورية لربط تطبيقك بخدمة Neo4j:

NEO4J_URI=neo4j+s://<your-instance-id>.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=<your-generated-password>
AURA_INSTANCEID=<your-instance-id>
AURA_INSTANCENAME=<your-instance-name>

ستستخدم هذه القيم لضبط ملف ‎ .env في مشروعك للتحقّق من الهوية باستخدام Neo4j في الخطوة التالية.

a1e29e56e6c412fc.png

إنّ Neo4j AuraDB Free ملائم تمامًا للتطوير والتجربة والتطبيقات الصغيرة مثل هذا الدرس التطبيقي حول الترميز. ويقدّم هذا التنسيق حدود استخدام سخية، إذ يتيح ما يصل إلى 200,000 عقدة و400,000 علاقة. على الرغم من أنّه يقدّم جميع الميزات الأساسية اللازمة لإنشاء مخطّط معلومات وإجراء طلبات بحث عنه، لا يتيح هذا الإصدار الإعدادات المتقدّمة، مثل الإضافات المخصّصة أو مساحة التخزين الإضافية. بالنسبة إلى أعباء العمل في مرحلة الإنتاج أو مجموعات البيانات الأكبر حجمًا، يمكنك الترقية إلى خطة AuraDB من المستوى الأعلى التي توفّر سعة وأداءً وميزات على مستوى المؤسسة.

يُكمِل هذا القسم قسم إعداد الخلفية في Neo4j AuraDB. في الخطوة التالية، سننشئ مشروعًا على Google Cloud ونكرّر المستودع ونضبط متغيّرات البيئة اللازمة لإعداد بيئة التطوير قبل البدء في إنشاء رمزنا البرمجي.

3. قبل البدء

إنشاء مشروع

  1. في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في أحد المشاريع .
  3. ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".

تفعيل صورة زر Cloud Shell

  1. بعد الاتصال بخدمة Cloud Shell، عليك التحقّق من أنّك سبق أن تم مصادقة حسابك وأنّه تم ضبط المشروع على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
  1. شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
  1. إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
  1. فعِّل واجهات برمجة التطبيقات المطلوبة من خلال الأمر الموضَّح أدناه. قد تستغرق هذه العملية بضع دقائق، لذا يُرجى الانتظار.
gcloud services enable cloudresourcemanager.googleapis.com \
                       
servicenetworking.googleapis.com \
                       
run.googleapis.com \
                       
cloudbuild.googleapis.com \
                       
cloudfunctions.googleapis.com \
                       
aiplatform.googleapis.com

عند تنفيذ الأمر بنجاح، من المفترض أن تظهر لك رسالة مشابهة للرسالة الموضّحة أدناه:

Operation "operations/..." finished successfully.

يمكنك استخدام وحدة التحكّم للبحث عن كل منتج أو استخدام هذا الرابط كبديل لأمر gcloud.

إذا فاتتك أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.

راجِع المستندات لمعرفة أوامر gcloud وكيفية استخدامها.

استنساخ المستودع وإعداد إعدادات البيئة

الخطوة التالية هي استنساخ نموذج المستودع الذي سنشير إليه في بقية ورشة رموز البرامج. بافتراض أنّك تستخدم Cloud Shell، أدخِل الأمر التالي من دليلك الرئيسي:

git clone https://github.com/sidagarwal04/neo4j-vertexai-codelab.git

لتشغيل المحرِّر، انقر على "فتح المحرِّر" في شريط الأدوات في نافذة Cloud Shell. انقر على شريط القوائم في أعلى يمين الشاشة واختَر ملف (File) → فتح مجلد (Open Folder) كما هو موضّح أدناه:

66221fd0d0e5202f.png

اختَر مجلد neo4j-vertexai-codelab ومن المفترض أن يظهر لك المجلد مفتوحًا مع الملفات التالية كما هو موضّح أدناه:

e49542efd70de22e.png

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

NEO4J_URI=
NEO4J_USER=
NEO4J_PASSWORD=
NEO4J_DATABASE=
PROJECT_ID=
LOCATION=

أنشئ الآن ملفًا جديدًا باسم .env في المجلد نفسه الذي يتضمّن ملف example.env وانسخ محتوى ملف example.env الحالي. الآن، عدِّل المتغيّرات التالية:

  • NEO4J_URI وNEO4J_USER وNEO4J_PASSWORD وNEO4J_DATABASE:
  • املأ هذه القيم باستخدام بيانات الاعتماد المقدَّمة أثناء إنشاء مثيل Neo4j AuraDB Free في الخطوة السابقة.
  • يتم عادةً ضبط NEO4J_DATABASE على neo4j في AuraDB Free.
  • PROJECT_ID وLOCATION:
  • إذا كنت بصدد تشغيل دورة تعليمية عن البرمجة من Google Cloud Shell، يمكنك ترك هذه الحقول فارغة، لأنّه سيتم استنتاجها تلقائيًا من إعدادات مشروعك النشط.
  • إذا كنت تُجري التنفيذ على الجهاز أو خارج Cloud Shell، عدِّل PROJECT_ID باستخدام معرّف مشروع Google Cloud الذي أنشأته سابقًا، واضبط LOCATION على المنطقة التي اخترتها لذلك المشروع (مثل us-central1).

بعد ملء هذه القيم، احفظ ملف .env. ستسمح هذه الإعدادات لتطبيقك بالاتصال بخدمة Neo4j وخدمة Vertex AI.

الخطوة الأخيرة في إعداد بيئة التطوير هي إنشاء بيئة افتراضية لـ Python وتثبيت جميع التبعيات المطلوبة المدرَجة في ملف requirements.txt. وتشمل هذه التبعيات المكتبات اللازمة للعمل مع Neo4j وVertex AI وGradio وغيرها.

أولاً، أنشئ بيئة افتراضية باسم venv .من خلال تنفيذ الأمر التالي:

python -m venv .venv

بعد إنشاء البيئة، سنحتاج إلى تفعيل البيئة التي تم إنشاؤها باستخدام الأمر التالي:

source .venv/bin/activate

من المفترض أن يظهر لك الآن (‎.venv) في بداية طلب المحطة الطرفية، ما يشير إلى أنّ البيئة نشطة. مثلاً: (.venv) yourusername@cloudshell:

الآن، ثبِّت التبعيات المطلوبة من خلال تشغيل:

pip install -r requirements.txt

في ما يلي لمحة عن التبعيات الرئيسية المدرَجة في الملف:

gradio>=4.0.0
neo4j>=5.0.0
numpy>=1.20.0
python-dotenv>=1.0.0
google-cloud-aiplatform>=1.30.0
vertexai>=0.0.1

بعد تثبيت جميع الملحقات بنجاح، سيتم ضبط بيئة Python المحلية بالكامل لتشغيل النصوص البرمجية ومحادثة chatbot في هذا الدليل التعليمي.

رائع. نحن الآن جاهزون للانتقال إلى الخطوة التالية، وهي فهم مجموعة البيانات وإعدادها لإنشاء الرسم البياني والإثراء الدلالي.

4. إعداد مجموعة بيانات &quot;الأفلام&quot;

مهمتنا الأولى هي إعداد مجموعة بيانات الأفلام التي سنستخدمها لإنشاء مخطّط المعرفة وتعزيز خدمة الدردشة الآلية التي تقدّم اقتراحات. بدلاً من البدء من الصفر، سنستخدم مجموعة بيانات مفتوحة حالية ونطوّرها.

سنستخدم مجموعة بيانات الأفلام التي أنشأها "روناك بانيك"، وهي مجموعة بيانات عامة معروفة متاحة على Kaggle. تتضمّن هذه البيانات أكثر من 45,000 فيلم من TMDB، بما في ذلك الممثلون وطاقم العمل والكلمات الرئيسية والتقييمات والمزيد.

9e3a1dc4c286af1b.png

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

لحلّ هذه المشكلة، عالجنا مجموعة البيانات ونمّناها لضمان ملاءمتها لإنشاء رسم بياني للمعرفة في Neo4j وإنشاء نماذج إدراج عالية الجودة. تشمل هذه العملية ما يلي:

  • إزالة السجلات المكرّرة وغير المكتملة
  • توحيد الحقول الرئيسية (مثل أسماء الأنواع وأسماء الأشخاص)
  • تسطيح الهياكل المعقدة المتداخلة (مثل الممثلين وطاقم العمل) في ملفات CSV منظَّمة
  • اختيار مجموعة فرعية تمثيلية من 12,000 فيلم تقريبًا للبقاء ضمن حدود Neo4j AuraDB Free

تساعد البيانات المنسَّقة العالية الجودة في ضمان ما يلي:

  • جودة البيانات: تقليل الأخطاء والتناقضات للحصول على اقتراحات أكثر دقة
  • أداء طلبات البحث: تؤدي البنية المبسّطة إلى تحسين سرعة استرجاع البيانات وتقليل التكرار
  • دقة التضمين: تؤدي المدخلات النظيفة إلى إنشاء embeddings متّسقة مع السياق وأكثر فائدة.

يمكنك الوصول إلى مجموعة البيانات التي تمّت تصفيتها وتسويتها في مجلد normalized_data/ في مستودع GitHub هذا. تتم أيضًا نسخ مجموعة البيانات هذه في حزمة على Google Cloud Storage لتسهيل الوصول إليها في النصوص البرمجية القادمة لبرنامج Python.

بعد تنظيف البيانات وإعدادها، أصبحنا جاهزين الآن لتحميلها إلى Neo4j والبدء في إنشاء مخطّطنا المعرفي للأفلام.

5. إنشاء &quot;الرسم البياني المعرفي للأفلام&quot;

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

سنستخدم ميزة LOAD CSV في Neo4j لاستيراد ملفات CSV المستضافة في حزمة علنية على Google Cloud Storage. تمثّل هذه الملفات مكوّنات مختلفة من مجموعة بيانات الأفلام، مثل الأفلام والأنواع والممثلين وطاقم العمل وشركات الإنتاج وتقييمات المستخدمين.

الخطوة 1: إنشاء القيود والفهارس

قبل استيراد البيانات، من الممارسات الجيدة إنشاء قيود وفهارس لفرض سلامة البيانات وتحسين أداء طلبات البحث.

CREATE CONSTRAINT unique_tmdb_id IF NOT EXISTS FOR (m:Movie) REQUIRE m.tmdbId IS UNIQUE;
CREATE CONSTRAINT unique_movie_id IF NOT EXISTS FOR (m:Movie) REQUIRE m.movieId IS UNIQUE;
CREATE CONSTRAINT unique_prod_id IF NOT EXISTS FOR (p:ProductionCompany) REQUIRE p.company_id IS UNIQUE;
CREATE CONSTRAINT unique_genre_id IF NOT EXISTS FOR (g:Genre) REQUIRE g.genre_id IS UNIQUE;
CREATE CONSTRAINT unique_lang_id IF NOT EXISTS FOR (l:SpokenLanguage) REQUIRE l.language_code IS UNIQUE;
CREATE CONSTRAINT unique_country_id IF NOT EXISTS FOR (c:Country) REQUIRE c.country_code IS UNIQUE;

CREATE INDEX actor_id IF NOT EXISTS FOR (p:Person) ON (p.actor_id);
CREATE INDEX crew_id IF NOT EXISTS FOR (p:Person) ON (p.crew_id);
CREATE INDEX movieId IF NOT EXISTS FOR (m:Movie) ON (m.movieId);
CREATE INDEX user_id IF NOT EXISTS FOR (p:Person) ON (p.user_id);

الخطوة 2: استيراد البيانات الوصفية للفيلم والعلاقة بين العناصر

لنلقِ نظرة على كيفية استيراد البيانات الوصفية للفيلم باستخدام الأمر LOAD CSV. ينشئ هذا المثال عقد "فيلم" تتضمّن سمات رئيسية، مثل العنوان والنظرة العامة واللغة ومدة التشغيل:

LOAD CSV WITH HEADERS FROM "https://storage.googleapis.com/neo4j-vertexai-codelab/normalized_movies.csv" AS row
WITH row, toInteger(row.tmdbId) AS tmdbId
WHERE tmdbId IS NOT NULL
WITH row, tmdbId
LIMIT 12000
MERGE (m:Movie {tmdbId: tmdbId})
ON CREATE SET m.title = coalesce(row.title, "None"),
             
m.original_title = coalesce(row.original_title, "None"),
             
m.adult = CASE
                           
WHEN toInteger(row.adult) = 1 THEN 'Yes'
                           
ELSE 'No'
                       
END,
             
m.budget = toInteger(coalesce(row.budget, 0)),
             
m.original_language = coalesce(row.original_language, "None"),
             
m.revenue = toInteger(coalesce(row.revenue, 0)),
             
m.tagline = coalesce(row.tagline, "None"),
             
m.overview = coalesce(row.overview, "None"),
             
m.release_date = coalesce(row.release_date, "None"),
             
m.runtime = toFloat(coalesce(row.runtime, 0)),
             
m.belongs_to_collection = coalesce(row.belongs_to_collection, "None");

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

تحميل الرسم البياني الكامل من خلال لغة Python

بدلاً من تنفيذ طلبات بحث Cypher متعددة يدويًا، ننصحك باستخدام النص البرمجي المبرمَج بلغة Python والمتوفر في هذا الدليل التعليمي.

يحمِّل النص البرمجي graph_build.py مجموعة البيانات بالكامل من GCS إلى مثيل Neo4j AuraDB باستخدام بيانات الاعتماد في ملف .env.

python graph_build.py

سيحمّل النص البرمجي جميع ملفات CSV اللازمة بشكل تسلسلي، وينشئ العقد والعلاقات، ويُنشئ مخطّط معلومات كاملاً للفيلم.

التحقّق من الرسم البياني

بعد التحميل، يمكنك التحقّق من الرسم البياني من خلال تنفيذ طلبات بحث Cypher بسيطة، مثل:

MATCH (m:Movie) RETURN m LIMIT 5;
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, m.title LIMIT 5;

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

6. إنشاء &quot;عمليات التضمين&quot; وتحميلها لإجراء &quot;بحث التشابه بين المتجهات&quot;

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

⚠️ ملاحظة حول الأداء

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

text-embedding-004

وخزّنها في ملف CSV متاح للجميع.

bcca07eaee60787b.png

الخيار 1: تحميل عمليات التضمين المحسوبة مسبقًا من خلال Cypher

لإرفاق عمليات التضمين بسرعة بعقد Movie المقابلة لها في Neo4j، نفِّذ الأمر Cypher التالي في متصفّح Neo4j:

LOAD CSV WITH HEADERS FROM 'https://storage.googleapis.com/neo4j-vertexai-codelab/movie_embeddings.csv' AS row
WITH row
MATCH (m:Movie {tmdbId: toInteger(row.tmdbId)})
SET m.embedding = apoc.convert.fromJsonList(row.embedding)

يقرأ هذا الأمر ناقلات التضمين من ملف CSV ويُرفقها كسمة (m.embedding) في كل عقدة Movie.

الخيار 2: تحميل البيانات المضمّنة باستخدام Python

يمكنك أيضًا تحميل النماذج المضمّنة آليًا باستخدام نص Python البرمجي المقدَّم. يكون هذا النهج مفيدًا إذا كنت تعمل في بيئتك الخاصة أو كنت تريد التشغيل الآلي للعملية:

python load_embeddings.py

يقرأ هذا النص البرمجي ملف CSV نفسه من GCS ويكتب البيانات المضمّنة في Neo4j باستخدام برنامج تشغيل Python Neo4j.

[اختياري] إنشاء عمليات التضمين بنفسك (للاستكشاف)

إذا كنت مهتمًا بمعرفة كيفية إنشاء البيانات المضمّنة، يمكنك استكشاف المنطق في نص generate_embeddings.py نفسه. وتستخدم هذه الميزة منصة Vertex AI لتضمين نص النظرة العامة على كل فيلم باستخدام نموذج text-embedding-004.

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

# os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "./service-account.json"

⚠️ سيؤدي تشغيل عملية إنشاء العناصر المضمّنة بالكامل إلى استخدام حصة Vertex AI ويمكن أن يستغرق وقتًا طويلاً، خاصةً مع الآلاف من السجلّات.

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

7. روبوت الدردشة لاقتراح الأفلام

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

يتم تنفيذ محادثة chatbot باستخدام Python وGradio، وهو إطار عمل خفيف الوزن لإنشاء واجهات مستخدم مستندة إلى الويب. يتوفّر المنطق الرئيسي في النص البرمجي chatbot.py الذي يتصل بمثيل Neo4j AuraDB وينفّذ بحث التشابه بين المتجهات على عمليات تضمين الأفلام استنادًا إلى طلبات اللغة الطبيعية.

يستخدم تطبيق الدردشة الآلية Gemini لتحسين تجربة المستخدم من خلال تحسين طلبات البحث وتنسيق الردود. يتم عرض نتائج البحث من Neo4j باستخدام مزيج من سياق الرسم البياني وتشابه المتجهات.

تشغيل Chatbot على الجهاز

لتشغيل chatbot، فعِّل بيئتك الافتراضية (إذا لم يسبق لك ذلك)، ثم نفِّذ ما يلي:

python chatbot.py

من المفترض أن يظهر لك ناتج مماثل لما يلي:

Old index dropped
Creating new vector index
Vector index created successfully
* Running on local URL:  http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.

💡 إذا ظهرت لك تحذيرات بشأن الإيقاف النهائي للسماح بالإشارة إلى المحتوى، يمكنك تجاهلها في الوقت الحالي، وسيظل التطبيق يعمل.

التفاعل مع روبوت الدردشة

بعد تشغيل البرنامج، افتح عنوان URL المعروض في المحطة الطرفية، وعادةً ما يكون على النحو التالي: 👉 http://127.0.0.1:7860

ستظهر لك واجهة محادثة بسيطة يمكنك من خلالها كتابة طلبات بحث بلغة طبيعية، مثل:

  • "أريد أن تقترح عليّ أفلام خيال علمي مثيرة مثل Inception"
  • "اقتراح فيلم رومانسي من بطولة توم هانكس"
  • "أريد مشاهدة دراما عائلية تبعث على الشعور بالسعادة"

c76b6c6e2bcb25d9.png

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

يتم عرض كل اقتراح بتنسيق بطاقة مع نتائج منسَّقة بعناية.

بعد تشغيل تطبيق المحادثة على الجهاز، أصبح لديك الآن نظام اقتراحات أفلام يعمل بشكل كامل بالاستناد إلى الذكاء الاصطناعي التوليدي (GenAI) ويجمع بين أفضل الرسوم البيانية المعرفية والنماذج اللغوية الكبيرة (Gemini) والبحث الدلالي باستخدام عمليات التضمين في Vertex AI.

8. (اختياري) النشر على Google Cloud Run

إذا أردت إتاحة إمكانية وصول الجميع إلى برنامج Chatbot لاقتراح الأفلام على الويب، يمكنك نشره على Google Cloud Run، وهي منصّة مُدارة بالكامل بدون خادم تعمل على توسيع نطاق تطبيقك تلقائيًا. 121747afa89e0e6.png

قبل النشر، تأكَّد من توفّر الملفات التالية في مشروعك (وهي مضمّنة في هذا المستودع):

  • requirements.txt: يسرد جميع ملفات Python التابعة المطلوبة لتشغيل التطبيق، بما في ذلك Neo4j وVertex AI.
  • Dockerfile: لتحديد بيئة الحاوية، بما في ذلك الصورة الأساسية وتثبيت الملحقات وطريقة تشغيل التطبيق

الخطوة 1: إعداد متغيّرات البيئة

في المحطة الطرفية، اضبط متغيّرات البيئة التالية (استبدِل قيم العناصر النائبة بإعدادات مشروعك الفعلية):

# Set your Google Cloud project ID
export GCP_PROJECT='your-project-id'  # Change this

# Set your preferred deployment region
export GCP_REGION='us-central1'

الخطوة 2: إنشاء "مستودع العناصر" وإنشاء الحاوية

# Artifact Registry repo and service name
export AR_REPO='your-repo-name'       # Change this
export SERVICE_NAME='movies-chatbot'  # Or any name you prefer

# Create the Artifact Registry repository
gcloud artifacts repositories create "$AR_REPO" \
 
--location="$GCP_REGION" \
 
--repository-format=Docker

# Authenticate Docker with Artifact Registry
gcloud auth configure-docker "$GCP_REGION-docker.pkg.dev"

# Build and submit the container image
gcloud builds submit \
 
--tag "$GCP_REGION-docker.pkg.dev/$GCP_PROJECT/$AR_REPO/$SERVICE_NAME"

يُنشئ هذا الأمر حِزمة لتطبيقك باستخدام Dockerfile ويحمِّل صورة الحاوية إلى Google Cloud Artifact Registry.

الخطوة 3: النشر على Cloud Run

قبل النشر، تأكَّد من ضبط جميع متغيّرات البيئة المطلوبة (مثل بيانات اعتماد Neo4j وإعدادات المشروع) في ملف .env.

استخدِم المقتطف التالي لتحويل ملف .env ديناميكيًا إلى تنسيق متوافق مع العلامة --set-env-vars:

ENV_VARS=$(grep -v '^#' .env | sed 's/ *= */=/g' | xargs -I{} echo -n "{},")
ENV_VARS=${ENV_VARS%,}

يمكنك الآن نشر تطبيقك باتّباع الخطوات التالية:

gcloud run deploy "$SERVICE_NAME" \
 
--port=8080 \
 
--image="$GCP_REGION-docker.pkg.dev/$GCP_PROJECT/$AR_REPO/$SERVICE_NAME" \
 
--allow-unauthenticated \
 
--region=$GCP_REGION \
 
--platform=managed \
 
--project=$GCP_PROJECT \
 
--set-env-vars="GCP_PROJECT=$GCP_PROJECT,GCP_REGION=$GCP_REGION,$ENV_VARS"

الوصول إلى الدردشة المبرمَجة

بعد نشر الخدمة، ستعرِض Cloud Run عنوان URL للخدمة المتاحة للجميع بالتنسيق التالي:

https://movies-chatbot-[UNIQUE_ID].${GCP_REGION}.run.app

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

ملاحظات ونصائح

  • تأكَّد من أنّ Dockerfile يشغِّل pip install -r requirements.txt أثناء عملية الإنشاء.
  • إذا كنت لا تستخدم Cloud Shell، عليك مصادقة بيئتك باستخدام حساب خدمة لديه أذونات Vertex AI وArtifact Registry.
  • يمكنك مراقبة سجلات النشر والمقاييس من Google Cloud Console > Cloud Run.

يمكنك أيضًا الانتقال إلى Cloud Run من وحدة تحكّم Google Cloud وستظهر لك قائمة الخدمات في Cloud Run. يجب أن تكون خدمة movies-chatbot إحدى الخدمات (إن لم تكن الخدمة الوحيدة) المدرَجة هناك.

bccf390b7099e73b.png

يمكنك الاطّلاع على تفاصيل الخدمة، مثل عنوان URL والإعدادات والسجلات وغير ذلك، من خلال النقر على اسم الخدمة المحدّد (movies-chatbot في حالتنا).

3709b596167cdaa0.png

وبهذا، أصبح برنامج Chatbot لاقتراح الأفلام مُستخدَمًا وقابلًا للتوسّع ومشاركته. 🎉

9. تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:

  1. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

10. تهانينا

لقد نجحت في إنشاء ونشر روبوت محادثة لاقتراح الأفلام المستنِد إلى الرسوم البيانية والمعزّز بالذكاء الاصطناعي التوليدي باستخدام Neo4j وVertex AI وGemini. من خلال الجمع بين إمكانات النمذجة الوصفية في Neo4j والقوة الدلالية لمستودعات Vertex AI وذكاء المحادثات في Gemini، يمكنك إنشاء نظام سهل الاستخدام وذكي يفهم طلبات البحث باللغة الطبيعية ويعرض اقتراحات أفلام ذات صلة بالسياق.

خلال هذا الدرس التطبيقي حول الترميز، يمكنك إجراء ما يلي:

  • إنشاء رسم بياني معرفي غني ومترابط من مجموعة بيانات أفلام حقيقية
  • إدراج المتجهات التي تم إنشاؤها ودمجها لتفعيل البحث عن التشابه الدلالي
  • الاستفادة من Gemini لتعزيز التفاعل باللغة الطبيعية
  • إنشاء واجهة روبوت محادثة بسيطة وفعّالة باستخدام Gradio
  • نشر التطبيق اختياريًا باستخدام Google Cloud Run لتوسيع نطاق الوصول وقابلية التوسّع

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

واصِل الاستكشاف والإنشاء، ولا تنسَ الاطّلاع على آخر الأخبار من Neo4j وVertex AI وGoogle Cloud للارتقاء بتطبيقاتك الذكية إلى مستوى أفضل.

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