بدء استخدام AlphaEvolve على Google Cloud

1. مقدمة

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

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

حلقة AlphaEvolve المحلية: ينشئ وكيل AlphaEvolve برامج مرشّحة على Gemini Enterprise في Google Cloud، وتستردّها حلقة التطوير (run_evolution.py) على جهازك باستخدام acquire_programs()، وتُسجّل كل برنامج في بيئة اختبار معزولة محلية باستخدام exec() مع evaluate.py، وتعرض النتائج باستخدام submit_program_evaluations().

الإجراءات التي ستنفذّها

  • إعداد تجربة AlphaEvolve في مشروعك على Google Cloud
  • تشغيل بحث تطوّري يحسّن خوارزمية تعبئة الدوائر محليًا
  • قراءة النتيجة والترتيب وتمثيل أفضل برنامج تم تطويره
  • تكرار الحلقة في مسألة البائع المتجوّل لتعميم النمط
  • ضبط ميزانية البحث (المرشّحون، والتزامن، والنموذج)

المتطلبات

  • متصفّح ويب، مثل Chrome
  • مشروع Google Cloud تم تفعيل الفوترة فيه
  • الإصدار 3.9 أو الإصدارات الأحدث من Python وuv
  • معرفة أساسية بلغة Python وسطر الأوامر

هذا الدرس التطبيقي حول الترميز مخصّص لمهندسي ومطوّري الذكاء الاصطناعي/تعلُّم الآلة من جميع المستويات. لا يلزم توفّر خلفية في الحساب التطوّري.

الوقت المقدّر لإنهاء الدرس: 45 إلى 60 دقيقة

التكلفة: يستخدم هذا الدرس التطبيقي حول الترميز التقييم المحلي (بدون وحدة معالجة الرسومات أو GKE). الرسوم الوحيدة هي رسوم استخدام واجهة AlphaEvolve API لإنشاء المرشّحين.

تم اختبارها باستخدام مكتبة AlphaEvolve Cloud v0.1.0، وPython 3.9 والإصدارات الأحدث، وذلك على المثالَين circle_packing وtsp.

2. قبل البدء

اختَر مشروعك وفعِّل واجهة برمجة التطبيقات

  1. في Google Cloud Console، اختَر مشروعًا تم تفعيل الفوترة فيه أو أنشِئ مشروعًا جديدًا، ثم اضبطه في نافذة الأوامر:
gcloud config set project <YOUR_PROJECT_ID>
  1. فعِّل واجهة برمجة التطبيقات Discovery Engine API التي تعرض AlphaEvolve:
gcloud services enable discoveryengine.googleapis.com

العثور على معرّف تطبيق Gemini Enterprise

يتم عرض AlphaEvolve من خلال Gemini Enterprise (سطح REST الأساسي هو Discovery Engine API). يجب توفير رقم تعريف تطبيقك، وليس اسمه المعروض، لإعداد GE_APP_ID.

  1. افتح صفحة تطبيقات Gemini Enterprise لمشروعك.
  2. انقر على تطبيقك وانسخ حقل رقم التعريف (على سبيل المثال، gemini-enterprise-1234567890_1234567890123).

المصادقة والاستنساخ والتثبيت

  1. للمصادقة باستخدام بيانات الاعتماد التلقائية للتطبيق، اتّبِع الخطوات التالية:
gcloud auth application-default login
  1. استنسِخ مستودع نماذج التعليمات البرمجية وافتحه. ستنفّذ كل أمر من جذر مستودع الرموز هذا:
git clone https://github.com/Google-Cloud-AI/alphaevolve-on-googlecloud.git
cd alphaevolve-on-googlecloud
  1. أنشئ بيئة افتراضية وثبِّت فيها مكتبة برامج 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.

ملاحظة: تحديد المشاكل وحلّها: يعني الرمز PERMISSION_DENIED أو 403 عادةً أنّ واجهة Discovery Engine API غير مفعّلة في المشروع. أعِد التحقّق من الخطوة "قبل البدء". إذا انتهى التشغيل على الفور بالرسالة "تعذّر إنشاء التجربة"، يعني ذلك أنّ بيانات الاعتماد أو GE_APP_ID في .env غير صحيحة.

5- قراءة النتائج

