Agent Learning and Adaptation

This guide covers how to enable and use agent learning features to improve performance over time by learning from past experiences and recommending optimal approaches.

Table of Contents

  1. Overview

  2. Enabling Learning

  3. Recording Experiences

  4. Getting Recommendations

  5. Experience Analysis

  6. Adaptation Strategies

  7. Best Practices

Overview

Agent learning enables:

  • Experience Recording: Track task execution experiences

  • Approach Recommendation: Recommend optimal approaches based on history

  • Performance Improvement: Learn from successes and failures

  • Adaptation: Adapt strategies based on past experiences

  • Quality Insights: Understand what works best for different tasks

When to Use Learning

  • ✅ Repetitive tasks with varying approaches

  • ✅ Performance optimization needed

  • ✅ Quality improvement desired

  • ✅ Adaptive behavior required

  • ✅ Learning from failures important

Enabling Learning

Pattern 1: Basic Learning Setup

Enable learning with default configuration.

from aiecs.domain.agent import HybridAgent, AgentConfiguration
from aiecs.llm import OpenAIClient

agent = HybridAgent(
    agent_id="agent-1",
    name="My Agent",
    llm_client=OpenAIClient(),
    tools=["search", "calculator"],
    config=AgentConfiguration(),
    learning_enabled=True  # Enable learning
)

await agent.initialize()

Pattern 2: Learning with Experience Limit

Configure maximum number of experiences to store.

agent = HybridAgent(
    agent_id="agent-1",
    llm_client=llm_client,
    tools=["search"],
    config=config,
    learning_enabled=True,
    max_experiences=1000  # Store up to 1000 experiences
)

Recording Experiences

Pattern 1: Automatic Recording

Agent automatically records experiences when learning is enabled.

# Execute task - experience recorded automatically
result = await agent.execute_task(
    {"description": "Analyze data", "type": "data_analysis"},
    {}
)
# Experience recorded automatically with success/failure, execution time, etc.

Pattern 2: Manual Recording

Manually record experiences for custom tracking.

from aiecs.domain.agent.models import Experience

# Record experience manually
await agent.record_experience(
    task={
        "description": "Analyze sales data",
        "type": "data_analysis",
        "complexity": "medium"
    },
    result={
        "success": True,
        "execution_time": 2.5,
        "quality_score": 0.95
    },
    approach="parallel_tools",
    tools_used=["pandas", "numpy"]
)

Pattern 3: Record After Execution

Record experience after task execution.

# Execute task
result = await agent.execute_task(task, context)

# Record experience with result details
await agent.record_experience(
    task=task,
    result={
        "success": result.get("success", True),
        "execution_time": result.get("execution_time", 0),
        "quality_score": result.get("quality_score"),
        "iterations": result.get("iterations", 1)
    },
    approach="react_loop",
    tools_used=result.get("tools_used", [])
)

Pattern 4: Record Failed Experiences

Record failed experiences for learning.

try:
    result = await agent.execute_task(task, context)
    await agent.record_experience(
        task=task,
        result={"success": True, **result},
        approach="standard"
    )
except Exception as e:
    # Record failure
    await agent.record_experience(
        task=task,
        result={
            "success": False,
            "error_type": type(e).__name__,
            "error_message": str(e),
            "execution_time": 0
        },
        approach="standard"
    )

Getting Recommendations

Pattern 2: Compare Approaches

Compare multiple approaches based on history.

task = {"description": "Analyze data", "type": "data_analysis"}

# Get recommendations for different approaches
approaches = ["parallel_tools", "sequential", "hybrid"]

for approach in approaches:
    recommendation = await agent.get_recommended_approach(
        task,
        approach_filter=approach
    )
    if recommendation:
        print(f"{approach}: {recommendation['confidence']} confidence")

Pattern 3: Task-Specific Recommendations

Get recommendations for specific task types.

# Get recommendation for specific task type
recommendation = await agent.get_recommended_approach(
    task={"type": "data_analysis"}
)

# Use recommendation
if recommendation:
    result = await agent.execute_task(
        task,
        context={"recommended_approach": recommendation['approach']}
    )

Experience Analysis

Pattern 1: Get All Experiences

Retrieve all recorded experiences.

# Get all experiences
experiences = await agent.get_experiences()

print(f"Total experiences: {len(experiences)}")

# Analyze experiences
successful = [e for e in experiences if e.success]
failed = [e for e in experiences if not e.success]

print(f"Successful: {len(successful)}")
print(f"Failed: {len(failed)}")
print(f"Success rate: {len(successful) / len(experiences) * 100:.1f}%")

Pattern 2: Filter Experiences

Filter experiences by criteria.

# Get experiences for specific task type
data_analysis_experiences = [
    e for e in await agent.get_experiences()
    if e.task_type == "data_analysis"
]

