Multi-Agenten-Systeme
Erstellen Sie anspruchsvolle Anwendungen, indem Sie spezialisierte Agents zu Teams zusammenstellen.
Was Sie erstellen werden
In diesem Leitfaden erstellen Sie ein Kundendienstsystem, in dem ein coordinator Anfragen an specialists weiterleitet:
βββββββββββββββββββββββ
Benutzeranfrage β β
βββββββββββββββββΆ β COORDINATOR β
β "An Experten weiterleiten" β
ββββββββββββ¬βββββββββββ
β
βββββββββββββββββ΄ββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β BILLING AGENT β β SUPPORT AGENT β
β β β β
β π° Zahlungen β β π§ Technische Probleme β
β π Rechnungen β β π Bug-Meldungen β
β π³ Abonnements β β β Anleitungen β
ββββββββββββββββββββ ββββββββββββββββββββ
Wichtige Konzepte:
- Coordinator - EmpfΓ€ngt alle Anfragen, entscheidet, wer sie bearbeitet
- Specialists - Fokussierte Agents, die sich in bestimmten DomΓ€nen auszeichnen
- Transfer - Nahtlose Γbergabe vom coordinator an den specialist
Schnellstart
1. Ihr Projekt erstellen
cargo new multi_agent_demo
cd multi_agent_demo
AbhΓ€ngigkeiten zu Cargo.toml hinzufΓΌgen:
[dependencies]
adk-rust = { version = "0.2", features = ["agents", "models", "cli"] }
tokio = { version = "1", features = ["full"] }
dotenvy = "0.15"
Erstellen Sie .env mit Ihrem API-SchlΓΌssel:
echo 'GOOGLE_API_KEY=your-api-key' > .env
2. Kundenservice-Beispiel
Hier ist ein vollstΓ€ndiges, funktionierendes Beispiel:
use adk_rust::prelude::*;
use adk_rust::Launcher;
use std::sync::Arc;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().ok();
let api_key = std::env::var("GOOGLE_API_KEY")?;
let model = Arc::new(GeminiModel::new(&api_key, "gemini-2.5-flash")?);
// Specialist: Billing Agent
let billing_agent = LlmAgentBuilder::new("billing_agent")
.description("Handles billing questions: payments, invoices, subscriptions, refunds")
.instruction("You are a billing specialist. Help customers with:\n\
- Invoice questions and payment history\n\
- Subscription plans and upgrades\n\
- Refund requests\n\
- Payment method updates\n\
Be professional and provide clear information about billing matters.")
.model(model.clone())
.build()?;
// Specialist: Technical Support Agent
let support_agent = LlmAgentBuilder::new("support_agent")
.description("Handles technical support: bugs, errors, troubleshooting, how-to questions")
.instruction("You are a technical support specialist. Help customers with:\n\
- Troubleshooting errors and bugs\n\
- How-to questions about using the product\n\
- Configuration and setup issues\n\
- Performance problems\n\
Be patient and provide step-by-step guidance.")
.model(model.clone())
.build()?;
// Coordinator: Routes to appropriate specialist
let coordinator = LlmAgentBuilder::new("coordinator")
.description("Main customer service coordinator")
.instruction("You are a customer service coordinator. Analyze each customer request:\n\n\
- For BILLING questions (payments, invoices, subscriptions, refunds):\n\
Transfer to billing_agent\n\n\
- For TECHNICAL questions (errors, bugs, how-to, troubleshooting):\n\
Transfer to support_agent\n\n\
- For GENERAL greetings or unclear requests:\n\
Respond yourself and ask clarifying questions\n\n\
When transferring, briefly acknowledge the customer and explain the handoff.")
.model(model.clone())
.sub_agent(Arc::new(billing_agent))
.sub_agent(Arc::new(support_agent))
.build()?;
println!("π’ Customer Service Center");
println!(" Coordinator β Billing Agent | Support Agent");
println!();
Launcher::new(Arc::new(coordinator)).run().await?;
Ok(())
}
Beispielinteraktion:
You: I have a question about my last invoice
[Agent: coordinator]
Assistant: I'll connect you with our billing specialist to help with your invoice question.
[Agent: billing_agent]
Assistant: Hello! I can help you with your invoice. What specific question do you have about your last invoice?
You: Why was I charged twice?
[Agent: billing_agent]
Assistant: I understand your concern about the duplicate charge. Let me help you investigate this...
Wie Multi-Agenten-Transfer funktioniert
Das Gesamtbild
Wenn Sie sub-agents zu einem parent agent hinzufΓΌgen, erhΓ€lt das LLM die FΓ€higkeit, Aufgaben zu delegieren:
βββββββββββββββββββββββ
User Message β β
ββββββββββββββββββΆ COORDINATOR β
β β
ββββββββββββ¬βββββββββββ
β
"This is a billing question..."
β
ββββββββββββββββββ΄βββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β billing_agent β β support_agent β
β π° Payments β β π§ Tech Issues β
β π Invoices β β π Bug Reports β
ββββββββββββββββββββ ββββββββββββββββββββ
Schritt-fΓΌr-Schritt-Transferfluss
Hier ist genau, was passiert, wenn ein Benutzer eine Frage zur Abrechnung stellt:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 1: User sends message β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β User: "Why was I charged twice on my invoice?" β
β β
β β β
β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β COORDINATOR AGENT β β
β β Receives message first β β
β ββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 2: LLM analyzes and decides to transfer β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π§ LLM thinks: "This is about an invoice charge..." β
β "Invoice = billing topic..." β
β "I should transfer to billing_agent" β
β β
β π LLM calls: transfer_to_agent(agent_name="billing_agent") β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 3: Runner detects transfer and invokes target β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββ transfer event βββββββββββββββββββ β
β β Runner β ββββββββββββββββββββββΆ β billing_agent β β
β βββββββββββ (same user message) βββββββββββββββββββ β
β β
β β’ Runner finds "billing_agent" in agent tree β
β β’ Creates new context with SAME user message β
β β’ Invokes billing_agent immediately β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4: Target agent responds β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β billing_agent responds β β
β β β β
β β "I can help with your duplicate β β
β β charge. Let me investigate..." β β
β βββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
User sees seamless response - no interruption! β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Was es funktioniert macht
| Component | Role |
|---|---|
.sub_agent() | Registriert Spezialisten unter dem parent agent |
transfer_to_agent tool | Wird automatisch injiziert, wenn sub-agents existieren |
Agent descriptions | Helfen dem LLM zu entscheiden, welcher agent was bearbeitet |
Runner | Erkennt transfer events und ruft den target agent auf |
Shared session | Status und Verlauf bleiben ΓΌber Transfers erhalten |
Vor und nach dem HinzufΓΌgen von sub-agents
Ohne sub-agents β Ein agent erledigt alles:
User βββΆ coordinator βββΆ Response (handles billing AND support)
Mit sub-agents β Spezialisten kΓΌmmern sich um ihren Bereich:
User βββΆ coordinator βββΆ billing_agent βββΆ Response (billing expert)
βββΆ support_agent βββΆ Response (tech expert)
Hierarchische Multi-Agenten-Systeme
FΓΌr komplexe Szenarien kΓΆnnen Sie mehrstufige Hierarchien erstellen. Jeder Agent kann seine eigenen Sub-Agenten haben, die einen Baum bilden:
Visualisierung: 3-Stufiges Content-Team
βββββββββββββββββββββββ
β PROJECT MANAGER β β Level 1: Top-level coordinator
β "Manage projects" β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββ
β CONTENT CREATOR β β Level 2: Mid-level coordinator
β "Coordinate R&W" β
ββββββββββββ¬βββββββββββ
β
ββββββββββββββββββ΄βββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β RESEARCHER β β WRITER β β Level 3: Specialists
β β β β
β π Gather facts β β βοΈ Write content β
β π Analyze data β β π Polish text β
β π Find sources β β π¨ Style & tone β
ββββββββββββββββββββ ββββββββββββββββββββ
Wie Anfragen weitergeleitet werden
User: "Create a blog post about electric vehicles"
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROJECT MANAGER: "This is a content task" β
β β transfers to content_creator β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CONTENT CREATOR: "Need research first, then writing" β
β β transfers to researcher β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RESEARCHER: "Here's what I found about EVs..." β
β β provides research summary β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
VollstΓ€ndiges Beispiel Code
use adk_rust::prelude::*;
use adk_rust::Launcher;
use std::sync::Arc;
#[tokio::main]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().ok();
let api_key = std::env::var("GOOGLE_API_KEY")?;
let model = Arc::new(GeminiModel::new(&api_key, "gemini-2.5-flash")?);
// Level 3: Leaf specialists
let researcher = LlmAgentBuilder::new("researcher")
.description("Researches topics and gathers comprehensive information")
.instruction("You are a research specialist. When asked to research a topic:\n\
- Gather key facts and data\n\
- Identify main themes and subtopics\n\
- Note important sources or references\n\
Provide thorough, well-organized research summaries.")
.model(model.clone())
.build()?;
let writer = LlmAgentBuilder::new("writer")
.description("Writes polished content based on research")
.instruction("You are a content writer. When asked to write:\n\
- Create engaging, clear content\n\
- Use appropriate tone for the audience\n\
- Structure content logically\n\
- Polish for grammar and style\n\
Produce professional, publication-ready content.")
.model(model.clone())
.build()?;
// Level 2: Content coordinator
let content_creator = LlmAgentBuilder::new("content_creator")
.description("Coordinates content creation by delegating research and writing")
.instruction("You are a content creation lead. For content requests:\n\n\
- If RESEARCH is needed: Transfer to researcher\n\
- If WRITING is needed: Transfer to writer\n\
- For PLANNING or overview: Handle yourself\n\n\
Coordinate between research and writing phases.")
.model(model.clone())
.sub_agent(Arc::new(researcher))
.sub_agent(Arc::new(writer))
.build()?;
// Level 1: Top-level manager
let project_manager = LlmAgentBuilder::new("project_manager")
.description("Manages projects and coordinates with content team")
.instruction("You are a project manager. For incoming requests:\n\n\
- For CONTENT creation tasks: Transfer to content_creator\n\
- For PROJECT STATUS or general questions: Handle yourself\n\n\
Keep track of overall project goals and deadlines.")
.model(model.clone())
.sub_agent(Arc::new(content_creator))
.build()?;
println!("π Hierarchical Multi-Agent System");
println!();
println!(" project_manager");
println!(" βββ content_creator");
println!(" βββ researcher");
println!(" βββ writer");
println!();
Launcher::new(Arc::new(project_manager)).run().await?;
Ok(())
}
Agenten-Hierarchie:
project_manager
βββ content_creator
βββ researcher
βββ writer
Beispiel-Prompts:
- "Create a blog post about AI in healthcare" β PM β Content Creator β Writer
- "Research electric vehicles" β PM β Content Creator β Researcher
Sub-Agent-Konfiguration
FΓΌgen Sie Sub-Agents zu jedem LlmAgent mit der Builder-Methode sub_agent() hinzu:
let parent = LlmAgentBuilder::new("parent")
.description("Coordinates specialized tasks")
.instruction("Route requests to appropriate specialists.")
.model(model.clone())
.sub_agent(Arc::new(specialist_a))
.sub_agent(Arc::new(specialist_b))
.build()?;
Wichtige Punkte:
- Jeder Agent kann mehrere Sub-Agents haben
- Sub-Agents kΓΆnnen eigene Sub-Agents haben (mehrstufige Hierarchien)
- Agent-Namen mΓΌssen innerhalb der Hierarchie eindeutig sein
- Beschreibungen helfen dem LLM zu entscheiden, an welchen Agenten ΓΌbergeben werden soll
Effektive Γbergabeanweisungen schreiben
FΓΌr erfolgreiche AgentenΓΌbergaben geben Sie klare Anweisungen und Beschreibungen an:
Anweisungen des ΓΌbergeordneten Agenten
let coordinator = LlmAgentBuilder::new("coordinator")
.description("Main customer service coordinator")
.instruction("You are a customer service coordinator. Analyze each request:\n\n\
- For BILLING questions (payments, invoices, subscriptions):\n\
Transfer to billing_agent\n\n\
- For TECHNICAL questions (errors, bugs, troubleshooting):\n\
Transfer to support_agent\n\n\
- For GENERAL greetings or unclear requests:\n\
Respond yourself and ask clarifying questions")
.model(model.clone())
.sub_agent(Arc::new(billing_agent))
.sub_agent(Arc::new(support_agent))
.build()?;
Sub-Agent-Beschreibungen
let billing_agent = LlmAgentBuilder::new("billing_agent")
.description("Handles billing questions: payments, invoices, subscriptions, refunds")
.instruction("You are a billing specialist. Help with payment and subscription issues.")
.model(model.clone())
.build()?;
let support_agent = LlmAgentBuilder::new("support_agent")
.description("Handles technical support: bugs, errors, troubleshooting, how-to questions")
.instruction("You are a technical support specialist. Provide step-by-step guidance.")
.model(model.clone())
.build()?;
BewΓ€hrte Vorgehensweisen:
- Verwenden Sie deskriptive Agent-Namen, die ihren Zweck klar angeben
- Schreiben Sie detaillierte Beschreibungen β das LLM verwendet diese, um Γbergaben zu entscheiden
- FΓΌgen Sie spezifische SchlΓΌsselwΓΆrter in Beschreibungen ein, die wahrscheinlich Benutzeranfragen entsprechen
- Geben Sie klare Delegationsregeln in den Anweisungen des ΓΌbergeordneten Agenten an
- Verwenden Sie konsistente Terminologie ΓΌber alle Agent-Beschreibungen hinweg
Testen Ihres Multi-Agenten-Systems
Beispiele ausfΓΌhren
# Run the customer service example
cargo run --bin customer_service
# Run the hierarchical example
cargo run --bin hierarchical
Beispiel-Test-Prompts
Kundenservice:
- βIch habe eine Frage zu meiner letzten Rechnungβ β Sollte an
billing_agentweiterleiten - βDie App stΓΌrzt stΓ€ndig abβ β Sollte an
support_agentweiterleiten - βWie upgrade ich meinen Plan?β β Sollte an
billing_agentweiterleiten - βHallo, ich brauche Hilfeβ β Sollte zur KlΓ€rung beim
coordinatorbleiben
Hierarchisch:
- βErstelle einen Blogbeitrag ΓΌber KI im Gesundheitswesenβ β PM β Content Creator β Writer
- βRecherchiere die Geschichte von Elektrofahrzeugenβ β PM β Content Creator β Researcher
- βWie ist der Status unserer aktuellen Projekte?β β Sollte beim
project_managerbleiben
Fehlerbehebung bei Γbergabeproblemen
Wenn Γbergaben nicht wie erwartet funktionieren:
- Agent-Namen ΓΌberprΓΌfen β MΓΌssen in Γbergabeaufrufen exakt ΓΌbereinstimmen
- Beschreibungen ΓΌberprΓΌfen β Machen Sie sie spezifischer und reich an SchlΓΌsselwΓΆrtern
- Anweisungen klΓ€ren β Seien Sie explizit, wann ΓΌbergeben werden soll
- GrenzfΓ€lle testen β Versuchen Sie mehrdeutige Anfragen, um das Routing-Verhalten zu sehen
- Achten Sie auf Γbergabeindikatoren β
[Agent: name]zeigt an, welcher Agent antwortet
Globale Anweisung
Grundlegende Verwendung
let agent = LlmAgentBuilder::new("assistant")
.description("A helpful assistant")
.global_instruction(
"You are a professional assistant for Acme Corp. \
Always maintain a friendly but professional tone. \
Our company values are: customer-first, innovation, and integrity."
)
.instruction("Help users with their questions and tasks.")
.model(model.clone())
.build()?;
Globale vs. Agenten-Anweisung
- Global Instruction: Wird auf alle Agents in der Hierarchie angewendet, legt die GesamtpersΓΆnlichkeit/den Kontext fest
- Agent Instruction: Spezifisch fΓΌr jeden Agent, definiert dessen spezielle Rolle und Verhalten
Beide Anweisungen werden in den Konversationsverlauf aufgenommen, wobei die globale Anweisung zuerst erscheint.
Dynamische globale Anweisungen
FΓΌr fortgeschrittenere Szenarien kΓΆnnen Sie einen global instruction provider verwenden, der die Anweisung dynamisch berechnet:
use adk_core::GlobalInstructionProvider;
let provider: GlobalInstructionProvider = Arc::new(|ctx| {
Box::pin(async move {
// Access context information
let user_id = ctx.user_id();
// Compute dynamic instruction
let instruction = format!(
"You are assisting user {}. Tailor your responses to their preferences.",
user_id
);
Ok(instruction)
})
});
let agent = LlmAgentBuilder::new("assistant")
.description("A personalized assistant")
.global_instruction_provider(provider)
.model(model.clone())
.build()?;
Injektion von Zustandsvariablen
Sowohl globale als auch Agenten-Anweisungen unterstΓΌtzen die Injektion von Zustandsvariablen unter Verwendung der Syntax {variable}:
// Set state in a previous agent or tool
// state["company_name"] = "Acme Corp"
// state["user_role"] = "manager"
let agent = LlmAgentBuilder::new("assistant")
.global_instruction(
"You are an assistant for {company_name}. \
The user is a {user_role}."
)
.instruction("Help with {user_role}-level tasks.")
.model(model.clone())
.build()?;
Das Framework injiziert automatisch Werte aus dem Session-Zustand in die Anweisungsvorlagen.
GΓ€ngige Multi-Agenten-Muster
Koordinator-/Dispatcher-Muster
Ein zentraler Agent leitet Anfragen an spezialisierte Sub-Agents weiter:
let billing = LlmAgentBuilder::new("billing")
.description("Handles billing and payment questions")
.model(model.clone())
.build()?;
let support = LlmAgentBuilder::new("support")
.description("Provides technical support")
.model(model.clone())
.build()?;
let coordinator = LlmAgentBuilder::new("coordinator")
.instruction("Route requests to billing or support agents as appropriate.")
.sub_agent(Arc::new(billing))
.sub_agent(Arc::new(support))
.model(model.clone())
.build()?;
Beispiel-Konversation:
User: I have a question about my last invoice
[Agent: coordinator]
Assistant: I'll connect you with our billing specialist.
π [Transfer requested to: billing]
[Agent: billing]
Assistant: Hello! I can help you with your invoice.
What specific question do you have?
User: Why was I charged twice?
[Agent: billing]
Assistant: Let me investigate that duplicate charge for you...
Wichtige Punkte:
- Der coordinator analysiert die Anfrage und leitet sie an den billing agent weiter.
- Der billing agent antwortet sofort in derselben Runde.
- Nachfolgende Nachrichten werden mit dem billing agent fortgesetzt.
- Transferindikatoren (
π) zeigen an, wann Γbergaben stattfinden.
Hierarchische Aufgabenzerlegung
Mehrstufige Hierarchien zur AufschlΓΌsselung komplexer Aufgaben:
// Low-level specialists
let researcher = LlmAgentBuilder::new("researcher")
.description("Researches topics and gathers information")
.model(model.clone())
.build()?;
let writer = LlmAgentBuilder::new("writer")
.description("Writes content based on research")
.model(model.clone())
.build()?;
// Mid-level coordinator
let content_creator = LlmAgentBuilder::new("content_creator")
.description("Creates content by coordinating research and writing")
.sub_agent(Arc::new(researcher))
.sub_agent(Arc::new(writer))
.model(model.clone())
.build()?;
// Top-level manager
let project_manager = LlmAgentBuilder::new("project_manager")
.description("Manages content creation projects")
.sub_agent(Arc::new(content_creator))
.model(model.clone())
.build()?;
Kombination mit Workflow-Agents
Multi-Agenten-Systeme funktionieren gut mit Workflow-Agents (Sequential, Parallel, Loop):
use adk_agent::workflow::{SequentialAgent, ParallelAgent};
// Create specialized agents
let validator = LlmAgentBuilder::new("validator")
.instruction("Validate the input data.")
.output_key("validation_result")
.model(model.clone())
.build()?;
let processor = LlmAgentBuilder::new("processor")
.instruction("Process data if {validation_result} is valid.")
.output_key("processed_data")
.model(model.clone())
.build()?;
// Combine in a sequential workflow
let pipeline = SequentialAgent::new(
"validation_pipeline",
vec![Arc::new(validator), Arc::new(processor)]
);
// Use the pipeline as a sub-agent
let coordinator = LlmAgentBuilder::new("coordinator")
.description("Coordinates data processing")
.sub_agent(Arc::new(pipeline))
.model(model.clone())
.build()?;
Kommunikation zwischen Agents
Agents in einer Hierarchie kommunizieren ΓΌber einen gemeinsamen session state:
// Agent A saves data to state
let agent_a = LlmAgentBuilder::new("agent_a")
.instruction("Analyze the topic and save key points.")
.output_key("key_points") // Automatically saves output to state
.model(model.clone())
.build()?;
// Agent B reads data from state
let agent_b = LlmAgentBuilder::new("agent_b")
.instruction("Expand on the key points: {key_points}")
.model(model.clone())
.build()?;
Die output_key-Konfiguration speichert die endgΓΌltige Antwort eines Agenten automatisch im session state und macht sie so fΓΌr nachfolgende Agents verfΓΌgbar.
AusfΓΌhren von Multi-Agenten-Systemen
Verwendung des Launchers
Der Launcher bietet eine einfache MΓΆglichkeit, Multi-Agenten-Systeme auszufΓΌhren und zu testen:
use adk_rust::Launcher;
let coordinator = /* your multi-agent setup */;
Launcher::new(Arc::new(coordinator))
.run()
.await?;
AusfΓΌhrungsmodi:
# Interactive console mode
cargo run --example multi_agent -- chat
# Web server mode with UI
cargo run --example multi_agent -- serve
cargo run --example multi_agent -- serve --port 3000
Funktionen:
- Agentenanzeigen: Zeigt an, welcher Agent antwortet
[Agent: coordinator] - Transfer-Visualisierung: Zeigt Transfer-Ereignisse an
π [Transfer requested to: billing_agent] - Nahtlose Γbergaben: Der Ziel-Agent antwortet sofort nach dem Transfer
- Konversationsverlauf: BehΓ€lt den Kontext ΓΌber Agenten-Transfers hinweg bei
Testen von Transfers
Um zu ΓΌberprΓΌfen, ob Ihr Multi-Agenten-System korrekt funktioniert:
- ΓberprΓΌfen Sie, ob Agentennamen in Klammern erscheinen, wenn sie antworten
- Suchen Sie nach Transferindikatoren (
π), wenn Agenten ΓΌbergeben - ΓberprΓΌfen Sie sofortige Antworten von Ziel-Agenten ohne erneute Aufforderung
- Testen Sie verschiedene Anfragetypen, um eine korrekte Weiterleitung sicherzustellen
- ΓberprΓΌfen Sie RandfΓ€lle, wie das Γbertragen an nicht existierende Agenten
Fehlerbehebung bei Transferproblemen
Wenn Transfers nicht funktionieren:
- Stellen Sie sicher, dass Sub-Agents hinzugefΓΌgt wurden ΓΌber
.sub_agent() - ΓberprΓΌfen Sie Agentenbeschreibungen β der LLM nutzt diese, um Transfers zu entscheiden
- ΓberprΓΌfen Sie Anweisungen β der Parent sollte erwΓ€hnen, wann ein Transfer erfolgen soll
- ΓberprΓΌfen Sie Agentennamen β diese mΓΌssen in Transferaufrufen exakt ΓΌbereinstimmen
- Aktivieren Sie Logging, um Transferaktionen im Event-Stream zu sehen
BewΓ€hrte Praktiken
- Klare Beschreibungen: Schreiben Sie beschreibende Agentennamen und Beschreibungen, um dem LLM zu helfen, gute Transferentscheidungen zu treffen
- Spezifische Anweisungen: Geben Sie jedem Agenten klare, fokussierte Anweisungen fΓΌr seine Rolle
- Globale Anweisung verwenden: Legen Sie eine konsistente PersΓΆnlichkeit und Kontext fΓΌr alle Agenten fest
- Zustandsverwaltung: Verwenden Sie
output_keyund Zustandsvariablen fΓΌr die Agentenkommunikation - Hierarchietiefe begrenzen: Halten Sie Hierarchien flach (2-3 Ebenen) fΓΌr bessere Wartbarkeit
- Transferlogik testen: ΓberprΓΌfen Sie, ob Agenten fΓΌr verschiedene Anfragen an die richtigen Sub-Agents ΓΌbertragen
Verwandt
- LLM Agent - Kern-Agentenkonfiguration
- Workflow Agents - Sequential, Parallel und Loop Agenten
- Sessions - Verwaltung des Session-Zustands
Vorheriges: β Workflow Agents | NΓ€chstes: Graph Agents β