إنشاء تطبيق محادثات يستند إلى نموذج لغوي كبير وتحليلات المشاعر باستخدام الذكاء الاصطناعي في AlloyDB وLangChain

1. مقدمة

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

98c2676cc78880e.png

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

المتطلبات الأساسية

  • فهم أساسي لواجهة Google Cloud Console
  • المهارات الأساسية في واجهة سطر الأوامر وGoogle Cloud Shell

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

  • كيفية نشر AlloyDB Cluster
  • كيفية الاتصال بخدمة AlloyDB
  • كيفية إعداد خدمة استرجاع المعلومات من قواعد البيانات بالذكاء الاصطناعي التوليدي ونشرها
  • كيفية نشر نموذج تطبيق باستخدام الخدمة المنشورة

المتطلبات

  • حساب Google Cloud ومشروع Google Cloud
  • متصفح ويب، مثل Chrome

2. الإعداد والمتطلبات

إعداد البيئة حسب السرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديلها في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم ورشات عمل رموز البرامج، عليك الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك الخاص لمعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى ساريًا طوال مدة المشروع.
  • يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تُكلّفك المشاركة في هذا الدليل التعليمي للترميز الكثير، إن لم يكن أيّ تكلفة على الإطلاق. لإيقاف الموارد لتجنُّب تحصيل رسوم بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من برنامج الفترة التجريبية المجانية التي تقدّم رصيدًا بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

55efc1aaa7a4d3ad.png

من المفترض ألا تستغرق عملية توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

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

3- قبل البدء

تفعيل واجهة برمجة التطبيقات

إخراج:

في Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:

يظهر رقم تعريف المشروع عادةً بين قوسين في موجِّه الأوامر في shell السحابة الإلكترونية كما هو موضّح في الصورة:

fa6ee779963405d5.png

gcloud config set project [YOUR-PROJECT-ID]

بعد ذلك، اضبط متغيّر البيئة PROJECT_ID على رقم تعريف مشروعك على Google Cloud:

PROJECT_ID=$(gcloud config get-value project)

فعِّل جميع الخدمات اللازمة:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       vpcaccess.googleapis.com \
                       aiplatform.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       run.googleapis.com \
                       iam.googleapis.com

الناتج المتوقّع

student@cloudshell:~ (gleb-test-short-004)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       vpcaccess.googleapis.com \
                       aiplatform.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       run.googleapis.com \
                       iam.googleapis.com
Operation "operations/acf.p2-404051529011-664c71ad-cb2b-4ab4-86c1-1f3157d70ba1" finished successfully.

4. نشر مجموعة AlloyDB

قبل إنشاء مجموعة AlloyDB، نحتاج إلى نطاق IP خاص متاح في شبكة VPC لاستخدامه في مثيل AlloyDB المستقبلي. إذا لم يكن لدينا هذا الإعداد، سنحتاج إلى إنشائه وتخصيصه لاستخدامه من قِبل خدمات Google الداخلية، وبعد ذلك سنتمكّن من إنشاء المجموعة والمثيل.

إنشاء نطاق IP خاص

نحتاج إلى ضبط إعدادات "الوصول إلى الخدمات الخاصة" في شبكة VPC الخاصة بخدمة AlloyDB. نفترض هنا أنّ لدينا شبكة VPC "التلقائية" في المشروع وسيتم استخدامها لجميع الإجراءات.

أنشئ نطاق عنوان IP الخاص:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

أنشئ اتصالاً خاصًا باستخدام نطاق عناوين IP المخصّص:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

إنشاء مجموعة AlloyDB

أنشئ مجموعة AlloyDB في المنطقة us-central1.

حدِّد كلمة المرور لمستخدم postgres. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور.

export PGPASSWORD=`openssl rand -hex 12`

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

دوِّن كلمة مرور PostgreSQL لاستخدامها في المستقبل:

echo $PGPASSWORD

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

حدِّد المنطقة واسم مجموعة AlloyDB. سنستخدم المنطقة us-central1 وalloydb-aip-01 كاسم للمجموعة:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

شغِّل الأمر لإنشاء المجموعة:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

الناتج المتوقّع في وحدة التحكّم:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

إنشاء مثيل أساسي في AlloyDB

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

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5- إعداد جهاز GCE افتراضي

إنشاء حساب خدمة

بما أنّنا سنستخدم جهاز افتراضي لنشر خدمة "استرداد المعلومات من قواعد البيانات باستخدام الذكاء الاصطناعي التوليدي" واستضافة نموذج تطبيق، فإنّ الخطوة الأولى هي إنشاء حساب خدمة على Google. سيستخدم جهاز GCE VM مفتاح GSA، وسنحتاج إلى منحه الامتيازات اللازمة للعمل مع الخدمات الأخرى.

في Cloud Shell، نفِّذ ما يلي:

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create compute-aip --project $PROJECT_ID
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/alloydb.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/serviceusage.serviceUsageConsumer"

نشر جهاز GCE افتراضي

أنشئ جهازًا افتراضيًا على Google Compute Engine في المنطقة وشبكة VPC نفسها اللتين تتوفّر فيهما مجموعة AlloyDB.

في Cloud Shell، نفِّذ ما يلي:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
  --service-account=compute-aip@$PROJECT_ID.iam.gserviceaccount.com

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING

تثبيت برنامج Postgres Client

تثبيت برنامج عميل PostgreSQL على الجهاز الظاهري الذي تم نشره

الاتصال بالجهاز الظاهري:

gcloud compute ssh instance-1 --zone=us-central1-a

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417].                                                                                                                                                         
Updating project ssh metadata...done.                                                                                                                                                                                                                                              
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts.
Linux instance-1 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$ 

ثبِّت الأمر الخاص بتشغيل البرنامج داخل الجهاز الظاهري:

sudo apt-get update
sudo apt-get install --yes postgresql-client

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ sudo apt-get update
sudo apt-get install --yes postgresql-client
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B]
Get:4 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B]
Hit:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease
Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [1652 B]
Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/15/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (15+248) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9+deb12u7) ...

الربط بالنسخة

يمكنك الاتصال بالمثيل الأساسي من الجهاز الافتراضي باستخدام psql.

واصِل استخدام جلسة SSH المفتوحة للوصول إلى جهازك الظاهري. إذا انقطع الاتصال، يمكنك إعادة الاتصال باستخدام الأمر نفسه أعلاه.

استخدِم $PGASSWORD واسم المجموعة اللذَين تم ذكرهما سابقًا للاتصال بقاعدة بيانات AlloyDB من جهاز GCE الظاهري:

export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ export PGPASSWORD=P9...
student@instance-1:~$ export REGION=us-central1
student@instance-1:~$ export ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ export INSTANCE_IP=export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> 

يمكنك الخروج من جلسة psql مع إبقاء اتصال SSH قائمًا:

exit

الناتج المتوقّع في وحدة التحكّم:

postgres=> exit
student@instance-1:~$ 

6- بدء قاعدة البيانات

سنستخدم جهاز الكمبيوتر الظاهري للعميل كنظام أساسي لملء قاعدة بياناتنا بالبيانات واستضافة تطبيقنا. الخطوة الأولى هي إنشاء قاعدة بيانات وملؤها بالبيانات.

إنشاء قاعدة بيانات

أنشئ قاعدة بيانات باسم "assistantdemo".

في جلسة جهاز GCE الظاهري، نفِّذ ما يلي:

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"  

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"
CREATE DATABASE
student@instance-1:~$  

فعِّل إضافة pgVector.

psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"  

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
CREATE EXTENSION
student@instance-1:~$

إعداد بيئة Python

للمتابعة، سنستخدم نصوص Python المُعدّة من مستودع GitHub، ولكن قبل إجراء ذلك، علينا تثبيت البرامج المطلوبة.

في جهاز GCE الظاهري، نفِّذ ما يلي:

sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc
The following NEW packages will be installed:
  git git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl python3.11-venv
0 upgraded, 9 newly installed, 0 to remove and 2 not upgraded.
Need to get 12.4 MB of archives.
After this operation, 52.2 MB of additional disk space will be used.
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B]
...redacted...
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 23.0.1
    Uninstalling pip-23.0.1:
      Successfully uninstalled pip-23.0.1
Successfully installed pip-24.0
(.venv) student@instance-1:~$

تأكَّد من إصدار Python.

في جهاز GCE الظاهري، نفِّذ ما يلي:

python -V

الناتج المتوقّع في وحدة التحكّم:

(.venv) student@instance-1:~$ python -V
Python 3.11.2
(.venv) student@instance-1:~$ 

ملء قاعدة البيانات

استنسِخ مستودع GitHub باستخدام رمز خدمة الاسترجاع ونموذج التطبيق.