# Get successful experiences
successful_experiences = [
    e for e in await agent.get_experiences()
    if e.success
]

# Get experiences with high quality
high_quality_experiences = [
    e for e in await agent.get_experiences()
    if e.quality_score and e.quality_score > 0.9
]

Pattern 3: Analyze Performance

Analyze performance by approach.

experiences = await agent.get_experiences()

# Group by approach
by_approach = {}
for exp in experiences:
    if exp.approach not in by_approach:
        by_approach[exp.approach] = []
    by_approach[exp.approach].append(exp)

# Analyze each approach
for approach, exps in by_approach.items():
    avg_time = sum(e.execution_time for e in exps) / len(exps)
    success_rate = sum(1 for e in exps if e.success) / len(exps)
    avg_quality = sum(e.quality_score for e in exps if e.quality_score) / len([e for e in exps if e.quality_score])
    
    print(f"{approach}:")
    print(f"  Avg time: {avg_time:.2f}s")
    print(f"  Success rate: {success_rate:.1%}")
    print(f"  Avg quality: {avg_quality:.2f}")

Adaptation Strategies

Pattern 1: Adaptive Approach Selection

Select approach based on recommendations.

# Get recommendation
recommendation = await agent.get_recommended_approach(task)

if recommendation and recommendation['confidence'] > 0.7:
    # Use recommended approach with high confidence
    result = await agent.execute_task_with_approach(
        task,
        approach=recommendation['approach']
    )
else:
    # Use default approach
    result = await agent.execute_task(task, context)

Pattern 2: Learning from Failures

Adapt based on failure patterns.

# Get failed experiences
failed_experiences = [
    e for e in await agent.get_experiences()
    if not e.success
]

# Analyze failure patterns
error_types = {}
for exp in failed_experiences:
    if exp.error_type:
        error_types[exp.error_type] = error_types.get(exp.error_type, 0) + 1

# Adapt based on common errors
if error_types.get("timeout", 0) > 5:
    # Increase timeout for similar tasks
    task["timeout"] = 60

Pattern 3: Performance-Based Adaptation

Adapt based on performance metrics.

# Get experiences for task type
experiences = [
    e for e in await agent.get_experiences()
    if e.task_type == task.get("type")
]

if experiences:
    # Find best performing approach
    best_approach = max(
        experiences,
        key=lambda e: e.quality_score if e.quality_score else 0
    )
    
    # Use best approach
    result = await agent.execute_task_with_approach(
        task,
        approach=best_approach.approach
    )

Best Practices

1. Enable Learning for Repetitive Tasks

Enable learning when tasks are repeated:

# Enable learning for repetitive tasks
if task_is_repetitive(task):
    agent = HybridAgent(
        learning_enabled=True,
        max_experiences=1000
    )

2. Record Comprehensive Experiences

Record comprehensive experience data:

await agent.record_experience(
    task=task,
    result={
        "success": True,
        "execution_time": duration,
        "quality_score": quality,
        "iterations": iterations,
        "context_size": context_size
    },
    approach=approach,
    tools_used=tools_used
)

3. Use Recommendations Wisely

Use recommendations with confidence thresholds:

recommendation = await agent.get_recommended_approach(task)

if recommendation and recommendation['confidence'] > 0.7:
    # High confidence - use recommendation
    use_approach(recommendation['approach'])
elif recommendation:
    # Low confidence - consider but verify
    consider_approach(recommendation['approach'])
else:
    # No recommendation - use default
    use_default_approach()

4. Analyze Experience Patterns

Regularly analyze experience patterns:

# Analyze experiences periodically
experiences = await agent.get_experiences()

# Find patterns
successful_approaches = [
    e.approach for e in experiences
    if e.success and e.quality_score and e.quality_score > 0.9
]

# Use most successful approaches
if successful_approaches:
    most_common = max(set(successful_approaches), key=successful_approaches.count)
    print(f"Most successful approach: {most_common}")

5. Learn from Failures

Focus on learning from failures:

# Record failures with detailed information
try:
    result = await agent.execute_task(task, context)
except Exception as e:
    await agent.record_experience(
        task=task,
        result={
            "success": False,
            "error_type": type(e).__name__,
            "error_message": str(e)
        },
        approach=approach
    )
    
    # Analyze failure for improvement
    analyze_failure(e, task, approach)

Summary

Agent learning provides:

  • ✅ Experience recording

  • ✅ Approach recommendations

  • ✅ Performance improvement

  • ✅ Adaptation strategies

  • ✅ Quality insights

Key Takeaways:

  • Enable for repetitive tasks

  • Record comprehensive experiences

  • Use recommendations wisely

  • Analyze patterns regularly

  • Learn from failures

For more details, see: