1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية نشر EmbeddingGemma، وهو نموذج قوي لتضمين النصوص بلغات متعددة، على Cloud Run باستخدام وحدات معالجة الرسومات. بعد ذلك، ستستخدم هذه الخدمة التي تم نشرها لإنشاء تضمينات لتطبيق بحث دلالي.
على عكس النماذج اللغوية الكبيرة (LLM) التقليدية التي تنشئ النصوص، تحوّل نماذج التضمين النصوص إلى متجهات رقمية. تُعدّ هذه المتّجهات ضرورية لإنشاء أنظمة التوليد المعزّز بالاسترجاع، ما يتيح لك العثور على المستندات الأكثر صلة بطلب المستخدم.
الإجراءات التي ستنفذّها
- يمكنك إنشاء حاوية لنموذج EmbeddingGemma باستخدام Ollama.
- انشر الحاوية على Cloud Run مع تسريع وحدة معالجة الرسومات.
- اختبِر النموذج الذي تم نشره من خلال إنشاء تضمينات لنص نموذجي.
- إنشاء نظام بحث دلالي بسيط باستخدام الخدمة التي تم نشرها
المتطلبات
- مشروع Google Cloud تم تفعيل الفوترة فيه
- يجب أن تكون على دراية أساسية بـ Docker وسطر الأوامر.
2. قبل البدء
إعداد المشروع
- إذا لم يكن لديك حساب Google، عليك إنشاء حساب Google.
- استخدام حساب شخصي بدلاً من حساب تديره المؤسسة التعليمية أو حساب تابع للعمل. قد تتضمّن حسابات العمل والحسابات المُدارة من المؤسسات التعليمية قيودًا تمنعك من تفعيل واجهات برمجة التطبيقات اللازمة لهذا الدرس التطبيقي.
- سجِّل الدخول إلى Google Cloud Console.
- فعِّل الفوترة في Cloud Console.
- يجب أن تكلّف إكمال هذا المختبر أقل من دولار أمريكي واحد من موارد السحابة الإلكترونية.
- يمكنك اتّباع الخطوات في نهاية هذا المختبر لحذف الموارد وتجنُّب المزيد من الرسوم.
- يمكن للمستخدمين الجدد الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
- أنشِئ مشروعًا جديدًا أو اختَر إعادة استخدام مشروع حالي.
- إذا ظهر لك خطأ بشأن حصة المشروع، أعِد استخدام مشروع حالي أو احذف مشروعًا حاليًا لإنشاء مشروع جديد.
بدء Cloud Shell
Cloud Shell هي بيئة سطر أوامر تعمل في Google Cloud ومحمّلة مسبقًا بالأدوات اللازمة.
- انقر على تفعيل Cloud Shell في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بـ Cloud Shell، تحقَّق من المصادقة باتّباع الخطوات التالية:
gcloud auth list - تأكَّد من اختيار مشروعك:
gcloud config get project - اضبطه إذا لزم الأمر:
gcloud config set project <YOUR_PROJECT_ID>
تفعيل واجهات برمجة التطبيقات
نفِّذ الأمر التالي لتفعيل جميع واجهات برمجة التطبيقات المطلوبة:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com
3- تعبئة النموذج في حاوية
لتشغيل EmbeddingGemma بدون خادم، علينا تجميعها في حاوية. سنستخدم Ollama، وهو إطار عمل خفيف الوزن لتشغيل نماذج اللغات الكبيرة، وDocker.
إنشاء ملف Dockerfile
في Cloud Shell، أنشئ دليلًا جديدًا لمشروعك وانتقِل إليه:
mkdir embedding-gemma-codelab
cd embedding-gemma-codelab
أنشئ ملفًا باسم Dockerfile يتضمّن المحتوى التالي:
FROM ollama/ollama:latest
# Listen on all interfaces, port 8080
ENV OLLAMA_HOST=0.0.0.0:8080
# Store model weight files in /models
ENV OLLAMA_MODELS=/models
# Reduce logging verbosity
ENV OLLAMA_DEBUG=false
# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE=-1
# Store the model weights in the container image
ENV MODEL=embeddinggemma:latest
RUN ollama serve & sleep 5 && ollama pull $MODEL
# Start Ollama
ENTRYPOINT ["ollama", "serve"]
يؤدّي ملف Dockerfile هذا الإجراءات التالية:
- يبدأ من صورة قاعدة Ollama الرسمية.
- يضبط هذا الخيار Ollama للاستماع على المنفذ 8080 (الإعداد التلقائي في Cloud Run).
- يبدأ الأمر
RUNتشغيل خادمollamaوينزّل نموذجembeddinggemmaأثناء عملية التصميم، وبالتالي يتم تضمينه في الصورة. - يضبط
OLLAMA_KEEP_ALIVE=-1لضمان بقاء النموذج محملًا في ذاكرة وحدة معالجة الرسومات من أجل تنفيذ الطلبات اللاحقة بشكل أسرع.
4. إنشاء التطبيق ونشره
سنستخدم نشر المصدر في Cloud Run لإنشاء الحاوية ونشرها في خطوة واحدة. ينشئ هذا الأمر الصورة باستخدام Cloud Build، ويخزّنها في Artifact Registry، وينشرها على Cloud Run.
نفِّذ الأمر التالي لنشر التطبيق:
gcloud run deploy embedding-gemma \
--source . \
--region europe-west1 \
--concurrency 4 \
--cpu 8 \
--set-env-vars OLLAMA_NUM_PARALLEL=4 \
--gpu 1 \
--gpu-type nvidia-l4 \
--max-instances 1 \
--memory 32Gi \
--no-allow-unauthenticated \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--timeout=600 \
--labels dev-tutorial=codelab-embedding-gemma
فهم الإعدادات
- تحدّد
--source .الدليل الحالي كمصدر لعملية الإنشاء. --region europe-west1استخدام منطقة تتيح وحدات معالجة الرسومات على Cloud Run- يتم ضبط
--concurrency 4ليتطابق مع قيمة متغيّر البيئة OLLAMA_NUM_PARALLEL. - يؤدي استخدام
--gpu 1مع--gpu-type nvidia-l4إلى تخصيص وحدة معالجة رسومات NVIDIA L4 واحدة لكل آلة افتراضية في Cloud Run ضمن الخدمة. - تحدّد
--max-instances 1الحد الأقصى لعدد الآلات الافتراضية التي يمكن توسيع نطاقها. يجب أن تكون مساوية لحصة وحدة معالجة الرسومات NVIDIA L4 في مشروعك أو أقل منها. --no-allow-unauthenticatedيمنع الوصول غير المصادق عليه إلى الخدمة. من خلال إبقاء الخدمة خاصة، يمكنك الاعتماد على مصادقة "إدارة الهوية وإمكانية الوصول" (IAM) المضمّنة في Cloud Run للتواصل بين الخدمات.- يجب توفُّر الإصدار
--no-cpu-throttlingلتفعيل وحدة معالجة الرسومات. --no-gpu-zonal-redundancyاضبط خيارات التكرار على مستوى المنطقة حسب متطلبات تجاوز الفشل على مستوى المنطقة والحصة المتاحة.
اعتبارات المنطقة
تتوفّر وحدات معالجة الرسومات على Cloud Run في مناطق محدّدة. يمكنك الاطّلاع على المناطق المتوافقة في المستندات.
ناتج عملية النشر
بعد بضع دقائق، ستكتمل عملية النشر وستظهر لك رسالة على النحو التالي:
Service [embedding-gemma] revision [embedding-gemma-12345-abc] has been deployed and is serving 100 percent of traffic. Service URL: https://embedding-gemma-123456789012.europe-west1.run.app
5- اختبار عملية النشر
بما أنّنا نشرنا الخدمة باستخدام --no-allow-unauthenticated، لا يمكننا ببساطة curl عنوان URL العلني. علينا أولاً منح أنفسنا الإذن بالوصول إلى الخدمة واستخدام رمز المصادقة المميز في الطلب.
- امنح حساب المستخدم إذنًا لاستدعاء الخدمة:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=user:$(gcloud config get-value account) \ --role='roles/run.invoker' - احفظ بيانات اعتماد Google Cloud ورقم المشروع في متغيّرات البيئة لاستخدامها في الطلب:
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)") export ID_TOKEN=$(gcloud auth print-identity-token) - نفِّذ الأمر التالي لإنشاء تضمين للنص "Sample text":
curl -X POST "https://embedding-gemma-$PROJECT_NUMBER.europe-west1.run.app/api/embed" \ -H "Authorization: Bearer $ID_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "embeddinggemma", "input": "Sample text" }'
من المفترض أن تظهر لك استجابة JSON تحتوي على متّجه (قائمة طويلة من الأرقام) ضمن الحقل embedding. يؤكّد ذلك أنّ نموذج التضمين المستند إلى وحدة معالجة الرسومات بدون خادم يعمل بشكلٍ سليم.
ستبدو الاستجابة على النحو التالي: 
برنامج Python
يمكنك أيضًا استخدام Python للتفاعل مع الخدمة. أنشئ ملفًا باسم test_client.py:
import urllib.request
import urllib.parse
import json
import os
# 1. Setup the URL and Payload
url = f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app/api/embed"
payload = {
"model": "embeddinggemma",
"input": "Sample text"
}
# 2. Create the Request object
# Note: Providing 'data' automatically makes this a POST request
req = urllib.request.Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": f"Bearer {os.environ['ID_TOKEN']}",
"Content-Type": "application/json"
}
)
# 3. Execute and print the response
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode("utf-8"))
print(result)
تشغيلها:
python test_client.py
6. إنشاء تطبيق بحث دلالي
بعد أن أصبح لدينا خدمة تضمين تعمل بشكل جيد، لننشئ تطبيق بحث دلالي بسيطًا. سنستخدم عمليات التضمين التي تم إنشاؤها للعثور على المستند الأكثر صلة بطلب بحث معيّن.
الاعتمادية
سنستخدم chromadb كقاعدة بيانات متجهة ومكتبة برامج ollama.
uv init semantic-search --description "Semantic Search Application"
cd semantic-search
uv add chromadb ollama
إنشاء تطبيق البحث
أنشئ ملفًا باسم semantic_search.py يتضمّن الرمز البرمجي التالي:
import ollama
import chromadb
import os
# 1. Define our knowledge base
documents = [
"Poland is a country located in Central Europe.",
"The capital and largest city of Poland is Warsaw.",
"Poland's official language is Polish, which is a West Slavic language.",
"Marie Curie, the pioneering scientist who conducted groundbreaking research on radioactivity, was born in Warsaw, Poland.",
"Poland is famous for its traditional dish called pierogi, which are filled dumplings.",
"The Białowieża Forest in Poland is one of the last and largest remaining parts of the immense primeval forest that once stretched across the European Plain.",
]
print("Initializing Vector Database...")
client = chromadb.Client()
collection = client.create_collection(name="docs")
# Configure the client to point to our Cloud Run proxy
ollama_client = ollama.Client(
host=f"https://embedding-gemma-{os.environ['PROJECT_NUMBER']}.europe-west1.run.app",
headers={'Authorization': 'Bearer ' + os.environ['ID_TOKEN']}
)
print("Generating embeddings and indexing documents...")
# 2. Store each document in the vector database
for i, d in enumerate(documents):
# This calls our Cloud Run service to get the embedding
response = ollama_client.embed(model="embeddinggemma", input=d)
embeddings = response["embeddings"]
collection.add(ids=[str(i)], embeddings=embeddings, documents=[d])
print("Indexing complete.\n")
# 3. Perform a Semantic Search
question = "What is Poland's official language?"
print(f"Query: {question}")
# Generate an embedding for the question
response = ollama_client.embed(model="embeddinggemma", input=question)
# Query the database for the most similar document
results = collection.query(
query_embeddings=[response["embeddings"][0]],
n_results=1
)
best_match = results["documents"][0][0]
print(f"Best Match Document: {best_match}")
تشغيل التطبيق
تنفيذ النص البرمجي:
uv run semantic_search.py
من المفترَض أن تظهر لك نتيجة مثل هذه:
Initializing Vector Database...
Generating embeddings and indexing documents...
Indexing complete.
Query: What is Poland's official language?
Best Match Document: Poland's official language is Polish, which is a West Slavic language.
يوضّح هذا النص البرمجي أساس نظام التوليد المعزّز بالاسترجاع: استخدام خدمة EmbeddingGemma للحوسبة بدون خادم لتحويل كل من المستندات وطلبات البحث إلى متجهات، ما يتيح لك العثور على المعلومات الدقيقة اللازمة للإجابة عن سؤال المستخدم.
7. تَنظيم
لتجنُّب الرسوم المستمرة على حسابك على Google Cloud، احذف الموارد التي تم إنشاؤها أثناء هذا الدرس العملي.
حذف خدمة Cloud Run
gcloud run services delete embedding-gemma --region europe-west1 --quiet
حذف صورة الحاوية
gcloud artifacts docker images delete \
europe-west1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/cloud-run-source-deploy/embedding-gemma \
--quiet
8. تهانينا
تهانينا! لقد تمكّنت من نشر EmbeddingGemma على Cloud Run باستخدام وحدات معالجة الرسومات واستخدامه لتشغيل تطبيق بحث دلالي.
أصبح لديك الآن أساس قابل للتوسّع وبدون خادم لإنشاء تطبيقات الذكاء الاصطناعي التي تتطلّب فهم معنى النص.
ما تعلّمته
- كيفية إنشاء حاوية لنموذج Ollama باستخدام Docker
- كيفية نشر خدمة مفعّلة لوحدة معالجة الرسومات على Cloud Run
- كيفية استخدام النموذج الذي تم نشره للبحث الدلالي (التوليد المعزّز بالاسترجاع)
الخطوات التالية
- استكشِف النماذج الأخرى في مجموعة Gemma.
- مزيد من المعلومات حول وحدات معالجة الرسومات في Cloud Run
- استكشِف الدروس التطبيقية حول الترميز في Cloud Run.
- أنشئ مسار RAG كاملاً من خلال ربط خطوة الاسترجاع هذه بنموذج توليدي.