تعرض عملية التشغيل البرامج الأعلى ترتيبًا حسب sum_of_radii (كلما كان الرقم أعلى، كان ذلك أفضل). هناك أمران يجب الانتباه إليهما:

  • ارتفعت النتيجة. يجب أن يتفوّق أفضل sum_of_radii تم تطويره على تصميم الحلقة المتداخلة الخاص بالكلمة الأساسية. عادةً ما يكتشف Gemini أنّ الدوائر القريبة من الزوايا والحواف يمكن أن تكبر، ويعيد ضبط توازن الجزء الداخلي.
  • يتم تخطّي المرشّحين غير الصالحين. أي برنامج أنتج دوائر متداخلة أو خارج الحدود حصل على النتيجة -inf وتم تخطّيه في الترتيب، وهذا يعني أنّ ملاحظات القيود تعمل بشكل صحيح وليس خطأ.

أصبح لديك الآن حلقة كاملة: إنشاء -> إنشاء -> تقييم -> تسجيل -> تكرار. كل ما عدا ذلك في AlphaEvolve هو شكل مختلف من أشكال تنفيذ التقييم.

6. تطوير عملية بحث حقيقية: مقدّم خدمة الرموز المميزة

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

  1. زيادة الميزانية في .env حتى يكون هناك مجال لتحسين أداء عبارة البحث الأطول:
# in .env — raise the generation cap and the evaluation target together
MAX_PROGRAMS_GENERATED=20
MAX_PROGRAMS_EVALUATED=20
  1. نفِّذ الأمر من جذر المستودع:
uv run python -m examples.tsp.src.run_evolution

إنّ نقطة البداية هنا هي جولة أقرب جار في أكثر من 50 مدينة، والمقياس هو neg_tour_length (متوسط طول الجولة السلبي في 5 حالات ثابتة، لذا كلما زادت القيمة كان ذلك أفضل). افتح examples/tsp/src/program.py ولاحظ أنّ construct_tour(distances, n) فقط داخل EVOLVE-BLOCK.

المسألتان تتضمّنان النمط نفسه مع قطع مختلفة:

المشكلة

اللغة

التقييم

المقياس (كلما كان أعلى، كان أفضل)

ما الذي يتطوّر؟

circle_packing

Python

محلي exec()

sum_of_radii

construct_packing()

tsp

Python

محلي exec()

neg_tour_length

construct_tour()

أثناء تنفيذ البحث، راقِب ارتفاع 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 التي تنشئ المرشّحين في عملية التعبئة الدائرية (يقرأ وحدة TSP قيمة 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 لكل تصميم مقترَح يتم إنشاؤه. ابدأ بميزانية صغيرة.

8. تَنظيم

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

git clean -xfd   # removes .env, .venv, and generated outputs

ملاحظة: يؤدي git clean -xfd إلى حذف .env (بما في ذلك إعدادات مشروعك) و.venv. تخطَّ هذه الخطوة إذا كنت تريد مواصلة تجربة أفكار جديدة.

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

9. تهانينا

تهانينا! أجريت تجارب AlphaEvolve الأولى على Google Cloud وطوّرت خوارزميتَين، وهما خوارزمية تعبئة الدوائر وخوارزمية تقريبية لمسألة البائع المتجوّل، باستخدام برنامج أساسي ودالة تسجيل نقاط وGemini فقط.

ما تعلّمته

  • طريقة عمل حلقة AlphaEvolve: إنشاء بيانات أولية -> إنشاء بيانات -> تقييم -> تسجيل -> تكرار
  • عقد EVOLVE-BLOCK الذي يتيح لمحرك البحث تحسين وصفة بدون التلاعب بالمقياس
  • كيف توجّه النتائج وإحصاءات حالات الفشل الجيل القادم؟
  • كيفية إعداد تجربة تقييم محلّي وتشغيلها وقراءتها وتعديلها

دروس تطبيقية أخرى حول الترميز

هذه المهام مستقلة، ويمكنك تنفيذها بأي ترتيب.

  • تطوير التعليمات البرمجية المترجَمة باستخدام أداة تقييم عن بُعد: تطوير خوارزمية Rust/C++ يتم تقييمها بواسطة أداة تقييم مستنِدة إلى الحاويات على Cloud Run
  • تطوير عملية الضبط الدقيق للنماذج اللغوية الكبيرة (LLM) على GKE + Ray: يمكنك إجراء تقييمات متوازية ومكثّفة لوحدات معالجة الرسومات على مجموعتك الخاصة.

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