في جهاز GCE الظاهري، نفِّذ ما يلي:

git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git
Cloning into 'genai-databases-retrieval-app'...
remote: Enumerating objects: 525, done.
remote: Counting objects: 100% (336/336), done.
remote: Compressing objects: 100% (201/201), done.
remote: Total 525 (delta 224), reused 179 (delta 135), pack-reused 189
Receiving objects: 100% (525/525), 46.58 MiB | 16.16 MiB/s, done.
Resolving deltas: 100% (289/289), done.

تحضير ملف الإعداد

في جهاز GCE الظاهري، نفِّذ ما يلي:

cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml
host: 0.0.0.0
# port: 8080
datastore:
  # Example for AlloyDB
  kind: "postgres"
  host: 10.65.0.2
  # port: 5432
  database: "assistantdemo"
  user: "postgres"
  password: "P9..."

املأ قاعدة البيانات بمجموعة البيانات النموذجية. تؤدي الأوامر الأولى إلى إضافة جميع الحِزم المطلوبة إلى بيئة Python الافتراضية، وتؤدي الأوامر الثانية إلى تعبئة قاعدة بياناتنا بالبيانات.

في جهاز GCE الظاهري، نفِّذ ما يلي:

pip install -r requirements.txt
python run_database_init.py

الناتج المتوقّع في وحدة التحكّم(تم إخفاء البيانات):

student@instance-1:~/genai-databases-retrieval-app/retrieval_service$ pip install -r requirements.txt
python run_database_init.py
Collecting asyncpg==0.28.0 (from -r requirements.txt (line 1))
  Obtaining dependency information for asyncpg==0.28.0 from https://files.pythonhosted.org/packages/77/a4/88069f7935b14c58534442a57be3299179eb46aace2d3c8716be199ff6a6/asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata
  Downloading asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB)
Collecting fastapi==0.101.1 (from -r requirements.txt (line 2))
...
database init done.
student@instance-1:~/genai-databases-retrieval-app/retrieval_service$

7- نشر خدمة الاسترداد في Cloud Run

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

إنشاء حساب خدمة

أنشئ حساب خدمة لخدمة الاسترداد وامنح الأذونات اللازمة.

افتح علامة تبويب أخرى في Cloud Shell باستخدام الرمز "+" في أعلى الصفحة.

4ca978f5142bb6ce.png

في علامة تبويب shell الجديدة في السحابة الإلكترونية، نفِّذ ما يلي:

export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create retrieval-identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity
Created service account [retrieval-identity].

يمكنك إغلاق علامة التبويب باستخدام الأمر التنفيذي "exit" في علامة التبويب:

exit

نشر خدمة الاسترداد

واصِل العمل في علامة التبويب الأولى التي تكون فيها متصلاً بجهاز الكمبيوتر الظاهري من خلال بروتوكول النقل الآمن (SSH) من خلال نشر الخدمة.

في جلسة SSH الخاصة بالجهاز الظاهري، نفِّذ ما يلي:

cd ~/genai-databases-retrieval-app
gcloud alpha run deploy retrieval-service \
    --source=./retrieval_service/\
    --no-allow-unauthenticated \
    --service-account retrieval-identity \
    --region us-central1 \
    --network=default \
    --quiet

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~/genai-databases-retrieval-app$ gcloud alpha run deploy retrieval-service \
    --source=./retrieval_service/\
    --no-allow-unauthenticated \
    --service-account retrieval-identity \
    --region us-central1 \
    --network=default
This command is equivalent to running `gcloud builds submit --tag [IMAGE] ./retrieval_service/` and `gcloud run deploy retrieval-service --image [IMAGE]`

Building using Dockerfile and deploying container to Cloud Run service [retrieval-service] in project [gleb-test-short-003] region [us-central1]
X Building and deploying... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/6ebe74bf-3039-4221-b2e9-7ca8fa8dad8e?project=1012713954588].
  ✓ Creating Revision...
  ✓ Routing traffic...
    Setting IAM Policy...
Completed with warnings:
  Setting IAM policy failed, try "gcloud beta run services remove-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker retrieval-service"
Service [retrieval-service] revision [retrieval-service-00002-4pl] has been deployed and is serving 100 percent of traffic.
Service URL: https://retrieval-service-onme64eorq-uc.a.run.app
student@instance-1:~/genai-databases-retrieval-app$

التحقّق من الخدمة

