Çoklu Temsilci Sistemi Oluşturma

1. Giriş

Genel Bakış

Bu laboratuvarda, basit chatbot'ların ötesine geçerek dağıtılmış çok agent'lı bir sistem oluşturacaksınız.

Tek bir LLM soruları yanıtlayabilir ancak gerçek dünyadaki karmaşıklık genellikle uzmanlaşmış roller gerektirir. Arka uç mühendisinize kullanıcı arayüzü tasarlamasını veya tasarımcınıza veritabanı sorgularını optimize etmesini istemezsiniz. Benzer şekilde, tek bir göreve odaklanan ve karmaşık sorunları çözmek için birbirleriyle koordineli çalışan uzmanlaşmış yapay zeka aracıları oluşturabiliriz.

Aşağıdakilerden oluşan bir Kurs Oluşturma Sistemi oluşturacaksınız:

  1. Araştırmacı Temsilci: Güncel bilgileri bulmak için google_search kullanır.
  2. Değerlendirme Ajanı: Araştırmayı kalite ve eksiksizlik açısından eleştirir.
  3. İçerik Oluşturma Aracısı: Araştırmayı yapılandırılmış bir kursa dönüştürme.
  4. Orchestrator Agent: İş akışını ve bu uzmanlar arasındaki iletişimi yönetir.

Ön koşullar

  • Temel Python bilgisi
  • Google Cloud Console'u kullanma konusunda bilgi sahibi olmanız gerekir.

Yapacaklarınız

  • Web'de arama yapabilen bir araç kullanma aracısı (researcher) tanımlayın.
  • judge için Pydantic ile yapılandırılmış çıkış uygulayın.
  • Agent-to-Agent (A2A) protokolünü kullanarak uzak temsilcilere bağlanın.
  • Araştırmacı ile hakem arasında geri bildirim döngüsü oluşturmak için LoopAgent oluşturun.
  • ADK'yı kullanarak dağıtılmış sistemi yerel olarak çalıştırın.
  • Çoklu aracı sistemini Google Cloud Run'a dağıtın.

Mimari ve Düzenleme İlkeleri

Kod yazmadan önce bu aracıların birlikte nasıl çalıştığını anlayalım. Kurs Oluşturma Ardışık Düzeni geliştiriyoruz.

Sistem Tasarımı

Mimari Diyagramı

Temsilcilerle düzenleme

Standart temsilciler (ör. Araştırmacı) çalışır. Orkestrasyon aracıları (ör. LoopAgent veya SequentialAgent) diğer aracıları yönetir. Kendi araçları yoktur; "araçları" yetki devridir.

  1. LoopAgent: Bu, kodda while döngüsü gibi çalışır. Bir koşul karşılanana (veya maksimum yineleme sayısına ulaşılana) kadar bir dizi aracı tekrar tekrar çalıştırır. Bu özelliği Araştırma Döngüsü için kullanırız:
    • Araştırmacı bilgi bulur.
    • Hakem, şarkıyı eleştirir.
    • Judge "Başarısız" derse EscalationChecker döngünün devam etmesine izin verir.
    • Judge (Yargıç) "Geç" derse EscalationChecker (Yükseltme Kontrolü) döngüyü sonlandırır.
  2. SequentialAgent: Bu, standart bir komut dosyası yürütme işlemi gibi çalışır. Aracıları birbiri ardına çalıştırır. Bu bilgiyi üst düzey satış süreci için kullanırız:
    • Öncelikle Araştırma Döngüsü'nü (iyi verilerle tamamlanana kadar) çalıştırın.
    • Ardından, Content Builder'ı (içerik oluşturucu) çalıştırın.

Bu ikisini birleştirerek nihai çıkışı oluşturmadan önce kendini düzeltebilen sağlam bir sistem oluştururuz.

2. Kurulum

Ortam Kurulumu

Cloud Shell'i açın: Yeni bir sekme açıp shell.cloud.google.com adresini girin.

Başlangıç kodunu alma

  1. Başlangıç deposunu ana dizininize klonlayın:
    cd ~
    git clone https://github.com/amitkmaraj/prai-roadshow-lab-1-starter.git
    cd prai-roadshow-lab-1-starter
    
  2. Onramp kredilerini faturalandırmayla ilişkilendirmek için init komut dosyasını çalıştırın.
    chmod +x ./init.sh
    ./init.sh
    
  3. Bu klasörü düzenleyicinizde açın.

