0Pricing
AI Agents · Lezione

Modelli del mondo e pianificazione predittiva

Agenti che simulano gli stati futuri prima di agire: simulazione mentale per l’IA.

Modelli del mondo e pianificazione predittiva è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.

Che cos'è un modello del mondo?

Un modello del mondo è la rappresentazione interna che l'agente ha dell'ambiente: quali oggetti esistono, in quale stato si trovano, quali regole ne governano i cambiamenti e cosa l'agente può fare per influire su di essi. È la simulazione mentale del mondo da parte dell'agente.

Senza un modello del mondo, l'agente può solo reagire alle osservazioni. Con un modello, può prevedere e pianificare.

Rappresentazione dello stato del mondo

Uno stato del mondo è un'istantanea di tutti i fatti rilevanti sull'ambiente in un determinato momento. Per un agente IoT, potrebbe comprendere le letture correnti dei sensori e gli stati dei dispositivi. Per un agente software, potrebbe essere lo stato dei file, delle API e dei database che gestisce.

from dataclasses import dataclass, field
from datetime import datetime
from typing import Any

@dataclass
class WorldState:
    timestamp: str = ''
    entities: dict = field(default_factory=dict)  # entity_id -> attributes
    relationships: list = field(default_factory=list)
    agent_position: str = 'idle'
    pending_actions: list = field(default_factory=list)

    def __post_init__(self):
        if not self.timestamp:
            self.timestamp = datetime.utcnow().isoformat()

    def update_entity(self, entity_id: str, attributes: dict):
        current = self.entities.get(entity_id, {})
        self.entities[entity_id] = {**current, **attributes}

    def snapshot(self) -> dict:
        return {
            'timestamp': self.timestamp,
            'entities': dict(self.entities),
            'agent_position': self.agent_position
        }

# Example:
world = WorldState()
world.update_entity('server_room', {'temp_c': 22.5, 'humidity': 55})
world.update_entity('hvac_unit_1', {'status': 'off', 'setpoint': 22})
print(world.snapshot())

Modello di transizione

Un modello di transizione definisce come cambia lo stato del mondo in risposta a un'azione: next_state = transition(current_state, action). Permette all'agente di prevedere quale sarà l'aspetto del mondo dopo aver eseguito un'azione, senza eseguirla realmente.

import copy

def transition(state: WorldState, action: dict) -> WorldState:
    """
    Predict next state given current state and action.
    Returns a new WorldState (does not modify original).
    """
    next_state = copy.deepcopy(state)

    action_type = action.get('type')
    target = action.get('target')
    params = action.get('params', {})

    if action_type == 'TURN_ON_HVAC':
        next_state.update_entity(target, {
            'status': 'on',
            'setpoint': params.get('setpoint', 22)
        })
        # Simulate temperature effect (simplified linear model)
        room = action.get('room', 'server_room')
        current_temp = next_state.entities.get(room, {}).get('temp_c', 25)
        next_state.update_entity(room, {
            'temp_c': max(current_temp - 2, params.get('setpoint', 22))
        })

    elif action_type == 'SEND_ALERT':
        next_state.pending_actions.append({'alert_sent': True})

    return next_state

# Predict effect of turning on HVAC:
action = {'type': 'TURN_ON_HVAC', 'target': 'hvac_unit_1',
          'room': 'server_room', 'params': {'setpoint': 20}}
next_world = transition(world, action)
print('After action:', next_world.entities.get('server_room'))

Pianificazione lookahead

La pianificazione lookahead simula N passaggi nel futuro prima di impegnarsi in un'azione. L'agente esplora diverse sequenze di azioni, valuta ogni stato risultante e sceglie la sequenza che conduce al miglior risultato previsto.

def evaluate_state(state: WorldState) -> float:
    """
    Compute a scalar utility score for a world state.
    Higher = better for the agent's goals.
    """
    score = 1.0
    server_room = state.entities.get('server_room', {})
    temp = server_room.get('temp_c', 25)
    # Penalty for high temperature
    if temp > 30:
        score -= (temp - 30) * 0.2
    # Penalty for very low temperature (over-cooling)
    if temp < 18:
        score -= (18 - temp) * 0.1
    return max(0.0, score)

def lookahead(state: WorldState, possible_actions: list, depth: int = 3) -> dict:
    """Evaluate top-level actions by simulating depth steps ahead."""
    best_action = None
    best_score = -float('inf')

    for action in possible_actions:
        simulated = transition(state, action)
        # Simulate depth more steps (simplified: no branching)
        for _ in range(depth - 1):
            simulated = transition(simulated, {'type': 'NOOP'})
        score = evaluate_state(simulated)
        if score > best_score:
            best_score = score
            best_action = action

    return {'best_action': best_action, 'expected_score': round(best_score, 3)}

LLM come modello del mondo

Per gli ambienti complessi e difficili da formalizzare, lo stesso LLM può fungere da modello del mondo. Gli si può chiedere di prevedere cosa accadrebbe se l'agente eseguisse una determinata azione. Questo comporta un compromesso tra precisione e generalità: l'LLM può ragionare su domini arbitrari.