يمكننا الآن التحقّق مما إذا كانت الخدمة تعمل بشكل صحيح وما إذا كان بإمكان الجهاز الظاهري الوصول إلى نقطة النهاية. نستخدم الأداة gcloud للحصول على نقطة نهاية خدمة الاسترداد. بدلاً من ذلك، يمكنك التحقّق من ذلك في وحدة تحكّم السحابة الإلكترونية واستبدال "$(gcloud run services list –filter="(retrieval-service)" في أمر curl بالقيمة من هناك.

في جلسة SSH الخاصة بالجهاز الظاهري، نفِّذ ما يلي:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~/genai-databases-retrieval-app$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")
{"message":"Hello World"}student@instance-1:~/genai-databases-retrieval-app$

إذا ظهرت لنا رسالة "مرحبًا"، هذا يعني أنّ خدمتنا قيد التشغيل وأنّها تعالج الطلبات.

8. نشر نموذج التطبيق

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

إعداد البيئة

سنواصل العمل على جهازنا الظاهري باستخدام جلسة SSH نفسها. لتشغيل تطبيقنا، نحتاج إلى إضافة بعض وحدات Python. سيتم تنفيذ الأمر من دليل التطبيق في بيئة Python الافتراضية نفسها.

في جلسة SSH الخاصة بالجهاز الظاهري، نفِّذ ما يلي:

cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt

الناتج المتوقّع (تم إخفاء المعلومات):

student@instance-1:~$ cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt
Collecting fastapi==0.104.0 (from -r requirements.txt (line 1))
  Obtaining dependency information for fastapi==0.104.0 from https://files.pythonhosted.org/packages/db/30/b8d323119c37e15b7fa639e65e0eb7d81eb675ba166ac83e695aad3bd321/fastapi-0.104.0-py3-none-any.whl.metadata
  Downloading fastapi-0.104.0-py3-none-any.whl.metadata (24 kB)
...

إعداد معرّف العميل

لاستخدام وظيفة الحجز في التطبيق، يجب إعداد معرّف عميل OAuth 2.0 باستخدام Cloud Console. سيكون ذلك عند تسجيل الدخول إلى التطبيق لأنّ الحجز يستخدم بيانات اعتماد العملاء لتسجيل بيانات الحجز في قاعدة البيانات.

في Cloud Console، انتقِل إلى "واجهات برمجة التطبيقات والخدمات" وانقر على "شاشة موافقة بروتوكول OAuth" واختَر المستخدم "داخلي".

2400e5dcdb93eab8.png

بعد ذلك، انقر على "إنشاء" واتّبِع التعليمات الظاهرة على الشاشة التالية.

6c34d235156e571f.png

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

2b7cd51aff915072.png

بعد ذلك، انقر على الزر "حفظ ومتابعة" في أسفل الصفحة وسينقلك إلى الصفحة التالية.

d90c10c88fd347f9.png

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

الخطوة التالية هي إنشاء معرّف العميل. في اللوحة اليمنى، انقر على "بيانات الاعتماد" التي ستنقلك إلى بيانات اعتماد OAuth2.

7ad97432390f224c.png

هنا، انقر على "إنشاء بيانات اعتماد" في أعلى الصفحة واختَر "معرّف عميل OAuth". بعد ذلك، سيتم فتح شاشة أخرى.

325a926431c8f16d.png

اختَر "تطبيق ويب" من القائمة المنسدلة لنوع التطبيق، ثمّ أدخِل معرّف الموارد المنتظم (URI) لتطبيقك (والمنفذ اختياريًا) في حقل "مصادر JavaScript المسموح بها". وعليك إضافة مضيف تطبيقك إلى "عناوين URL لإعادة التوجيه المعتمَدة" مع إضافة "‎/login/google" في النهاية لتتمكّن من استخدام شاشة النافذة المنبثقة للموافقة. في الصورة أعلاه، يمكنك أن ترى أنّني استخدمت http://localhost كمعرّف الموارد المنتظم الأساسي للتطبيق.

بعد الضغط على الزر "إنشاء"، ستظهر لك نافذة منبثقة تتضمّن بيانات اعتماد العملاء.

e91adf03ec31cd15.png

سنحتاج إلى معرّف العميل (و"سر العميل" اختياريًا) لاحقًا لاستخدامه مع تطبيقنا.

تشغيل تطبيق "مساعد Google"

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

في جلسة SSH الخاصة بالجهاز الظاهري، نفِّذ ما يلي:

