agentic-ai-engineering/site/modules/m6-economics.md

358 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Module 6: Economics & Evaluation
## Lesson 6.0: The Compute Advantage Equation
**Core insight**: Your value as an agentic engineer scales with the amount of compute you can harness effectively.
### The Equation
```
Compute Advantage = (Compute Scaling × Autonomy) ÷ (Time + Effort + Monetary Cost)
```
| Variable | What It Means | How to Improve It |
|----------|---------------|-------------------|
| **Compute Scaling** | How much AI compute you can throw at problems | More agents, better models, larger context windows |
| **Autonomy** | How much the agent does without your intervention | Better prompts, better tools, verification layers |
| **Time** | How long it takes to get results | Faster models, parallel execution, fewer iterations |
| **Effort** | How much you have to craft prompts/instructions | Reusable skills, templates, mental models |
| **Monetary Cost** | What you pay for API calls | Cascade routing, cheaper models for simple steps |
### What It Tells You
- **High Compute Advantage** = You get more output for less input. You're leveraging agents effectively.
- **Low Compute Advantage** = You're spending too much time/cost for too little gain. Fix the bottleneck variable.
### Real-World Application (Your Stack)
| Tool | Compute Scaling | Autonomy | Time | Effort | Cost | Advantage |
|------|:---:|:---:|:---:|:---:|:---:|:---:|
| Claude Code (lead) | 8 | 7 | 6 | 5 | 4 | (8×7)÷(6+5+4)=3.7 |
| Pi Agent (custom) | 7 | 8 | 7 | 6 | 6 | (7×8)÷(7+6+6)=2.9 |
| OpenCode (OSS) | 5 | 5 | 7 | 7 | 9 | (5×5)÷(7+7+9)=1.1 |
| Gemini Flash (fast) | 4 | 3 | 9 | 8 | 9 | (4×3)÷(9+8+9)=0.5 |
Higher score = more output per unit of investment. Use this to decide which tool for which task.
### How to Optimize
1. **Improve numerator**: Run more agents in parallel (P-threads), increase autonomy with verification
2. **Reduce denominator**: Use cascade routing (cheap model for simple steps), reuse skills/mental models
3. **Track over time**: Your Compute Advantage should increase as you build better harnesses and mental models
---
## Lesson 6.1: LLM Pricing Landscape 2026
### Per-Million-Token Pricing
| Model | Input ($/M) | Output ($/M) | Best For |
|-------|-------------|--------------|----------|
| Gemini 2.5 Flash | $0.15 | $0.60 | High-volume, simple tool calls |
| DeepSeek V3 | $0.27 | $1.10 | Structured tasks, batch processing |
| DeepSeek R1 | $0.55 | $2.19 | Reasoning-heavy single steps |
| Gemini 2.5 Pro | $1.25 | $5.00 | Long-context sessions (1M+ tokens) |
| GPT-4o | $2.50 | $10.00 | Balanced cost/quality |
| Claude Sonnet 4 | $3.00 | $15.00 | General agentic reasoning |
| GPT-5 | $10.00 | $40.00 | Frontier research, complex plans |
| Claude Opus 4 | $15.00 | $75.00 | Complex multi-step agent orchestration |
### Price Range: 100x Difference
Cheapest (Gemini Flash) to most expensive (Claude Opus) is a **100x multiplier**. Choosing the right model for each step is your highest-leverage cost optimization.
---
## Lesson 6.2: Cascade Routing
### The Pattern
Don't use one model for everything. Route different steps to different models:
```
Step 1: Retrieve context → Gemini Flash ($0.15/M input)
Step 2: Analyze → Claude Sonnet ($3/$15)
Step 3: Make decision → Claude Opus ($15/$75)
Step 4: Format output → Gemini Flash ($0.15/$0.60)
```
### Savings Profile
| Pattern | Cost/Task | Savings |
|---------|-----------|---------|
| All Opus | $2.50 | Baseline |
| Cascade (Flash → Sonnet → Opus → Flash) | $0.85 | 66% savings |
| All Sonnet | $0.50 | 80% savings (but quality loss on complex steps) |
### Implementation
```python
def route_task(task_complexity: str) -> str:
if task_complexity == "retrieval":
return "gemini-2.5-flash"
elif task_complexity == "analysis":
return "claude-sonnet-4"
elif task_complexity == "decision":
return "claude-opus-4"
elif task_complexity == "formatting":
return "gemini-2.5-flash"
```
---
## Lesson 6.3: Cost Per Session Math
### Where Costs Come From
| Component | Share | Notes |
|-----------|-------|-------|
| Output tokens | ~70% | Model generation is most expensive |
| Input tokens | ~20% | Context + tool results |
| Cached tokens | ~10% | Can be zero if not configured |
### The Multipliers
| Factor | Multiplier | Why |
|--------|-----------|-----|
| Retry rate | 1.2-2.0x | Failed tool calls retry |
| Tool overhead | 3-5x per tool call | Planning + execution + error recovery + result parsing |
| Context growth | 1.5x per 10 turns | Every turn adds tokens to context |
### The 3x Rule
**Production agent costs 3x your prototype estimate.**
1x = ideal path (everything works first time)
2x = retries + edge cases
3x = monitoring + error handling + observability overhead
### Quick Estimation
```python
def estimate_cost(turns: int, avg_tokens_per_turn: int, model_price_per_m: float):
"""Very rough estimate."""
base = turns * avg_tokens_per_turn * model_price_per_m / 1_000_000
retry = base * 1.5
overhead = base * 3.0
return {"base": base, "with_retries": retry, "production": overhead}
```
---
## Lesson 6.4: Agent Evaluation Metrics
### The Key Metrics
| Metric | What It Measures | Target |
|--------|-----------------|--------|
| **pass@k** | % of k attempts where at least one succeeds | >80% |
| **pass^k** | % where ALL k attempts succeed (consistency) | >60% |
| **Tool Call Accuracy** | Correct tool + correct params | >90% |
| **Task Completion Rate** | End-to-end success | >70% |
| **Cost Per Task** | Total API cost per unit | Varies |
| **Loop Efficiency** | Steps taken vs optimal | <2x overhead |
| **Grind Rate** | % of attempts that re-run identical code | <5% |
### pass@k Explained
```
pass@k = probability that at least one of k attempts succeeds
k=1: 60% pass rate (single attempt)
k=3: 1 - (0.4)^3 = 93.6% (best of 3)
k=5: 1 - (0.4)^5 = 98.9% (best of 5)
```
Higher k = higher reliability but higher cost. The trade-off is the core optimization problem.
---
## Lesson 6.5: Automated Evaluation
### Golden Dataset Approach
```python
eval_cases = [
{
"input": "Find the user with email john@example.com",
"expected_tool": "query_database",
"expected_params": {"query": "SELECT * FROM users WHERE email = 'john@example.com'"},
"expected_output_contains": ["john@example.com"],
"weight": 1.0
}
]
```
### VCR-Style Recording
For non-deterministic tool results (search, API calls), record the response once, then replay it deterministically:
```python
# Record mode: capture real responses
# Replay mode: use recorded responses
# Test: verify agent makes correct decisions with known data
```
---
## Lesson 6.6: A/B Testing Agents
### Canary Deployment
1. Route 5% of traffic to new agent config
2. Compare against 95% on current config
3. Metrics: success rate, cost, latency, loop depth
4. If new config wins on all metrics roll out to 100%
5. If new config loses rollback, investigate
### What to A/B Test
- System prompt wording
- Model selection
- Temperature settings
- Tool descriptions
- Iteration limits
---
## Lesson 6.7: Human Evaluation
### What Automated Evals Miss
1. **Quality of reasoning** agent made right decision for wrong reasons?
2. **Tone and style** output technically correct but poorly written?
3. **Edge cases** agent handled happy path but not real-world variation?
4. **Hallucination cascades** plausible-looking but wrong intermediate steps?
### Spot-Check Sampling
Review 5-10% of all agent sessions manually. Focus on:
- Sessions with high cost (>2x average)
- Sessions with tool loops
- Sessions where automated eval scored low
- Random sample for baseline
---
## Lesson 6.7b: Real-World Cost Scenarios
### Scenario A: Research Agent (High Token Burn)
```
Pattern: Agent reads 20 web pages, synthesizes report
Cost breakdown:
├── 20 web page reads @ 2K tokens each = 40K input tokens
├── 5 LLM reasoning turns @ 4K tokens = 20K tokens
├── 1 report generation @ 8K output tokens = 8K output tokens
├── Claude Sonnet: ~$0.08/run
├── Claude Haiku: ~$0.02/run (80% cheaper, 90% as good for extraction)
└── Cascade: Haiku for reads, Sonnet for synthesis → $0.03/run
```
**The cascade saves 62%** on this exact pattern. Use cheap models for bulk work, expensive models for synthesis.
### Scenario B: Code Generation (Iterative)
```
Pattern: Agent writes code, tests, fixes, repeats
Cost without optimization:
├── Average: 8 iterations × 6K tokens = 48K tokens
├── Cost: ~$0.35 per feature
├── With guardrails (limit to 3 iterations): $0.13 per feature
└── Savings: 63%
```
### Scenario C: Always-On Brand Monitor
```
Pattern: Scans 50 sources every 5 minutes, 24/7
Cost without optimization:
├── 288 runs/day × $0.08 = $23.04/day = $691/month
├── With cascade + dedup + scheduling: $4.15/day = $125/month
└── Savings: 82%
```
### The 80/20 Rule
90% of cost savings come from three changes:
1. **Model cascade** — use cheap models for routine work (saves 50-80%)
2. **Iteration limits** — cap loops at 3-5 turns (saves 40-60%)
3. **Deduplication** — don't re-read the same context (saves 20-30%)
Do these three first before any other optimization.
---
## Lesson 6.7c: Monitoring Agent Economics in Production
Once your agent is deployed, you need to track costs in real-time. Here's what to monitor and how.
### Dashboard Metrics
```
Cost Dashboard (example)
├── Cost per session (avg, p95, max)
├── Cost per tool call (avg by tool type)
├── Cost per model tier (Haiku vs Sonnet vs Opus)
├── Loop depth distribution (how many turns do sessions take?)
├── Cost by hour of day (when are agents most expensive?)
└── Monthly burn rate (projected vs actual)
```
### Setting Up Cost Tracking
The simplest approach: log every LLM call with its cost to a JSONL file.
```python
# cost-logger.py — append-only cost tracking
import json, time, os
LOG_FILE = "cost-log.jsonl"
def log_llm_call(model, prompt_tokens, output_tokens, cost_cents):
entry = {
"timestamp": time.time(),
"model": model,
"prompt_tokens": prompt_tokens,
"output_tokens": output_tokens,
"cost_cents": cost_cents,
"session_id": os.environ.get("SESSION_ID", "unknown"),
}
with open(LOG_FILE, "a") as f:
f.write(json.dumps(entry) + "\n")
```
### Cost Alerts
Set up automated alerts for cost anomalies:
| Alert | Threshold | Action |
|-------|-----------|--------|
| Session cost exceeded | >$2.00 | Kill session, notify operator |
| Daily budget warning | >80% of daily budget | Notify operator |
| Cost spike detection | >3x average for this agent | Investigate loop behavior |
| Model tier drift | >10% of calls using Opus | Check cascade routing config |
### The Cost-to-Value Ratio
Not all costs are bad. An expensive agent that ships features is more valuable than a cheap agent that does nothing. Track:
- **Cost per task completed** (not just cost per call)
- **Revenue generated per agent session** (if applicable)
- **Time saved vs human doing the same task**
- **Error rate** (cheap agents that make mistakes cost more in debugging time)
---
## Lab 6.8: Build an Eval Harness
**Objective**: Create golden Q&A pairs + automated pass/fail scoring.
**Starter**: `course/labs/L6-eval-harness/starter.py`
## Lab 6.9: Cost Optimization
**Objective**: Profile a session, identify savings, implement cascade routing.
**Starter**: `course/labs/L6-cost-optimization/starter.py`