API'leri etkinleştir

Yeni bir projeniz olduğuna göre, gerekli Google Cloud hizmetlerini etkinleştirmek için aşağıdaki komutu çalıştırın:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com \
    compute.googleapis.com

Bu işlem birkaç saniye sürebilir.

Bağımlılıkları yükleme

Hızlı bağımlılık yönetimi için uv kullanıyoruz.

  1. Proje bağımlılıklarını yükleyin:
    # Ensure you have uv installed: pip install uv
    uv sync
    
  2. Google Cloud proje kimliğinizi ayarlayın.
    • İpucu: Proje kimliğinizi Cloud Console kontrol panelinde veya gcloud config get-value project komutunu çalıştırarak bulabilirsiniz.
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    
  3. Kalan ortam değişkenlerini ayarlayın:
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
    Uyarı: Ortam değişkenleri, yeni terminal oturumlarında kalıcı olmaz. Yeni bir terminal sekmesi açarsanız bu dışa aktarma komutlarını yeniden çalıştırmanız gerekir.

3. 🕵️ Araştırmacı Temsilci

Araştırma Ajanı

Araştırmacı bir uzmandır. Tek görevi bilgi bulmaktır. Bunun için Google Arama aracına erişmesi gerekir.

Araştırmacı neden ayrılmalıdır?

Ayrıntılı İnceleme: Neden her şeyi tek bir temsilci yapmıyor?

Küçük ve odaklanmış aracıların değerlendirilmesi ve hata ayıklaması daha kolaydır. Araştırma kötüyse Araştırmacı istemini yineleyin. Kurs biçimlendirmesi kötüyse İçerik Oluşturucu'da yineleme yaparsınız. Tek bir "her şeyi yap" isteminde bir şeyi düzeltmek genellikle başka bir şeyi bozar.

  1. Cloud Shell'de çalışıyorsanız Cloud Shell düzenleyiciyi açmak için aşağıdaki komutu çalıştırın:
    cloudshell workspace .
    
    Yerel ortamınızda çalışıyorsanız en sevdiğiniz IDE'yi açın.
  2. agents/researcher/agent.py adlı kişiyi aç.
  3. Yapılacaklar listesi içeren bir iskelet görürsünüz.
  4. researcher aracısını tanımlamak için aşağıdaki kodu ekleyin:
    # ... existing imports ...
    
    # Define the Researcher Agent
    researcher = Agent(
        name="researcher",
        model=MODEL,
        description="Gathers information on a topic using Google Search.",
        instruction="""
        You are an expert researcher. Your goal is to find comprehensive and accurate information on the user's topic.
        Use the `google_search` tool to find relevant information.
        Summarize your findings clearly.
        If you receive feedback that your research is insufficient, use the feedback to refine your next search.
        """,
        tools=[google_search],
    )
    
    root_agent = researcher
    

Temel Kavram: Araç Kullanımı

tools=[google_search] değerini ilettiğimize dikkat edin. ADK, bu aracı LLM'ye açıklama karmaşıklığını yönetir. Model bilgiye ihtiyaç duyduğuna karar verdiğinde yapılandırılmış bir araç çağrısı oluşturur, ADK Python işlevini google_search yürütür ve sonucu modele geri gönderir.

4. ⚖️ The Judge Agent

Judge Agent

Araştırmacı çok çalışır ancak LLM'ler tembel olabilir. Çalışmayı incelemek için bir Yargıcı'ya ihtiyacımız var. Hakim, araştırmayı kabul eder ve yapılandırılmış bir Geçti/Kaldı değerlendirmesi döndürür.

Yapılandırılmış Çıkış