export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

الناتج المتوقّع (تم إخفاء المعلومات):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud  run services list --filter="(retrieval-service)" --format="value(URL)")

لاستخدام إمكانات أكثر تقدمًا في التطبيق، مثل حجز الرحلات الجوية وتغييرها، علينا تسجيل الدخول إلى التطبيق باستخدام حسابنا على Google، ولهذا الغرض، علينا توفير متغيّر البيئة CLIENT_ID باستخدام معرّف عميل OAuth من فصل "إعداد معرّف العميل":

export CLIENT_ID=215....apps.googleusercontent.com

الناتج المتوقّع (تم إخفاء المعلومات):

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com

يمكننا الآن تشغيل تطبيقنا:

python run_app.py

الناتج المتوقّع:

student@instance-1:~/genai-databases-retrieval-app/llm_demo$ python main.py
INFO:     Started server process [28565]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)

الاتصال بالتطبيق

تتوفّر لك عدة طرق للاتصال بالتطبيق الذي يتم تشغيله على الجهاز الظاهري. على سبيل المثال، يمكنك فتح المنفذ 8081 على الجهاز الظاهري باستخدام قواعد جدار الحماية في شبكة VPC أو إنشاء أداة موازنة تحميل باستخدام عنوان IP العام. سنستخدم هنا نفق SSH للوصول إلى الجهاز الظاهري من خلال ترجمة المنفذ المحلي 8080 إلى المنفذ 8081 على الجهاز الظاهري.

الاتصال من جهاز محلي

عندما نريد الاتصال من جهاز محلي، علينا تشغيل نفق SSH. يمكن إجراء ذلك باستخدام gcloud compute ssh:

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081

الناتج المتوقّع:

student-macbookpro:~ student$ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
Warning: Permanently added 'compute.7064281075337367021' (ED25519) to the list of known hosts.
Linux instance-1.us-central1-c.c.gleb-test-001.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$

يمكننا الآن فتح المتصفّح واستخدام http://localhost:8081 للاتصال بتطبيقنا. من المفترض أن تظهر لنا شاشة التطبيق.

c667b9013afac3f9.png

الاتصال من Cloud Shell

بدلاً من ذلك، يمكننا استخدام Cloud Shell للاتصال. افتح علامة تبويب أخرى في Cloud Shell باستخدام الرمز "+" في أعلى الصفحة.

4ca978f5142bb6ce.png

في shell السحابة الإلكترونية الجديدة، احصل على معرّف الموارد المنتظم (URI) للموقع الأصلي وإعادة التوجيه لعميل الويب الذي ينفّذ أمر gcloud:

echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"

في ما يلي النتيجة المتوقّعة:

student@cloudshell:~ echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"
origin:
https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev
redirect:
https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev/login/google

استخدِم مصدر معرّفات الموارد المنتظمة (URI) وإعادة التوجيه لها على أنّهما مصادر JavaScript المسموح بها ومعرّفات الموارد المنتظمة (URI) المسموح بها لإعادة التوجيه لبيانات الاعتماد التي تم إنشاؤها في فصل "إعداد معرّف العميل"، مع استبدال قيم http://localhost:8080 المقدَّمة في الأصل أو إضافتها إليها.

2c37eeda0a7e2f80.png

في علامة التبويب الجديدة لـ Cloud Shell، ابدأ النفق إلى جهازك الظاهري من خلال تنفيذ الأمر gcloud:

gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081

ستظهر رسالة الخطأ "تعذّر تحديد العنوان المطلوب"، يُرجى تجاهلها.

في ما يلي النتيجة المتوقّعة:

student@cloudshell:~ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
bind [::1]:8081: Cannot assign requested address
inux instance-1.us-central1-a.c.gleb-codelive-01.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat May 25 19:15:46 2024 from 35.243.235.73
student@instance-1:~$

يفتح هذا الأمر المنفذ 8080 على shell السحابة الإلكترونية الذي يمكن استخدامه في "معاينة الويب".

انقر على زر "معاينة الويب" في أعلى يسار Cloud Shell، واختَر "معاينة على المنفذ 8080" من القائمة المنسدلة.

444fbf54dcd4d160.png

سيؤدي ذلك إلى فتح علامة تبويب جديدة في متصفّح الويب مع واجهة التطبيق. من المفترض أن تظهر لك صفحة "مساعِد خدمة عملاء Cymbal Air".

