1. نظرة عامة
في هذا الدرس التطبيقي، ستُنشئ برنامجًا ذكيًا للرسائل الفورية يقترح الأفلام من خلال الجمع بين إمكانات Neo4j وGoogle Vertex AI وGemini. يعتمد هذا النظام على "الرسم البياني المعرفي Neo4j" الذي يصوّر الأفلام والممثلين والمخرجين والأنواع وغير ذلك من خلال شبكة غنية من العقد والعلاقات المترابطة.
لتحسين تجربة المستخدم من خلال الفهم الدلالي، عليك إنشاء عمليات تضمين متجهات من ملخّصات حبكات الأفلام باستخدام نموذج text-embedding-004
(أو إصدار أحدث) من Vertex AI. ويتم فهرسة هذه البيانات المضمّنة في Neo4j لاستردادها بسرعة استنادًا إلى التشابه.
أخيرًا، يمكنك دمج Gemini لتوفير واجهة حوارية يمكن للمستخدمين من خلالها طرح أسئلة بلغة طبيعية، مثل "ما الذي يجب مشاهدته إذا أعجبني فيلم Interstellar؟"، والحصول على اقتراحات مخصّصة للأفلام استنادًا إلى التشابه الدلالي والسياق المستنِد إلى الرسم البياني.
من خلال ورشة رموز البرامج، ستطبّق نهجًا خطوة بخطوة على النحو التالي:
- إنشاء "رسم بياني معرفي" في Neo4j يتضمّن جهات وعلاقات ذات صلة بالأفلام
- إنشاء/تحميل نماذج نصية لملخّصات الأفلام باستخدام Vertex AI
- تنفيذ واجهة محادثة آلية في Gradio مدعومة من Gemini تجمع بين البحث بالاستناد إلى المتجهات وتنفيذ Cypher المستنِد إلى الرسم البياني
- (اختياري) نشر التطبيق على Cloud Run كتطبيق ويب مستقل
ما ستتعرّف عليه
- كيفية إنشاء وملء رسم بياني للمعرفة حول الأفلام باستخدام Cypher وNeo4j
- كيفية استخدام Vertex AI لإنشاء نماذج مضمّنة للنص الدلالي والعمل معها
- كيفية دمج النماذج اللغوية الكبيرة والرسوم البيانية المعرفية لاسترداد المعلومات الذكي باستخدام GraphRAG
- كيفية إنشاء واجهة محادثة سهلة الاستخدام باستخدام Gradio
- كيفية النشر اختياريًا على Google Cloud Run
المتطلبات
- متصفّح الويب Chrome
- حساب Gmail
- مشروع على Google Cloud مفعّلة فيه الفوترة
- حساب مجاني على قاعدة بيانات Neo4j Aura
- الإلمام الأساسي بأوامر وحدة التحكّم ولغة بايثون (مفيد ولكن ليس ضروريًا)
تم تصميم هذا الدرس التطبيقي حول الترميز للمطوّرين من جميع المستويات (بما في ذلك المبتدئون)، ويستخدم لغة Python وNeo4j في نموذج تطبيقه. على الرغم من أنّ المعرفة الأساسية بلغة Python وقواعد بيانات الرسوم البيانية قد تكون مفيدة، لا يلزم وجود خبرة سابقة لفهم المفاهيم أو اتّباع الخطوات.
2. إعداد Neo4j AuraDB
Neo4j هي قاعدة بيانات رسوم بيانية أساسية رائدة تخزِّن البيانات كشبكة من العقد (الكيانات) والعلاقات (عمليات الربط بين الكيانات)، ما يجعلها مثالية لحالات الاستخدام التي يكون فيها فهم عمليات الربط أمرًا أساسيًا، مثل الاقتراحات ورصد عمليات الاحتيال والرسوم البيانية المعرفية وغير ذلك. على عكس قواعد البيانات العلائقية أو المستندة إلى المستندات التي تعتمد على الجداول الثابتة أو الهياكل التسلسلية، يتيح نموذج الرسم البياني المرن في Neo4j تمثيل البيانات المعقدة والمترابطة بشكل سهل وفعّال.
بدلاً من تنظيم البيانات في صفوف وجداول مثل قواعد البيانات الارتباطية، يستخدم Neo4j نموذجًا بيانيًا يتم فيه تمثيل المعلومات على شكل عقد (عناصر) وعلاقات (عمليات الربط بين هذه العناصر). يسهّل هذا النموذج بشكلٍ استثنائي العمل مع البيانات المرتبطة بطبيعتها، مثل الأشخاص أو الأماكن أو المنتجات أو، في حالتنا، الأفلام والممثلين والأنواع.
على سبيل المثال، في مجموعة بيانات الأفلام:
- يمكن أن تمثّل العقدة
Movie
أوActor
أوDirector
. - يمكن أن تكون العلاقة
ACTED_IN
أوDIRECTED
.
تتيح لك هذه البنية طرح أسئلة بسهولة، مثل:
- ما هي الأفلام التي ظهر فيها هذا الممثل؟
- مَن هم صنّاع الأفلام الذين عملوا مع كريستوفر نولان؟
- ما هي الأفلام المشابهة استنادًا إلى الممثلين أو الأنواع المشتركة؟
يوفّر Neo4j لغة استعلامات فعّالة تُسمى Cypher، وهي مصمّمة خصيصًا لإجراء استعلامات عن الرسوم البيانية. يتيح لك Cypher التعبير عن الأنماط والعلاقات المعقدة بطريقة موجزة وسهلة القراءة.
يوفّر Neo4j خيارات نشر متعددة حسب احتياجاتك:
- الإدارة الذاتية: يمكنك تشغيل Neo4j على البنية الأساسية الخاصة بك باستخدام Neo4j Desktop أو كصورة Docker (داخل مقرّ الشركة أو في السحابة الإلكترونية الخاصة بك).
- مُدار من خلال السحابة الإلكترونية: يمكنك نشر Neo4j على مقدّمي خدمات السحابة الإلكترونية الرائجين باستخدام عروض السوق.
- مُدارة بالكامل: استخدِم Neo4j AuraDB، وهي خدمة قاعدة بيانات على السحابة الإلكترونية مُدارة بالكامل من Neo4j، وتتولى هذه الخدمة إدارة عمليات التوفير والتوسيع والاحتفاظ بنسخة احتياطية والأمان نيابةً عنك.
في هذا الدرس البرمجي، سنستخدم Neo4j AuraDB Free، وهو المستوى المجاني من AuraDB. وتوفّر هذه الخدمة مثيلًا مُدارًا بالكامل لقاعدة بيانات الرسوم البيانية مع مساحة تخزين وميزات كافية لإنشاء النماذج الأولية والتعلّم وإنشاء تطبيقات صغيرة، ما يناسب هدفنا المتمثل في إنشاء برنامج محادثة آلي يقترح الأفلام استنادًا إلى الذكاء الاصطناعي التوليدي.
ستنشئ مثيلًا مجانيًا من AuraDB، وتربطه بتطبيقك باستخدام بيانات اعتماد الاتصال، وتستخدمه لتخزين الرسم البياني المعرفي للأفلام وإجراء استعلامات عليه خلال هذا البرنامج التدريبي.
أهمية الرسوم البيانية
في قواعد البيانات الارتباطية التقليدية، سيتطلّب الإجابة عن أسئلة مثل "ما هي الأفلام المشابهة لفيلم Inception استنادًا إلى فريق التمثيل أو النوع المشترك؟" عمليات JOIN معقّدة على مستوى جداول متعددة. ومع زيادة عمق العلاقات، ينخفض الأداء وسهولة القراءة.
أمّا قواعد بيانات الرسوم البيانية، مثل Neo4j، فهي مصمّمة لاستكشاف العلاقات بكفاءة، ما يجعلها مناسبة بشكلٍ طبيعي لأنظمة الاقتراحات والبحث الدلالي والمساعدين الذكيين. وتساعد هذه النماذج في تسجيل السياق الواقعي، مثل شبكات التعاون أو القصص أو الإعدادات المفضّلة للمشاهدين، والتي قد يكون من الصعب تمثيلها باستخدام نماذج البيانات التقليدية.
من خلال الجمع بين هذه البيانات المرتبطة والنماذج اللغوية الكبيرة مثل Gemini وعمليات إدراج المتجهات من Vertex AI، يمكننا تحسين تجربة محادثة chatbot، ما يتيح لها الاستدلال والاسترجاع والردّ بطريقة أكثر تخصيصًا وصلة بالموضوع.
إنشاء Neo4j AuraDB مجاني
- انتقِل إلى https://console.neo4j.io.
- سجِّل الدخول باستخدام حسابك على Google أو بريدك الإلكتروني.
- انقر على "إنشاء مثيل مجاني".
- أثناء توفير المثيل، ستظهر نافذة منبثقة تعرض بيانات اعتماد الاتصال بقاعدة بياناتك.
احرص على تنزيل التفاصيل التالية من النافذة المنبثقة وحفظها بأمان، فهذه التفاصيل ضرورية لربط تطبيقك بخدمة 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 في الخطوة التالية.
إنّ Neo4j AuraDB Free ملائم تمامًا للتطوير والتجربة والتطبيقات على نطاق صغير، مثل هذا الدرس التطبيقي حول الترميز. ويقدّم هذا التنسيق حدود استخدام سخية، إذ يتيح ما يصل إلى 200,000 عقدة و400,000 علاقة. على الرغم من أنّه يقدّم جميع الميزات الأساسية اللازمة لإنشاء رسم بياني معرفي وإجراء طلبات بحث عنه، لا يتيح هذا الإصدار الإعدادات المتقدّمة، مثل الإضافات المخصّصة أو مساحة التخزين الإضافية. بالنسبة إلى أعباء العمل في مرحلة الإنتاج أو مجموعات البيانات الأكبر حجمًا، يمكنك الترقية إلى خطة AuraDB من المستوى الأعلى التي توفّر سعة وأداءً وميزات على مستوى المؤسسة.
يُكمِل هذا القسم قسم إعداد الخلفية في Neo4j AuraDB. في الخطوة التالية، سننشئ مشروعًا على Google Cloud ونكرّر المستودع ونضبط متغيّرات البيئة اللازمة لإعداد بيئة التطوير قبل البدء في إنشاء رمزنا البرمجي.
3- قبل البدء
إنشاء مشروع
- في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في أحد المشاريع .
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بخدمة Cloud Shell، عليك التحقّق من أنّك سبق أن تم مصادقة حسابك وأنّ المشروع قد تم ضبطه على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
- شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
- فعِّل واجهات برمجة التطبيقات المطلوبة من خلال الأمر الموضَّح أدناه. قد تستغرق هذه العملية بضع دقائق، لذا يُرجى الانتظار.
gcloud services enable cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
عند تنفيذ الأمر بنجاح، من المفترض أن تظهر لك رسالة: "انتهت العملية .... بنجاح".
يمكنك استخدام وحدة التحكّم للبحث عن كل منتج أو استخدام هذا الرابط كبديل لأمر gcloud.
إذا فاتتك أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.
راجِع المستندات لمعرفة أوامر gcloud وكيفية استخدامها.
استنساخ المستودع وإعداد إعدادات البيئة
الخطوة التالية هي استنساخ نموذج المستودع الذي سنشير إليه في بقية ورشة رموز البرامج. بافتراض أنّك تستخدم Cloud Shell، أدخِل الأمر التالي من دليلك الرئيسي:
git clone https://github.com/sidagarwal04/neo4j-vertexai-codelab.git
لتشغيل المحرِّر، انقر على "فتح المحرِّر" في شريط الأدوات في نافذة Cloud Shell. انقر على شريط القوائم في أعلى يمين الشاشة واختَر ملف (File) → فتح مجلد (Open Folder) كما هو موضّح أدناه:
اختَر المجلد neo4j-vertexai-codelab
ومن المفترض أن يظهر المجلد مفتوحًا ببنية مشابهة إلى حدٍ ما كما هو موضّح أدناه:
بعد ذلك، علينا إعداد متغيّرات البيئة التي سيتم استخدامها في جميع أنحاء ورشة رموز البرامج. انقر على ملف 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. إعداد مجموعة بيانات "الأفلام"
مهمتنا الأولى هي إعداد مجموعة بيانات الأفلام التي سنستخدمها لإنشاء مخطّط المعرفة وتعزيز خدمة الدردشة الآلية التي تقدّم اقتراحات. بدلاً من البدء من الصفر، سنستخدم مجموعة بيانات مفتوحة حالية ونطوّرها.
سنستخدم مجموعة بيانات الأفلام التي أنشأها "روناك بانيك"، وهي مجموعة بيانات عامة معروفة متاحة على Kaggle. تتضمّن هذه البيانات أكثر من 45,000 فيلم من TMDB، بما في ذلك الممثلون وطاقم العمل والكلمات الرئيسية والتقييمات وغير ذلك.
لإنشاء برنامج محادثة موثوق وفعّال لاقتراح الأفلام، من الضروري البدء ببيانات نظيفة ومتسقة ومنظَّمة. على الرغم من أنّ مجموعة بيانات الأفلام من Kaggle هي مصدر غني يحتوي على أكثر من 45,000 سجلّ فيلم وبيانات وصفية مفصّلة، بما في ذلك الأنواع والممثلون وطاقم العمل وغير ذلك، إلا أنّها تحتوي أيضًا على بيانات غير مرغوب فيها وعدم اتساق وبنى بيانات متداخلة ليست مثالية لوضع نماذج للرسوم البيانية أو التضمين الدلالي.
لحلّ هذه المشكلة، عالجنا مجموعة البيانات ونمّناها لضمان ملاءمتها لإنشاء رسم بياني للمعرفة في Neo4j وإنشاء نماذج إدراج عالية الجودة. تشمل هذه العملية ما يلي:
- إزالة السجلات المكرّرة وغير المكتملة
- توحيد الحقول الرئيسية (مثل أسماء الأنواع وأسماء الأشخاص)
- تسطيح الهياكل المعقدة المتداخلة (مثل الممثلين وطاقم العمل) في ملفات CSV منظَّمة
- اختيار مجموعة فرعية تمثيلية من 12,000 فيلم تقريبًا للبقاء ضمن حدود Neo4j AuraDB Free
تساعد البيانات المنسَّقة العالية الجودة في ضمان ما يلي:
- جودة البيانات: تقليل الأخطاء والتناقضات للحصول على اقتراحات أكثر دقة
- أداء طلبات البحث: تؤدي البنية المبسّطة إلى تحسين سرعة استرجاع البيانات وتقليل التكرار
- دقة التضمين: تؤدي المدخلات النظيفة إلى إنشاء embeddings متّسقة مع السياق وأكثر فائدة
يمكنك الوصول إلى مجموعة البيانات التي تمّت تصفيتها وتسويتها في مجلّد normalized_data/
في مستودع GitHub هذا. تتم أيضًا نسخ مجموعة البيانات هذه في حزمة على Google Cloud Storage لتسهيل الوصول إليها في النصوص البرمجية القادمة لبرنامج Python.
بعد تنظيف البيانات وإعدادها، أصبحنا جاهزين الآن لتحميلها إلى Neo4j والبدء في إنشاء مخطّطنا المعرفي للأفلام.
5- إنشاء "الرسم البياني المعرفي للأفلام"
لتزويد برنامجنا الحواري المقترِح للأفلام والمزوّد بالذكاء الاصطناعي التوليدي (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_data/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. إنشاء embeddings وتحميلها لإجراء بحث التشابه بين المتجهات
لتفعيل البحث الدلالي في محادثتنا الآلية، علينا إنشاء نماذج مصغّرة للخلاصات حول الأفلام. وتحوّل هذه العناصر المضمّنة البيانات النصية إلى متجهات رقمية يمكن مقارنتها من حيث التشابه، ما يتيح لمحادثة chatbot استرجاع الأفلام ذات الصلة حتى إذا لم يتطابق طلب البحث مع العنوان أو الوصف بالضبط.
الخيار 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"
بعد تحميل البيانات المضمّنة في Neo4j، يصبح الرسم البياني المعرفي للأفلام مدركًا للسياق، ما يعني أنّه مستعد لدعم البحث الفعّال باللغة الطبيعية باستخدام التشابه بين المتجهات.
7. روبوت الدردشة المخصّص لاقتراح الأفلام
بعد الانتهاء من إعداد الرسم البياني المعرفي وعمليات تضمين المتجهات، حان وقت تجميع كل العناصر في واجهة حوارية تعمل بكامل طاقتها، وهي مساعد الدردشة الذكي لاقتراح الأفلام المستنِد إلى الذكاء الاصطناعي التوليدي.
تم تنفيذ هذا المحادثة الآلي بلغة Python باستخدام Gradio، وهو إطار عمل ويب خفيف الوزن لإنشاء واجهات مستخدم بسيطة. يتوفّر المنطق الأساسي في app.py
، الذي يتصل بمثيل Neo4j AuraDB ويستخدم Google Vertex AI وGemini لمعالجة طلبات البحث باللغة الطبيعية والردّ عليها.
كيفية العمل
- يكتب المستخدم طلب بحث بلغة طبيعيةمثل: "أريد أن تقترح عليّ أفلام خيال علمي مثيرة مثل Interstellar"
- إنشاء تمثيل اتجاهي للطلب باستخدام نموذج
text-embedding-004
في Vertex AI - إجراء بحث باستخدام المتجهات في Neo4j لاسترداد الأفلام المتشابهة من الناحية الدلالية
- استخدام Gemini لإجراء ما يلي:
- تفسير طلب البحث في السياق
- إنشاء طلب بحث Cypher مخصّص استنادًا إلى نتائج البحث بالاستناد إلى المتجهات ومخطّط Neo4j
- تنفيذ طلب البحث لاستخراج بيانات الرسم البياني ذات الصلة (مثل الممثلين والمخرجين والأنواع)
- تلخيص النتائج بطريقة حوارية للمستخدم
يجمع هذا النهج المختلط، المعروف باسم GraphRAG (Graph Retrieval-Augmented Generation)، بين الاسترجاع الدلالي والاستدلال المنظَّم لتقديم اقتراحات أكثر دقة وسياقًا وقابلية للتفسير.
تشغيل Chatbot على الجهاز
فعِّل بيئتك الافتراضية (إذا لم تكن مفعّلة)، ثم ابدأ محادثة مع chatbot باستخدام:
python app.py
من المفترض أن يظهر لك ناتج مماثل لما يلي:
Vector index 'overview_embeddings' already exists. No need to create a new one.
* Running on local URL: http://0.0.0.0:8080
To create a public link, set `share=True` in `launch()`.
💡 لمشاركة محادثة chatbot خارجيًا، اضبط share=True
في الدالة launch()
في app.py
.
التفاعل مع روبوت الدردشة
افتح عنوان URL المحلي المعروض في وحدة التحكّم (عادةً http://0.0.0.0:8080
) للوصول إلى واجهة المحادثة المبرمَجة.
جرِّب طرح أسئلة مثل:
- "ما هي الأفلام التي يمكنني مشاهدتها إذا أعجبني فيلم Interstellar؟"
- "اقتراح فيلم رومانسي من إخراج نورا إفرون"
- "أريد مشاهدة فيلم عائلي يضم توم هانكس"
- "أريد البحث عن أفلام تشويق تتضمّن الذكاء الاصطناعي"
سينفّذ روبوت الدردشة ما يلي:
✅ فهم الطلب
✅ العثور على حبكات أفلام مشابهة من الناحية الدلالية باستخدام عمليات التضمين
✅ إنشاء طلب بحث Cypher وتنفيذه لعرض سياق الرسم البياني ذي الصلة
✅ عرض اقتراح مخصّص ووديّ في ثوانٍ
المحتوى الحالي
لقد أنشأت للتو محادثة آلية بشأن الأفلام بالاستناد إلى GraphRAG تجمع ما يلي:
- البحث بالاستناد إلى المتجهات لتحديد مدى الصلة الدلالية
- الاستدلال في الرسم البياني المعرفي باستخدام Neo4j
- إمكانات التعلم الآلي اللغوي من خلال Gemini
- واجهة محادثة سلسة باستخدام Gradio
تشكّل هذه البنية الأساسية الأساس الذي يمكنك من خلاله توسيع نطاق أنظمة البحث أو الاقتراحات أو الاستدلال الأكثر تقدمًا المستندة إلى الذكاء الاصطناعي التوليدي.
8. (اختياري) النشر على Google Cloud Run
إذا أردت إتاحة إمكانية وصول الجميع إلى برنامج Chatbot لاقتراح الأفلام، يمكنك نشره على Google Cloud Run، وهي منصة مُدارة بالكامل بدون خادم تعمل على توسيع نطاق تطبيقك تلقائيًا وتزيل كل المخاوف المتعلقة بالبنية الأساسية.
يستخدم هذا النشر ما يلي:
-
requirements.txt
- لتحديد متطلّبات Python (Neo4j وVertex AI وGradio وما إلى ذلك) Dockerfile
- لحزمة التطبيق-
.env.yaml
- لتمرير متغيّرات البيئة بأمان في وقت التشغيل
الخطوة 1: الاستعداد .env.yaml
أنشئ ملفًا باسم .env.yaml
في الدليل الجذر يتضمّن المحتوى التالي:
NEO4J_URI: "neo4j+s://<your-aura-db-uri>"
NEO4J_USER: "neo4j"
NEO4J_PASSWORD: "<your-password>"
PROJECT_ID: "<your-gcp-project-id>"
LOCATION: "<your-gcp-region>" # e.g. us-central1
💡 يُفضّل استخدام هذا التنسيق على --set-env-vars
لأنّه أكثر قابلية للتوسّع والتحكّم في الإصدارات وسهولة القراءة.
الخطوة 2: إعداد متغيّرات البيئة
في المحطة الطرفية، اضبط متغيّرات البيئة التالية (استبدِل قيم العناصر النائبة بإعدادات مشروعك الفعلية):
# 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
يمكنك الآن نشر تطبيقك باستخدام ملف .env.yaml
لضبط الإعدادات أثناء التشغيل:
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 \
--env-vars-file=.env.yaml
الوصول إلى الدردشة المبرمَجة
بعد نشر التطبيق، ستوفّر خدمة Cloud Run عنوان URL علنيًا على النحو التالي:
https://movies-reco-[UNIQUE_ID].${GCP_REGION}.run.app
افتح عنوان URL هذا في متصفّحك للوصول إلى واجهة محادثة Gradio المُستخدَمة، وهي جاهزة لعرض اقتراحات الأفلام باستخدام GraphRAG وGemini وNeo4j.
ملاحظات ونصائح
- تأكَّد من أنّ
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
إحدى الخدمات (إن لم تكن الخدمة الوحيدة) المدرَجة هناك.
يمكنك الاطّلاع على تفاصيل الخدمة، مثل عنوان URL والإعدادات والسجلات وغير ذلك، من خلال النقر على اسم الخدمة المحدّد (movies-chatbot
في حالتنا).
وبهذا، أصبح برنامج Chatbot لاقتراح الأفلام مُستخدَمًا وقابلًا للتوسّع ومشاركته. 🎉
9- تَنظيم
لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:
- في وحدة تحكّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
10. تهانينا
لقد نجحت في إنشاء ونشر روبوت محادثة لاقتراح الأفلام مستنِد إلى GraphRAG ومحسَّن بالذكاء الاصطناعي التوليدي باستخدام Neo4j وVertex AI وGemini. من خلال الجمع بين إمكانات النمذجة المستندة إلى الرسم البياني في Neo4j والبحث الدلالي من خلال Vertex AI وتحليل اللغة الطبيعية من خلال Gemini، يمكنك إنشاء نظام ذكي يتجاوز البحث الأساسي، فهو يفهم نية المستخدم ويحلل البيانات المرتبطة ويردّ على شكل محادثة.
في هذا الدليل التعليمي حول الرموز البرمجية، حقّقت ما يلي:
✅ إنشاء رسم بياني معرفي للأفلام في العالم الواقعي في Neo4j لتصميم الأفلام والممثلين والأنواع والعلاقات
✅ إدراج المتجهات التي تم إنشاؤها لملخّصات قصص الأفلام باستخدام نماذج إدراج النصوص في Vertex AI
✅ تنفيذ GraphRAG، الذي يجمع بين البحث بالاستناد إلى المتجهات واستعلامات Cypher التي يتم إنشاؤها من خلال نموذج تعلُّم لغوي كبير (LLM) لإجراء عمليات استدلال أكثر عمقًا ومتعددة الخطوات
✅ Gemini المدمَج لتفسير أسئلة المستخدمين وإنشاء طلبات بحث Cypher وتلخيص نتائج الرسوم البيانية بلغة طبيعية
✅ إنشاء واجهة محادثة سهلة الاستخدام باستخدام Gradio
✅ نشر برنامج المحادثة الآلي اختياريًا على Google Cloud Run لاستضافة قابلة للتطوير بدون خادم
الخطوات التالية:
لا تقتصر هذه البنية على اقتراحات الأفلام، بل يمكن توسيع نطاقها ليشمل ما يلي:
- منصّات استكشاف الكتب والموسيقى
- مساعِدون في الأبحاث الأكاديمية
- محركات اقتراح المنتجات
- مساعِدون مختصون بالمعرفة في مجال الرعاية الصحية والشؤون المالية والقانونية
في أي مكان تتوفّر فيه علاقات معقّدة وبيانات نصية غنية، يمكن أن يعزّز هذا المزيج من الرسوم البيانية للمعرفة والنماذج اللغوية الكبيرة والنماذج التضمينية الدلالية الجيل التالي من التطبيقات الذكية.
مع تطور نماذج الذكاء الاصطناعي التوليدي (GenAI) للوسائط المتعددة، مثل Gemini، ستتمكّن من دمج سياق وصور وصوت وتخصيص أكثر ثراءً لإنشاء أنظمة تركّز على المستخدمين حقًا.
يُرجى مواصلة الاستكشاف والإنشاء، ولا تنسَ الاطّلاع على آخر الأخبار من Neo4j وVertex AI وGoogle Cloud للارتقاء بتطبيقاتك الذكية إلى مستوى أفضل. يمكنك الاطّلاع على المزيد من الأدلة التعليمية العملية حول الرسم البياني المعرفي على Neo4j GraphAcademy.