Ayrıntılı Bilgi: İş akışlarını otomatikleştirmek için tahmin edilebilir çıktılara ihtiyacımız vardır. Dağınık bir metin yorumunun programatik olarak ayrıştırılması zordur. JSON şeması (Pydantic kullanılarak) zorunlu kılınarak, Hakim'in kodumuzun güvenilir bir şekilde işlem yapabileceği bir boolean pass veya fail döndürmesi sağlanır.

  1. agents/judge/agent.py adlı kişiyi aç.
  2. JudgeFeedback şemasını ve judge aracısını tanımlayın.
    # 1. Define the Schema
    class JudgeFeedback(BaseModel):
        """Structured feedback from the Judge agent."""
        status: Literal["pass", "fail"] = Field(
            description="Whether the research is sufficient ('pass') or needs more work ('fail')."
        )
        feedback: str = Field(
            description="Detailed feedback on what is missing. If 'pass', a brief confirmation."
        )
    
    # 2. Define the Agent
    judge = Agent(
        name="judge",
        model=MODEL,
        description="Evaluates research findings for completeness and accuracy.",
        instruction="""
        You are a strict editor.
        Evaluate the 'research_findings' against the user's original request.
        If the findings are missing key info, return status='fail'.
        If they are comprehensive, return status='pass'.
        """,
        output_schema=JudgeFeedback,
        # Disallow delegation because it should only output the schema
        disallow_transfer_to_parent=True,
        disallow_transfer_to_peers=True,
    )
    
    root_agent = judge
    

Temel Kavram: Aracı Davranışını Kısıtlama

disallow_transfer_to_parent=True ve disallow_transfer_to_peers=True değerlerini ayarladık. Bu, Yargıç'ı yalnızca yapılandırılmış JudgeFeedback döndürmeye zorlar. Kullanıcıyla "sohbet etmeye" veya başka bir temsilciye yetki vermeye karar veremez. Bu, mantık akışımızda belirleyici bir bileşen olmasını sağlar.

5. 🧪 İzolasyonda Test Etme

Bağlamadan önce her temsilcinin çalıştığını doğrulayabiliriz. ADK, aracıları tek tek çalıştırmanıza olanak tanır.

Temel Kavram: Etkileşimli Çalışma Zamanı