389f0ae2945beed5.png

تسجيل الدخول إلى التطبيق

بعد الانتهاء من إعداد كل شيء وفتح تطبيقك، يمكننا استخدام الزر "تسجيل الدخول" في أعلى يسار شاشة التطبيق لتقديم بيانات الاعتماد. هذا الإجراء اختياري ولا يُطلب إلا إذا كنت تريد تجربة وظيفة الحجز في التطبيق.

a1f571371b957129.png

ستفتح نافذة منبثقة يمكننا من خلالها اختيار بيانات الاعتماد.

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

يعرض هذا العرض التوضيحي مساعد خدمة العملاء Cymbal Air. Cymbal Air هي شركة خطوط جوية خيالية لنقل الركاب. المساعد هو برنامج محادثة آلي مستند إلى الذكاء الاصطناعي يساعد المسافرين في إدارة الرحلات الجوية والبحث عن معلومات عن مركز Cymbal Air في مطار سان فرانسيسكو الدولي (SFO).

بدون تسجيل الدخول (بدون CLIENT_ID)، يمكن أن يساعد ذلك في الإجابة عن أسئلة المستخدمين، مثل:

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

هل هناك أي متاجر فاخرة بالقرب من بوابة C28؟

أين يمكنني الحصول على قهوة بالقرب من البوابة A6؟

أين يمكنني شراء هدية؟

يُرجى حجز رحلة جوية إلى دبي تغادر في الساعة 10:35 صباحًا.

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

6e7758f707c67c3e.png

يستخدم التطبيق أحدث نماذج Google الأساسية لإنشاء الردود وتعزيزها بمعلومات عن الرحلات الجوية ووسائل الراحة من قاعدة بيانات AlloyDB التشغيلية. يمكنك الاطّلاع على مزيد من المعلومات عن هذا التطبيق التجريبي على صفحة GitHub الخاصة بالمشروع.

9. تنظيف البيئة

الآن بعد اكتمال جميع المهام، يمكننا تنظيف بيئتنا.

حذف خدمة Cloud Run

في Cloud Shell، نفِّذ ما يلي:

gcloud run services delete retrieval-service --region us-central1

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (gleb-test-short-004)$ gcloud run services delete retrieval-service --region us-central1
Service [retrieval-service] will be deleted.

Do you want to continue (Y/n)?  Y

Deleting [retrieval-service]...done.                                                                                                                                                                                                                 
Deleted service [retrieval-service].

حذف حساب الخدمة لخدمة Cloud Run

في Cloud Shell، نفِّذ ما يلي:

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-222]
student@cloudshell:~ (gleb-test-short-004)$ gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet
deleted service account [retrieval-identity@gleb-test-short-004.iam.gserviceaccount.com]
student@cloudshell:~ (gleb-test-short-004)$

إتلاف آلات AlloyDB والمجموعة عند الانتهاء من الدرس التطبيقي

حذف مجموعة AlloyDB وجميع المثيلات

يتمّ إتلاف المجموعة باستخدام الخيار force الذي يؤدي أيضًا إلى حذف جميع النُسخ التي تنتمي إلى المجموعة.

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

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

لحذف المجموعة:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

حذف نُسخ AlloyDB الاحتياطية

حذف جميع النُسخ الاحتياطية من AlloyDB للمجموعة:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

يمكننا الآن إتلاف جهاز الكمبيوتر الظاهري.

حذف جهاز GCE افتراضي

في Cloud Shell، نفِّذ ما يلي:

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

حذف حساب الخدمة لوحدة GCE VM وخدمة الاسترداد

في Cloud Shell، نفِّذ ما يلي:

PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet
Your active configuration is: [cloudshell-222]
deleted service account [compute-aip@gleb-test-short-004.iam.gserviceaccount.com]
student@cloudshell:~ (gleb-test-short-004)$ 

10. تهانينا

تهانينا على إكمال دورة codelab.

المواضيع التي تناولناها

  • كيفية نشر AlloyDB Cluster
  • كيفية الاتصال بخدمة AlloyDB
  • كيفية إعداد خدمة استرجاع المعلومات من قواعد البيانات بالذكاء الاصطناعي التوليدي ونشرها
  • كيفية نشر نموذج تطبيق باستخدام الخدمة المنشورة

11. استطلاع

إخراج:

كيف ستستخدم هذا الدليل التعليمي؟

قراءة الدليل فقط قراءة الدليل وإكمال التمارين