MoA Team#
Mixture of Agents (MoA) Team implements an ensemble approach where multiple proposer agents work on the same problem, and their outputs are synthesized by an aggregator agent.
Overview#
MoA Teams operate in two phases:
Proposal Phase: Multiple proposer agents process the input (optionally in parallel)
Aggregation Phase: An aggregator agent synthesizes all proposals into a final response
This approach provides:
Diverse perspectives on problems
More robust and comprehensive solutions
Multi-layer refinement through repeated aggregation
Reference papers:
Basic Usage#
Creating a MoA Team#
from pantheon.team import MoATeam
from pantheon.agent import Agent
# Create proposer agents with diverse perspectives
technical_expert = Agent(
name="technical_expert",
instructions="Provide technical analysis focusing on implementation details."
)
business_expert = Agent(
name="business_expert",
instructions="Analyze from a business perspective, considering ROI and strategy."
)
user_expert = Agent(
name="user_expert",
instructions="Focus on user experience and usability aspects."
)
# Create aggregator
aggregator = Agent(
name="aggregator",
instructions="Synthesize expert opinions into a comprehensive response."
)
# Create MoA team
team = MoATeam(
proposers=[technical_expert, business_expert, user_expert],
aggregator=aggregator
)
# Run the team
result = await team.run("Should we migrate our system to microservices?")
print(result.content)
Constructor Parameters#
Parameter |
Type |
Description |
|---|---|---|
|
list[Agent] |
List of agents that generate proposals. Each processes the input independently. |
|
Agent |
Agent that synthesizes all proposals into the final response. |
|
int |
Number of MoA layers (repeated aggregation rounds). Default: 1. |
|
bool |
If True, run proposers concurrently. If False, run sequentially. Default: True. |
How It Works#
Single Layer (Default)#
User Message
|
v
+----+----+----+
| | | | (parallel or sequential)
v v v v
[P1] [P2] [P3] [P4] <- Proposers
| | | |
+----+----+----+
|
v
[Aggregator] <- Synthesizes all proposals
|
v
Final Response
Multi-Layer (layers > 1)#
With layers=2:
User Message
|
v
[Proposers] -> Layer 1 responses
|
v
[Proposers] -> Layer 2 (refine based on Layer 1)
|
v
[Aggregator] -> Final synthesis
|
v
Final Response
Aggregation Template#
MoATeam uses a built-in template to format proposer responses for aggregation:
Below are responses from different AI models to the same query.
Please carefully analyze these responses and generate a final answer that is:
- Most accurate and comprehensive
- Best aligned with the user's instructions
- Free from errors or inconsistencies
### Query:
{user_query}
### Responses:
{responses}
### Final Answer:
Run Method#
result = await team.run(
msg="Your query",
proposer_kwargs={}, # kwargs passed to all proposers
**aggregator_kwargs # kwargs passed to aggregator
)
Parameters:
msg: The input message (string or message list)proposer_kwargs: Dict of kwargs passed to each proposer’srun()**aggregator_kwargs: Additional kwargs passed to the aggregator’srun()
Example:
result = await team.run(
"Analyze the market trends",
proposer_kwargs={"max_iterations": 3},
stream=True # Only applied to aggregator
)
Parallel vs Sequential#
Parallel Execution (Default)#
team = MoATeam(
proposers=[expert1, expert2, expert3],
aggregator=synthesizer,
parallel=True # Default
)
# All proposers run concurrently
result = await team.run("Query")
Sequential Execution#
team = MoATeam(
proposers=[expert1, expert2, expert3],
aggregator=synthesizer,
parallel=False
)
# Proposers run one after another
result = await team.run("Query")
Multi-Layer MoA#
Use multiple layers for iterative refinement:
team = MoATeam(
proposers=[expert1, expert2, expert3],
aggregator=synthesizer,
layers=2 # Two rounds of proposal refinement
)
result = await team.run("Complex problem to solve")
With layers=2:
First layer: All proposers process original query
Second layer: All proposers process aggregated result from layer 1
Final aggregation: Aggregator synthesizes layer 2 responses
Examples#
Decision Making Team#
from pantheon.team import MoATeam
from pantheon.agent import Agent
# Different analytical perspectives
risk_analyst = Agent(
name="risk_analyst",
instructions="Analyze risks and potential negative outcomes."
)
opportunity_analyst = Agent(
name="opportunity_analyst",
instructions="Identify opportunities and benefits."
)
feasibility_analyst = Agent(
name="feasibility_analyst",
instructions="Assess technical and financial feasibility."
)
# Decision synthesizer
decision_maker = Agent(
name="decision_maker",
instructions="""Synthesize all analyses into a recommendation:
1. Summary of each perspective
2. Key consensus points
3. Major disagreements
4. Final recommendation"""
)
decision_team = MoATeam(
proposers=[risk_analyst, opportunity_analyst, feasibility_analyst],
aggregator=decision_maker
)
result = await decision_team.run("Should we expand to the European market?")
Self-MoA (Same Model, Different Prompts)#
Use the same model with different instructions:
# Same model, different perspectives
analyst1 = Agent(
name="conservative_analyst",
instructions="Take a conservative, risk-averse approach."
)
analyst2 = Agent(
name="optimistic_analyst",
instructions="Focus on growth opportunities and potential."
)
analyst3 = Agent(
name="balanced_analyst",
instructions="Provide a balanced, objective analysis."
)
aggregator = Agent(
name="synthesizer",
instructions="Combine perspectives into a balanced conclusion."
)
self_moa = MoATeam(
proposers=[analyst1, analyst2, analyst3],
aggregator=aggregator
)
Research Synthesis Team#
from pantheon.toolsets import WebToolSet
literature_reviewer = Agent(
name="literature_reviewer",
instructions="Review academic sources and cite findings."
)
await literature_reviewer.toolset(WebToolSet("web"))
data_analyst = Agent(
name="data_analyst",
instructions="Focus on quantitative data and statistics."
)
methodology_expert = Agent(
name="methodology_expert",
instructions="Evaluate research methods and validity."
)
synthesizer = Agent(
name="synthesizer",
instructions="""Create a comprehensive research summary:
- Integrate findings from all analyses
- Identify patterns and contradictions
- Provide evidence-based conclusions"""
)
research_team = MoATeam(
proposers=[literature_reviewer, data_analyst, methodology_expert],
aggregator=synthesizer,
layers=2 # Refine twice for better synthesis
)
Best Practices#
Diverse Proposers: Use agents with different perspectives and approaches
Clear Aggregation: Design aggregator instructions for effective synthesis
Appropriate Layers: Use 1 layer for simple tasks, 2+ for complex problems
Model Selection: Consider using a stronger model for the aggregator
Parallel Execution: Enable for better performance (default)
Team Size: 3-5 proposers typically work well