adk run, "kullanıcı" olduğunuz hafif bir ortam oluşturur. Bu sayede, aracının talimatlarını ve araç kullanımını ayrı ayrı test edebilirsiniz. Aracı burada başarısız olursa (ör. Google Arama'yı kullanamazsa) kesinlikle düzenlemede de başarısız olur.

  1. Araştırmacı'yı etkileşimli olarak çalıştırın. Belirli bir aracı dizinini gösterdiğimizi unutmayın:
    # This runs the researcher agent in interactive mode
    uv run adk run agents/researcher
    
  2. Sohbet istemine şunu yazın:
    Find the population of Tokyo in 2020
    
    Google Arama aracını kullanmalı ve yanıtı döndürmelidir.Not: Proje, konum ve Vertex kullanımının ayarlanmadığını belirten bir hata görürseniz proje kimliğinizin ayarlandığından emin olun ve aşağıdakileri yürütün:
    export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
    export GOOGLE_CLOUD_LOCATION=us-central1
    export GOOGLE_GENAI_USE_VERTEXAI=true
    
  3. Sohbetten çıkın (Ctrl+C).
  4. Hakim'i etkileşimli olarak çalıştırma:
    uv run adk run agents/judge
    
  5. Sohbet isteminde girişi simüle edin:
    Topic: Tokyo. Findings: Tokyo is a city.
    
    Bulgular çok kısa olduğundan status='fail' döndürülmelidir.

6. ✍️ İçerik Oluşturucu Temsilcisi

İçerik Oluşturucu

İçerik Oluşturucu, yaratıcı yazardır. Onaylanan araştırmayı alıp kursa dönüştürür.

  1. agents/content_builder/agent.py adlı kişiyi aç.
  2. content_builder aracısını tanımlayın.
    content_builder = Agent(
        name="content_builder",
        model=MODEL,
        description="Transforms research findings into a structured course.",
        instruction="""
        You are an expert course creator.
        Take the approved 'research_findings' and transform them into a well-structured, engaging course module.
    
        **Formatting Rules:**
        1. Start with a main title using a single `#` (H1).
        2. Use `##` (H2) for main section headings.
        3. Use bullet points and clear paragraphs.
        4. Maintain a professional but engaging tone.
    
        Ensure the content directly addresses the user's original request.
        """,
    )
    root_agent = content_builder
    

Temel Kavram: Bağlam Yayma

"İçerik Oluşturucu, Araştırmacı'nın bulduğu bilgileri nasıl biliyor?" diye merak edebilirsiniz. ADK'da, bir işlem hattındaki aracılar session.state paylaşır. Daha sonra Orchestrator'da, Researcher ve Judge'in çıkışlarını bu paylaşılan duruma kaydedecek şekilde yapılandıracağız. İçerik Oluşturucu'nun istemi, bu geçmişe etkili bir şekilde erişebilir.

7. 🎻 Orkestra Şefi

Orchestrator Agent

Orchestrator, çoklu aracı ekibimizin yöneticisidir. Belirli görevleri yerine getiren uzman temsilcilerin (Araştırmacı, Yargıç, İçerik Oluşturucu) aksine, Düzenleyicinin görevi iş akışını koordine etmek ve bilgilerinin aralarında doğru şekilde akmasını sağlamaktır.

🌐 Mimari: Temsilciden Temsilciye (A2A)

A2A Mimarisi

Bu laboratuvarda dağıtılmış bir sistem oluşturacağız. Tüm aracıları tek bir Python sürecinde çalıştırmak yerine bağımsız mikro hizmetler olarak dağıtırız. Bu sayede her aracı bağımsız olarak ölçeklenebilir ve tüm sistemin çökmesine neden olmadan başarısız olabilir.

Bunu mümkün kılmak için Agent-to-Agent (A2A) protokolünü kullanırız.

A2A Protokolü

Ayrıntılı Bilgi: Bir üretim sisteminde aracıların farklı sunucularda (hatta farklı bulutlarda) çalıştırılması gerekir. A2A protokolü, bu cihazların HTTP üzerinden birbirini keşfetmesi ve birbirleriyle konuşması için standart bir yol oluşturur. RemoteA2aAgent, bu protokolün ADK istemcisidir.

  1. agents/orchestrator/agent.py adlı kişiyi aç.
  2. Yorumu # TODO: Define Remote Agents veya uzaktan temsilci tanımları bölümünü bulun.
  3. Bağlantıları tanımlamak için aşağıdaki kodu ekleyin. Bu kodu, içe aktarma işlemlerinden sonra ve diğer tüm aracı tanımlarından önce yerleştirdiğinizden emin olun.
    # ... existing code ...
    
    # Connect to the Researcher (Localhost port 8001)
    researcher_url = os.environ.get("RESEARCHER_AGENT_CARD_URL", "http://localhost:8001/a2a/agent/.well-known/agent-card.json")
    researcher = RemoteA2aAgent(
        name="researcher",
        agent_card=researcher_url,
        description="Gathers information using Google Search.",
        # IMPORTANT: Save the output to state for the Judge to see
        after_agent_callback=create_save_output_callback("research_findings"),
        # IMPORTANT: Use authenticated client for communication
        httpx_client=create_authenticated_client(researcher_url)
    )
    
    # Connect to the Judge (Localhost port 8002)
    judge_url = os.environ.get("JUDGE_AGENT_CARD_URL", "http://localhost:8002/a2a/agent/.well-known/agent-card.json")
    judge = RemoteA2aAgent(
        name="judge",
        agent_card=judge_url,
        description="Evaluates research.",
        after_agent_callback=create_save_output_callback("judge_feedback"),
        httpx_client=create_authenticated_client(judge_url)
    )
    
    # Content Builder (Localhost port 8003)
    content_builder_url = os.environ.get("CONTENT_BUILDER_AGENT_CARD_URL", "http://localhost:8003/a2a/agent/.well-known/agent-card.json")
    content_builder = RemoteA2aAgent(
        name="content_builder",
        agent_card=content_builder_url,
        description="Builds the course.",
        httpx_client=create_authenticated_client(content_builder_url)
    )
    

8. 🛑 Ayrıcalık Artırma Kontrolü

Bir döngünün durdurulması gerekir. Hakem "Geç" derse döngüden hemen çıkıp İçerik Oluşturucu'ya geçmek istiyoruz.

BaseAgent ile özel mantık

Ayrıntılı Bilgi: Tüm temsilciler büyük dil modellerini kullanmaz. Bazen basit Python mantığına ihtiyacınız olur. BaseAgent, yalnızca kod çalıştıran bir temsilci tanımlamanıza olanak tanır. Bu durumda, oturum durumunu kontrol ederiz ve EventActions(escalate=True) kullanarak LoopAgent'nin durmasını sağlarız.

  1. agents/orchestrator/agent.py içinde kalmaya devam ediyor.
  2. EscalationChecker TODO yer tutucusunu bulun.
  3. Bunu aşağıdaki uygulama ile değiştirin:
    class EscalationChecker(BaseAgent):
        """Checks the judge's feedback and escalates (breaks the loop) if it passed."""
    
        async def _run_async_impl(
            self, ctx: InvocationContext
        ) -> AsyncGenerator[Event, None]:
            # Retrieve the feedback saved by the Judge
            feedback = ctx.session.state.get("judge_feedback")
            print(f"[EscalationChecker] Feedback: {feedback}")
    
            # Check for 'pass' status
            is_pass = False
            if isinstance(feedback, dict) and feedback.get("status") == "pass":
                is_pass = True
            # Handle string fallback if JSON parsing failed
            elif isinstance(feedback, str) and '"status": "pass"' in feedback:
                is_pass = True
    
            if is_pass:
                # 'escalate=True' tells the parent LoopAgent to stop looping
                yield Event(author=self.name, actions=EventActions(escalate=True))
            else:
                # Continue the loop
                yield Event(author=self.name)
    
    escalation_checker = EscalationChecker(name="escalation_checker")
    

Temel Kavram: Etkinlikler Aracılığıyla Kontrol Akışı

Temsilciler yalnızca metinle değil, Etkinlikler ile de iletişim kurar. Bu aracı, escalate=True ile bir etkinlik oluşturarak üst öğesine (LoopAgent) bir sinyal gönderir. LoopAgent, bu sinyali yakalayacak ve döngüyü sonlandıracak şekilde programlanmıştır.

9. 🔁 Araştırma Döngüsü

Research Loop

Geri bildirim döngüsüne ihtiyacımız var: Araştırma -> Değerlendirme -> (Başarısız) -> Araştırma -> ...

  1. agents/orchestrator/agent.py içinde kalmaya devam ediyor.
  2. research_loop tanımını ekleyin. Bu EscalationChecker sınıfını ve escalation_checker örneğini sonraya yerleştirin.
    research_loop = LoopAgent(
        name="research_loop",
        description="Iteratively researches and judges until quality standards are met.",
        sub_agents=[researcher, judge, escalation_checker],
        max_iterations=3,
    )
    

Temel Kavram: LoopAgent

LoopAgent, sub_agents öğelerini sırayla gösterir.

  1. researcher: Verileri bulur.
  2. judge: Verileri değerlendirir.
  3. escalation_checker: yield Event(escalate=True) olup olmayacağına karar verir. escalate=True gerçekleşirse döngü erken sonlanır. Aksi takdirde, araştırmacıdan (max_iterations'ya kadar) yeniden başlatılır.

10. 🔗 Son Ardışık Düzen

Son Ardışık Düzen

Son olarak, hepsini bir araya getirin.

  1. agents/orchestrator/agent.py içinde kalmaya devam ediyor.
  2. Dosyanın alt kısmında root_agent tanımlayın. Bu yer tutucunun, mevcut root_agent = None yer tutucularının yerini aldığından emin olun.
    root_agent = SequentialAgent(
        name="course_creation_pipeline",
        description="A pipeline that researches a topic and then builds a course from it.",
        sub_agents=[research_loop, content_builder],
    )
    

Temel Kavram: Hiyerarşik Bileşim

research_loop'nın kendisinin de bir temsilci (LoopAgent) olduğunu unutmayın. Bu temsilciyi, SequentialAgent içindeki diğer tüm alt temsilciler gibi değerlendiririz. Bu birleştirilebilirlik özelliği sayesinde basit kalıpları (diziler içindeki döngüler, yönlendiriciler içindeki diziler vb.) iç içe yerleştirerek karmaşık mantıklar oluşturabilirsiniz.

11. 💻 Yerel Olarak Çalıştırma

Her şeyi çalıştırmadan önce ADK'nın dağıtılmış ortamı yerel olarak nasıl simüle ettiğine bakalım.

Ayrıntılı İnceleme: Yerel Geliştirmenin İşleyiş Şekli

Mikro hizmet mimarisinde her aracı kendi sunucusu olarak çalışır. Dağıtım yaptığınızda 4 farklı Cloud Run hizmetiniz olur. 4 terminal sekmesi açıp 4 komut çalıştırmanız gerekiyorsa bunu yerel olarak simüle etmek zor olabilir.

Bu komut dosyası, Araştırmacı (8001 numaralı bağlantı noktası), Hakem (8002) ve İçerik Oluşturucu (8003) için uvicorn işlemi başlatır. RESEARCHER_AGENT_CARD_URL gibi ortam değişkenlerini ayarlar ve bunları düzenleyiciye (8004 bağlantı noktası) iletir. Bulutta daha sonra tam olarak bu şekilde yapılandıracağız.

Uygulama Çalışıyor

  1. Orkestrasyon komut dosyasını çalıştırın:
    ./run_local.sh
    
    Bu işlem 4 ayrı süreci başlatır.
  2. Test edin:
    • Cloud Shell kullanıyorsanız: Web Önizlemesi düğmesini (terminalin sağ üst kısmı) -> 8080 bağlantı noktasında önizle -> Bağlantı noktasını değiştir'i tıklayarak 8000 olarak değiştirin.
    • Yerel olarak çalıştırıyorsanız: Tarayıcınızda http://localhost:8000 adresini açın.
    • İstem: "Kahvenin tarihi hakkında bir kurs oluştur."
    • Gözlemleyin: Düzenleyici, araştırmacıyı arar. Çıkış, Hakime iletilir. Hakem başarısız olursa döngü devam eder.
    Sorun giderme:
    • "Internal Server Error" (Dahili Sunucu Hatası) / Kimlik Doğrulama Hataları: Kimlik doğrulama hataları (ör. google-auth ile ilgili) görüyorsanız yerel bir makinede çalıştırıyorsanız gcloud auth application-default login komutunu çalıştırdığınızdan emin olun. Cloud Shell'de GOOGLE_CLOUD_PROJECT ortam değişkeninizin doğru şekilde ayarlandığından emin olun.
    • Terminal Hataları: Komut yeni bir terminal penceresinde başarısız olursa ortam değişkenlerinizi (GOOGLE_CLOUD_PROJECT vb.) yeniden dışa aktarmayı unutmayın.
  3. Aracıları İzole Ederek Test Etme: Tam sistem çalışırken bile belirli aracıları doğrudan bağlantı noktalarını hedefleyerek test edebilirsiniz. Bu, tüm zinciri tetiklemeden belirli bir bileşende hata ayıklamak için kullanışlıdır.
    • Yalnızca Araştırmacı (Bağlantı Noktası 8001): http://localhost:8001
    • Judge Only (Port 8002): http://localhost:8002
    • Yalnızca İçerik Oluşturucu (8003 numaralı bağlantı noktası): http://localhost:8003
    • Orchestrator (bağlantı noktası 8004): http://localhost:8004 (Orchestrator mantığına doğrudan erişim)

12. 🚀 Cloud Run'a dağıtma

Nihai doğrulama bulutta çalışır. Her aracıyı ayrı bir hizmet olarak dağıtırız.

Dağıtım Yapılandırmasını Anlama

Aracıları Cloud Run'a dağıtırken davranışlarını ve bağlantılarını yapılandırmak için çeşitli ortam değişkenleri iletiyoruz:

  • GOOGLE_CLOUD_PROJECT: Temsilcinin, günlük kaydı ve Vertex AI çağrıları için doğru Google Cloud projesini kullanmasını sağlar.
  • GOOGLE_GENAI_USE_VERTEXAI: Gemini API'lerini doğrudan çağırmak yerine model çıkarımı için Vertex AI'ı kullanması gerektiğini aracı çerçevesine (ADK) bildirir.
  • [AGENT]_AGENT_CARD_URL: Bu, Orchestrator için çok önemlidir. Orkestratöre uzak aracıların nerede bulunacağını bildirir. Bu değeri dağıtılan Cloud Run URL'si (özellikle aracı kartı yolu) olarak ayarlayarak Orchestrator'ın internet üzerinden Araştırmacı, Yargıç ve İçerik Oluşturucu ile iletişim kurmasını ve bunları bulmasını sağlarız.
  1. Araştırmacı'yı dağıtın:
    gcloud run deploy researcher \
      --source agents/researcher/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL'yi yakalayın:
    RESEARCHER_URL=$(gcloud run services describe researcher --region us-central1 --format='value(status.url)')
    echo $RESEARCHER_URL
    
  2. Hakemi dağıtma:
    gcloud run deploy judge \
      --source agents/judge/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL'yi yakalayın:
    JUDGE_URL=$(gcloud run services describe judge --region us-central1 --format='value(status.url)')
    echo $JUDGE_URL
    
  3. İçerik Oluşturucu'yu dağıtma:
    gcloud run deploy content-builder \
      --source agents/content_builder/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL'yi yakalayın:
    CONTENT_BUILDER_URL=$(gcloud run services describe content-builder --region us-central1 --format='value(status.url)')
    echo $CONTENT_BUILDER_URL
    
  4. Orchestrator'ı dağıtın: Orchestrator'ı yapılandırmak için yakalanan ortam değişkenlerini kullanın.
    gcloud run deploy orchestrator \
      --source agents/orchestrator/ \
      --region us-central1 \
      --allow-unauthenticated \
      --labels dev-tutorial=prod-ready-1 \
      --set-env-vars RESEARCHER_AGENT_CARD_URL=$RESEARCHER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars JUDGE_AGENT_CARD_URL=$JUDGE_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars CONTENT_BUILDER_AGENT_CARD_URL=$CONTENT_BUILDER_URL/a2a/agent/.well-known/agent-card.json \
      --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT \
      --set-env-vars GOOGLE_GENAI_USE_VERTEXAI="true"
    
    URL'yi yakalayın:
    ORCHESTRATOR_URL=$(gcloud run services describe orchestrator --region us-central1 --format='value(status.url)')
    echo $ORCHESTRATOR_URL
    
  5. Ön ucu dağıtma:
    gcloud run deploy course-creator \
        --source app \
        --region us-central1 \
        --allow-unauthenticated \
        --labels dev-tutorial=prod-ready-1 \
        --set-env-vars AGENT_SERVER_URL=$ORCHESTRATOR_URL \
        --set-env-vars GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
    
  6. Uzaktan Dağıtımı Test Etme: Dağıtılan Orchestrator'ınızın URL'sini açın. Artık tamamen bulutta çalışıyor ve aracılarınızı ölçeklendirmek için Google'ın sunucusuz altyapısını kullanıyor.İpucu: Tüm mikro hizmetleri ve URL'lerini Cloud Run arayüzünde bulabilirsiniz.

13. Özet

Tebrikler! Üretime hazır, dağıtılmış çoklu aracı sistemini başarıyla oluşturup dağıttınız.

Başarılarımız

  • Karmaşık bir görevi parçalara ayırma: Tek bir büyük istem yerine, çalışmayı uzmanlaşmış rollere (Araştırmacı, Yargıç, İçerik Oluşturucu) ayırdık.
  • Kalite Kontrolü Uygulandı: Yalnızca yüksek kaliteli bilgilerin son adıma ulaşmasını sağlamak için LoopAgent ve yapılandırılmış bir Judge kullandık.
  • Üretim için tasarlandı: Agent-to-Agent (A2A) protokolünü ve Cloud Run'ı kullanarak her aracının bağımsız ve ölçeklenebilir bir mikro hizmet olduğu bir sistem oluşturduk. Bu yöntem, her şeyi tek bir Python komut dosyasında çalıştırmaktan çok daha sağlamdır.
  • Orkestrasyon: Net kontrol akışı kalıpları tanımlamak için SequentialAgent ve LoopAgent kullandık.

Sonraki Adımlar

Artık temel bilgilere sahip olduğunuza göre bu sistemi genişletebilirsiniz:

  • Daha fazla araç ekleme: Araştırmacıya dahili belgelere veya API'lere erişim izni verin.
  • Yargılayıcıyı iyileştirme: Daha spesifik ölçütler veya hatta "İnsan müdahalesi" adımı ekleyin.
  • Modelleri Değiştirme: Farklı aracıları için farklı modeller kullanmayı deneyin (ör. Yargıç için daha hızlı bir model, İçerik Yazıcı için daha güçlü bir model).

Artık Google Cloud'da karmaşık ve güvenilir aracı iş akışları oluşturmaya hazırsınız.