1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستنفّذ أول تجربتَين من تجارب AlphaEvolve على Google Cloud. AlphaEvolve هو إطار عمل للترميز التطوري موجَّه بالذكاء الاصطناعي من Google DeepMind، ويستخدم Gemini لكتابة الرموز البرمجية وتحسينها، ويتم تقييمها باستخدام مقياس تحدّده أنت. ستبدأ بتجربة تعبئة الدوائر، وهي مشكلة هندسية صغيرة يمكنك فيها ملاحظة تحسُّن النتيجة حرفيًا، ثم ستكرّر التجربة على مشكلة أصعب، وهي مشكلة البائع المتجوّل، لترسيخ النمط.
تستخدم كلتا التجربتَين التقييم المحلي ، حيث يتم تشغيل الرمز البرمجي المرشّح على جهازك، لذا لا توجد وحدة معالجة رسومات ولا مجموعة يمكنك إدارتها. الاستخدام الوحيد للسحابة الإلكترونية هو واجهة AlphaEvolve API التي تنشئ المرشّحين.

الإجراءات التي ستنفذّها
- إعداد تجربة AlphaEvolve على مشروعك على Google Cloud
- تشغيل بحث تطوري يحسّن خوارزمية تعبئة الدوائر محليًا
- قراءة النتيجة والترتيب والتصوّر المرئي لأفضل برنامج تم تطويره
- تكرار الحلقة على مشكلة البائع المتجوّل لتعميم النمط
- ضبط ميزانية البحث (المرشّحون والتزامن والنموذج)
المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع على Google Cloud تم تفعيل الفوترة فيه
- الإصدار 3.9 من Python أو إصدار أحدث و
uv - معرفة أساسية بلغة Python وواجهة سطر الأوامر
هذا الدرس التطبيقي حول الترميز مخصّص لمهندسي الذكاء الاصطناعي/تعلُّم الآلة والمطوّرين من جميع المستويات. لا يلزم أن تكون لديك خلفية في مجال الحوسبة التطورية.
الوقت المقدَّر لإكمال الدرس: من 45 إلى 60 دقيقة
التكلفة: يستخدم هذا الدرس التطبيقي حول الترميز التقييم المحلي (لا توجد وحدة معالجة رسومات ولا GKE). الرسوم الوحيدة هي رسوم إنشاء المرشّحين، أي استخدام واجهة AlphaEvolve API ورموز Gemini المميّزة على Vertex AI التي تستهلكها.
تم الاختبار باستخدام: مكتبة عميل AlphaEvolve Cloud الإصدار 0.1.0، وPython 3.9 والإصدارات الأحدث، على المثالَين circle_packing وtsp.
2. قبل البدء
اختيار مشروعك وتفعيل واجهات برمجة التطبيقات
- في Google Cloud Console، اختَر مشروعًا تم تفعيل الفوترة فيه أو أنشِئ مشروعًا، ثم اضبطه في الوحدة الطرفية:
gcloud config set project <YOUR_PROJECT_ID>
- فعِّل واجهتَي برمجة التطبيقات اللتَين يستخدمهما هذا الدرس التطبيقي حول الترميز، وهما Discovery Engine API الذي يعرض AlphaEvolve، وVertex AI API الذي يعرض نماذج Gemini التي تنشئ المرشّحين:
gcloud services enable \
discoveryengine.googleapis.com \
aiplatform.googleapis.com
العثور على رقم تعريف تطبيق Gemini Enterprise
يتم عرض AlphaEvolve من خلال Gemini Enterprise (واجهة REST الأساسية هي Discovery Engine API). تحتاج إلى رقم تعريف تطبيقك، وليس اسمه المعروض، لإعداد GE_APP_ID.
- افتح صفحة تطبيقات Gemini Enterprise لمشروعك.
- انقر على تطبيقك وانسخ حقل رقم التعريف (مثلاً،
gemini-enterprise-1234567890_1234567890123).
المصادقة والاستنساخ والتثبيت
- صادِق على بيانات الاعتماد التلقائية للتطبيق:
gcloud auth application-default login
- استنسِخ مستودع النماذج وافتحه. ستشغّل كل أمر من جذر هذا المستودع:
git clone https://github.com/Google-Cloud-AI/alphaevolve-on-googlecloud.git
cd alphaevolve-on-googlecloud
- أنشِئ بيئة افتراضية وثبِّت مكتبة عميل AlphaEvolve فيها:
uv venv
uv pip install -e ".[dev]"
ينشئ الأمر uv venv ملف .venv في المستودع، بينما يثبِّت الأمر uv pip install -e ".[dev]" حزمة alpha_evolve (قابلة للتعديل) بالإضافة إلى أدوات الاختبار. ستشغّل التجارب باستخدام uv run، الذي يستخدم هذه البيئة تلقائيًا.
3. فهم حلقة AlphaEvolve
قبل تشغيل أي شيء، عليك فهم الأجزاء الثلاثة التي يحتاجها AlphaEvolve. هذا هو النموذج الذهني الذي ستعيد استخدامه لكل تجربة.
البرنامج الأولي وEVOLVE-BLOCK
لا يعيد AlphaEvolve كتابة الرمز البرمجي إلا بين علامتَي تحديد. كل ما عدا ذلك في الملف هو هيكل ثابت لا يمكنه تغييره. افتح examples/circle_packing/src/program.py، حيث يكون البرنامج الأولي عبارة عن تعبئة بسيطة لحلقات متحدة المركز:
# EVOLVE-BLOCK-START
"""Constructor-based circle packing for n=26 circles"""
import numpy as np
def construct_packing(n, random_seed: int):
"""Construct an arrangement of 26 circles in a unit square.
The goal is to maximize the sum of their radii.
Returns (centers, radii, sum_of_radii).
"""
rng = np.random.default_rng(random_seed)
centers = np.zeros((n, 2))
# A simple starting pattern — evolution will improve this.
centers[0] = [0.5, 0.5] # one circle in the center
for i in range(8): # 8 in an inner ring
angle = 2 * np.pi * i / 8
centers[i + 1] = [0.5 + 0.3 * np.cos(angle), 0.5 + 0.3 * np.sin(angle)]
for i in range(16): # 16 in an outer ring
angle = 2 * np.pi * i / 16 * rng.uniform(0.9, 1.1)
centers[i + 9] = [0.5 + 0.7 * np.cos(angle), 0.5 + 0.7 * np.sin(angle)]
centers = np.clip(centers, 0.01, 0.99) # keep everything in the square
radii = compute_max_radii(centers, random_seed)
return centers, radii, np.sum(radii)
def compute_max_radii(centers, random_seed: int):
"""Grow each circle to touch its nearest border or neighbor (no overlaps)."""
# ... see src/program.py for the full helper ...
# EVOLVE-BLOCK-END
كل ما خارج EVOLVE-BLOCK-START / EVOLVE-BLOCK-END، بما في ذلك الدالة evaluate() وعمليات التحقّق من التداخل، يظل ثابتًا. هذا الفصل هو الحيلة الكاملة: يمكن لـ Gemini اقتراح أي خوارزمية تعبئة يريدها، ولكن لا يمكنه تغيير طريقة تسجيل المرشّح.
المقيِّم والنتيجة
يشغّل examples/circle_packing/src/evaluate.py كل مرشّح في بيئة آمنة ويعرض نتيجة. بالنسبة إلى تعبئة الدوائر، يكون المقياس sum_of_radii، وكلما ارتفعت النتيجة كان ذلك أفضل:
CIRCLE_PACKING_EVALUATION_METRIC = "sum_of_radii"
CIRCLE_PACKING_EVALUATION_INPUTS = {"n": 26}
إذا خالف أحد المرشّحين قاعدة، مثل تداخل الدوائر أو خروجها من المربع، يعرض المقيِّم -inf بالإضافة إلى معلومة توضح الخطأ الذي حدث. تتم إعادة هذه المعلومات إلى Gemini حتى يتجنّب الجيل التالي الخطأ نفسه.
4. تشغيل أول تجربة
إعداد التجربة
من جذر المستودع، أنشِئ ملف .env من نموذج تعبئة الدوائر:
cp examples/circle_packing/example.env .env
افتح .env واضبط رقم تعريف مشروعك وتطبيقك فقط، لأنّ كل ما عدا ذلك يتضمّن إعدادات تلقائية مناسبة للتشغيل الأول:
PROJECT_ID=<YOUR_PROJECT_ID>
GE_APP_ID=<YOUR_GEMINI_ENTERPRISE_APP_ID>
تنشئ الإعدادات التلقائية مرشّحين باستخدام مزيج من نماذج Gemini (MODEL_1=gemini-3.5-flash بالوزن 0.7، وMODEL_2=gemini-3.1-pro-preview بالوزن 0.3) وتحدّ البحث بـ MAX_PROGRAMS_EVALUATED=10 مع CONCURRENCY=4، وهو ما يكفي لمشاهدة عمل الحلقة بسرعة.
بدء عملية التطوير
شغِّل التجربة من جذر المستودع:
uv run python -m examples.circle_packing.src.run_evolution
يؤدي هذا إلى تحميل البرنامج الأولي وبدء البحث وتشغيل حلقة التحكّم المحلية إلى أن يتم تقييم 10 مرشّحين. بما أنّك تستدعي الوحدة مباشرةً (بدون برنامج تضمين)، يمكنك الاطّلاع على ما يتم تشغيله بالضبط وتعديل الملف للتجربة.
من المفترض أن يظهر لك ناتج مشابه لما يلي:
INFO:alpha_evolve.experiment:Creating a new AlphaEvolve experiment INFO:alpha_evolve.controller:Evolution loop started: 4 sampler(s), 32 evaluator(s), target=10 programs INFO:alpha_evolve.controller:Waiting for the backend to generate candidates... (generated=0, evaluated=0/10, idle=10s) INFO:alpha_evolve.workers:Candidate 1060655338894100 evaluated → sum_of_radii=0.8114 INFO:alpha_evolve.controller:Progress: generated=2, evaluated=1/10, queued=0 ... INFO:alpha_evolve.controller:Stopping criteria met (10/10 programs evaluated).
عادةً ما يحصل المرشّحون الأوائل على نتائج في النطاق من 0.8 إلى 1.0 ، ثم يتحسّن البحث من هذه النقطة. عند انتهاء الحلقة، تطبع البرامج المرتبة وتعرض أفضل عمليات التعبئة باستخدام matplotlib.
ملاحظة: تحديد المشاكل وحلّها: إذا انتهى التشغيل على الفور مع ظهور FAILED_PRECONDITION والرسالة "يتطلب AlphaEvolve تفعيل Vertex AI API في هذا المشروع"، يعني ذلك أنّ aiplatform.googleapis.com غير متوفّر، لذا فعِّله كما هو موضّح في "قبل البدء". عادةً ما يعني ظهور PERMISSION_DENIED أو 403 أنّ Discovery Engine API غير مفعَّلة بدلاً من ذلك. إذا ظهرت الرسالة "تعذّر إنشاء التجربة" بدون ظهور أي من هاتَين الرسالتَين، يعني ذلك أنّ بيانات الاعتماد أو GE_APP_ID في .env غير صحيحة.
5. قراءة النتائج
يطبع التشغيل أفضل البرامج المرتبة حسب sum_of_radii (كلما ارتفعت النتيجة كان ذلك أفضل). هناك أمران يجب البحث عنهما:
- ارتفعت النتيجة. من المفترض أن تتفوّق أفضل نتيجة تم تطويرها لـ
sum_of_radiiعلى تنسيق الحلقات المتحدة المركز للبرنامج الأولي. عادةً ما يكتشف Gemini أنّ الدوائر القريبة من الزوايا والحواف يمكن أن تكبر، ويعيد موازنة الجزء الداخلي. - يتم تخطّي المرشّحين غير الصالحين. أي برنامج أنتج دوائر متداخلة أو خارج الحدود حصل على النتيجة
-infوتم تخطّيه في الترتيب، وهذا يعني أنّ ملاحظات القيود تعمل، وليس خطأ.
أصبحت لديك الآن الحلقة الكاملة: البرنامج الأولي -> الإنشاء -> التقييم -> التسجيل -> التكرار. كل ما عدا ذلك في AlphaEvolve هو اختلاف في مكان تشغيل التقييم.
6. تطوير بحث حقيقي: مشكلة البائع المتجوّل
تتقارب عملية تعبئة الدوائر بسرعة. لتشعر بعملية البحث على مشكلة أكثر تعقيدًا، طوِّر طريقة إرشادية لـ مشكلة البائع المتجوّل. النمط متطابق، ولا يتغيّر سوى البرنامج الأولي والمقياس، ويعيد مثال مشكلة البائع المتجوّل استخدام ملف .env (المشروع والميزانية والتزامن).
- ارفع الميزانية في
.envليتمكّن البحث الأطول من التحسّن:
# in .env — raise the generation cap and the evaluation target together
MAX_PROGRAMS_GENERATED=20
MAX_PROGRAMS_EVALUATED=20
- شغِّل التجربة من جذر المستودع:
uv run python -m examples.tsp.src.run_evolution
البرنامج الأولي هنا هو جولة أقرب جار في 50 مدينة، والمقياس هو neg_tour_length (متوسط طول الجولة السلبي على 5 حالات ثابتة، لذا كلما ارتفعت النتيجة كان ذلك أفضل). افتح examples/tsp/src/program.py ولاحِظ أنّه لا يوجد داخل EVOLVE-BLOCK سوى construct_tour(distances, n).
للمشكلتَين النمط نفسه مع أجزاء مختلفة:
المشكلة | اللغة | التقييم | المقياس (كلما ارتفعت النتيجة كان ذلك أفضل) | ما يتم تطويره |
| Python | |
|
|
| Python | |
|
|
أثناء تشغيل البحث، راقِب ارتفاع neg_tour_length (اقترابها من الصفر) بينما يتجاوز Gemini أقرب جار نحو التحسينات من النمطَين 2-opt أو or-opt، وهي استراتيجيات لم تكتبها أنت.
7. ضبط البحث
بعد أن أصبح كلا التشغيلَين يعملان، اضبط الميزانية في .env:
MAX_PROGRAMS_EVALUATED: عدد المرشّحين الذين سيتم تسجيلهم كلما زاد عدد المرشّحين، زاد عمق البحث وارتفعت التكلفة والوقت.CONCURRENCY: عدد المرشّحين الذين يتم إنشاؤهم في آنٍ واحدMODEL_1/MODEL_2(معMODEL_1_WEIGHT/MODEL_2_WEIGHT): المزيج المرجّح من نماذج Gemini التي تنشئ المرشّحين في تشغيل تعبئة الدوائر (تقرأ وحدة مشكلة البائع المتجوّلMODELواحدًا بدلاً من ذلك) القيم المسموح بها هيgemini-3.5-flashوgemini-3.1-pro-preview. انقل الوزن نحو النموذج الأقوى للعثور على برامج أفضل في عدد أقل من الأجيال.
أعِد التشغيل باستخدام uv run python -m examples.circle_packing.src.run_evolution (أو وحدة tsp) بعد كل تغيير.
ملاحظة: يؤدي رفع MAX_PROGRAMS_EVALUATED والتبديل إلى نموذج أكبر إلى زيادة التكلفة. بما أنّ هذا الدرس التطبيقي حول الترميز يستخدم التقييم المحلي، لا يتم تحصيل رسوم مقابل وحدة معالجة الرسومات، ولكنك ستظل تدفع مقابل استخدام واجهة AlphaEvolve API ورموز Gemini المميّزة على Vertex AI لكل مرشّح تم إنشاؤه. ابدأ بميزانية صغيرة.
8. تَنظيم
يستخدم هذا الدرس التطبيقي حول الترميز التقييم المحلي، لذا لا يتم تشغيل أي شيء قابل للفوترة ، ولا توجد مجموعات ولا وحدات معالجة رسومات ولا خدمات تم نشرها. لإعادة ضبط عملية الدفع بالكامل:
git clean -xfd # removes .env, .venv, and generated outputs
ملاحظة: git clean -xfd يحذف الأمر .env (بما في ذلك إعدادات مشروعك) وملف .venv. يمكنك تخطّي هذا الأمر إذا كنت تريد مواصلة التجربة.
إذا أنشأت مشروعًا لهذا الدرس التطبيقي حول الترميز فقط، احذِفه في Console لإيقاف جميع الرسوم.
9. تهانينا
تهانينا! لقد شغّلت أول تجربتَين من تجارب AlphaEvolve على Google Cloud وطوّرت خوارزميتَين، وهما تعبئة الدوائر وطريقة إرشادية لمشكلة البائع المتجوّل، باستخدام برنامج أولي ودالة تسجيل وGemini فقط.
ما تعلّمته
- طريقة عمل حلقة AlphaEvolve: البرنامج الأولي -> الإنشاء -> التقييم -> التسجيل -> التكرار
- عقد EVOLVE-BLOCK الذي يسمح للبحث بتحسين وصفة بدون التلاعب بالمقياس
- كيفية توجيه النتيجة والمعلومات المستخلَصة من حالات الفشل للجيل التالي
- كيفية إعداد تجربة التقييم المحلي وتشغيلها وقراءتها وضبطها
دروس تطبيقية حول الترميز أخرى
هذه الدروس مستقلة ويمكنك إكمالها بأي ترتيب.
- تطوير رمز مجمَّع باستخدام مقيِّم عن بُعد: تطوير خوارزمية Rust/C++ يتم تسجيلها بواسطة مقيِّم في حاوية على Cloud Run
- تطوير عملية الضبط الدقيق لنموذج لغوي كبير على GKE + Ray: تشغيل عمليات تقييم متوازية وثقيلة لوحدة معالجة الرسومات على مجموعتك