import anthropic
import json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def llm_predict(
    current_state: dict,
    proposed_action: dict,
    domain_description: str = ''
) -> dict:
    prompt = (
        f'Domain: {domain_description}\n\n'
        f'Current state: {json.dumps(current_state, indent=2)}\n\n'
        f'Proposed action: {json.dumps(proposed_action, indent=2)}\n\n'
        'Predict the next world state after this action. '
        'Consider direct effects and second-order effects.\n'
        'Return JSON: {"predicted_state": dict, '
        '"confidence": float, "side_effects": [str]}'
    )
    response = client.messages.create(
        model='claude-opus-4-5', max_tokens=512,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(response.content[0].text)

Pianificazione model-based e model-free

Model-based: l'agente dispone di un modello del mondo esplicito, simula gli stati futuri e pianifica. Richiede meno esempi e generalizza meglio. Model-free: l'agente apprende le coppie azione-valore dall'esperienza senza utilizzare un modello. È più semplice, ma richiede più interazioni per apprendere una policy.

# Comparison table
COMPARISON = {
    'model_based': {
        'pros': [
            'Can plan before acting (lookahead)',
            'Works well with limited data',
            'Interpretable — you can inspect the world model',
            'Can simulate counterfactuals'
        ],
        'cons': [
            'Model can be wrong (model mismatch)',
            'Complex to build for arbitrary domains',
            'Planning is computationally expensive'
        ],
        'examples': 'AlphaGo, MCTS, agent with explicit WorldState'
    },
    'model_free': {
        'pros': [
            'No need to model the world explicitly',
            'Learns from raw experience',
            'Simpler architecture'
        ],
        'cons': [
            'Requires many interactions to learn',
            'Poor generalisation to new scenarios',
            'Cannot reason about unseen situations'
        ],
        'examples': 'Q-learning, policy gradient, basic RLHF'
    }
}

for approach, info in COMPARISON.items():
    print(f'{approach}: {info["examples"]}')

Incertezza nei modelli del mondo

I modelli del mondo sono approssimazioni. Gestisca l'incertezza mantenendo una distribuzione di probabilità sui possibili stati, anziché una singola stima puntuale. Quando l'incertezza è elevata, esegua azioni conservative o raccolga ulteriori informazioni prima di agire.

from statistics import mean, stdev

@dataclass
class UncertainState:
    entity_id: str
    attribute: str
    samples: list  # multiple estimates

    def mean(self) -> float:
        return mean(self.samples) if self.samples else 0.0

    def uncertainty(self) -> float:
        if len(self.samples) < 2:
            return float('inf')
        return stdev(self.samples)

    def should_gather_more_data(self, threshold: float = 2.0) -> bool:
        return self.uncertainty() > threshold

# Example: uncertain temperature estimate from multiple sensors
temp_state = UncertainState(
    entity_id='server_room',
    attribute='temp_c',
    samples=[22.1, 22.8, 21.9, 34.5, 22.3]  # one outlier
)
print(f'Mean temp: {temp_state.mean():.1f}C')
print(f'Uncertainty (stdev): {temp_state.uncertainty():.2f}')
print(f'Gather more data: {temp_state.should_gather_more_data()}')

Aggiornamento del modello del mondo

Dopo ogni azione, l'agente osserva il risultato effettivo e aggiorna il proprio modello del mondo. Se la previsione era errata, il modello viene aggiornato per diventare più preciso. Questo è il ciclo osserva-aggiorna-pianifica alla base dell'apprendimento degli agenti model-based.

class WorldModelAgent:
    def __init__(self):
        self.world = WorldState()
        self.prediction_errors = []

    def act(self, action: dict) -> dict:
        # 1. Predict next state
        predicted = transition(self.world, action)

        # 2. Take the action in the real world
        actual_observation = self._execute_action(action)

        # 3. Measure prediction error
        for entity_id, attrs in actual_observation.items():
            for attr, actual_val in attrs.items():
                predicted_val = predicted.entities.get(entity_id, {}).get(attr)
                if predicted_val is not None:
                    error = abs(actual_val - predicted_val)
                    self.prediction_errors.append(error)

        # 4. Update world model with actual observation
        for entity_id, attrs in actual_observation.items():
            self.world.update_entity(entity_id, attrs)

        return actual_observation

    def _execute_action(self, action: dict) -> dict:
        # Placeholder — in production this calls real APIs/sensors
        return {'server_room': {'temp_c': 23.0}}

    def model_accuracy(self) -> float:
        if not self.prediction_errors:
            return 1.0
        return max(0.0, 1.0 - mean(self.prediction_errors) / 10)

Pianificazione con l'LLM: simulare 3 passaggi

Per i domini in linguaggio naturale, chieda all'LLM di simulare 3 passaggi di un piano proposto prima di eseguirlo. L'LLM valuta il risultato previsto di ogni passaggio e segnala i potenziali problemi, impedendo all'agente di eseguire azioni dalle conseguenze previste negative.

import anthropic
import json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def simulate_plan_steps(goal: str, proposed_steps: list) -> dict:
    steps_str = json.dumps(proposed_steps, indent=2)
    prompt = (
        f'Goal: {goal}\n\n'
        f'Proposed plan steps:\n{steps_str}\n\n'
        'Simulate executing each step in order. For each step predict:\n'
        '- What changes in the world?\n'
        '- What could go wrong?\n'
        '- Is this step reversible?\n\n'
        'Return JSON: {"step_simulations": [{"step": int, '
        '"predicted_outcome": str, "risks": [str], "reversible": bool}], '
        '"plan_safe": bool, "recommendation": str}'
    )
    response = client.messages.create(
        model='claude-opus-4-5', max_tokens=1024,
        messages=[{'role': 'user', 'content': prompt}]
    )
    result = json.loads(response.content[0].text)
    if not result['plan_safe']:
        print(f'Plan safety concern: {result["recommendation"]}')
    return result

Quando fidarsi del modello del mondo

Un modello del mondo è valido solo quanto sono accurate la sua funzione di transizione e il suo stato iniziale. Negli ambienti che cambiano rapidamente, il modello diventa presto obsoleto. Implementi una soglia di obsolescenza: se il modello non è stato aggiornato da N secondi e un'azione comporta rischi elevati, osservi nuovamente l'ambiente prima di procedere.

from datetime import datetime, timedelta

class StaleAwareWorldModel:
    def __init__(self, max_age_seconds: int = 60):
        self.state = WorldState()
        self.max_age = timedelta(seconds=max_age_seconds)
        self.last_observation_time = datetime.utcnow()

    def is_stale(self) -> bool:
        age = datetime.utcnow() - self.last_observation_time
        return age > self.max_age

    def refresh(self, observation_fn):
        new_observations = observation_fn()
        for entity_id, attrs in new_observations.items():
            self.state.update_entity(entity_id, attrs)
        self.last_observation_time = datetime.utcnow()
        print(f'World model refreshed')

    def plan_action(self, action: dict, observation_fn) -> dict:
        if self.is_stale():
            print('World model stale — refreshing before planning')
            self.refresh(observation_fn)
        return lookahead(self.state, [action], depth=3)

Ragionamento controfattuale

Un modello del mondo consente il ragionamento controfattuale: «Cosa sarebbe successo se avessi eseguito l'azione A invece dell'azione B?» È uno strumento potente per imparare dagli errori senza ripeterli: l'agente può simulare lo scenario controfattuale per capire perché la sua scelta ha portato a un risultato non ottimale.

import anthropic
import json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def counterfactual_analysis(
    actual_state_before: dict,
    action_taken: dict,
    actual_outcome: dict,
    alternative_action: dict
) -> dict:
    prompt = (
        'Analyse a counterfactual scenario:\n\n'
        f'Initial state: {json.dumps(actual_state_before, indent=2)}\n'
        f'Action taken: {json.dumps(action_taken, indent=2)}\n'
        f'Actual outcome: {json.dumps(actual_outcome, indent=2)}\n\n'
        f'Alternative action considered: {json.dumps(alternative_action, indent=2)}\n\n'
        'What would likely have happened with the alternative action?\n'
        'Return JSON: {"counterfactual_outcome": str, '
        '"better_choice": str, "lesson": str}'
    )
    response = client.messages.create(
        model='claude-opus-4-5', max_tokens=512,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(response.content[0].text)

Verifica delle conoscenze

Qual è il principale vantaggio di un agente basato su un modello rispetto a un agente privo di modello?

Riepilogo: modelli del mondo e pianificazione predittiva

Ottimo lavoro! Concetti chiave:

  • Stato del mondo: istantanea di tutti gli attributi rilevanti delle entità in un determinato momento
  • Modello di transizione: next_state = transition(state, action) — prevede gli effetti
  • Lookahead: simula N passaggi nel futuro, valuta gli esiti e sceglie l'azione migliore
  • LLM come modello del mondo: funziona in domini difficili da formalizzare
  • Incertezza: mantenga distribuzioni, non stime puntuali; eviti di agire in condizioni di elevata incertezza
  • Obsolescenza: osservi nuovamente l'ambiente prima di azioni ad alto rischio se il modello è obsoleto

Prossimo argomento: le sfide dell'allineamento — perché è difficile costruire agenti autonomi realmente vantaggiosi.

Domande Frequenti

La lezione «Modelli del mondo e pianificazione predittiva» è gratuita?

Sì — il testo completo di «Modelli del mondo e pianificazione predittiva» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.

Cosa imparerò in «Modelli del mondo e pianificazione predittiva»?

Agenti che simulano gli stati futuri prima di agire: simulazione mentale per l’IA. Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Agents?

Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Modelli del mondo e pianificazione predittiva»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Agents?

Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Da assistente ad agente autonomo
  2. Modelli del mondo e pianificazione predittiva
  3. Sfide di allineamento negli agenti autonomi
  4. Frontiere della ricerca: AGI e oltre
← Torna a AI Agents