feat: aggiungi ReAct Agent Loop per trasformare chatbot in agente

- Nuovo ReActAgent con loop Pensa->Agisci->Osserva
- Usa intent detection esistente per affidabilità
- Supporta tutti i tool built-in
- Planning e memory integration point
- docs/AGENT_ROADMAP.md: gap analysis e roadmap
This commit is contained in:
opencode committed 2026-03-24 09:32:00 +01:00
1 parent e5ce70c68e
commit 1c7781a68f
2 files changed
+625

No files matched your search

+227
View File
@@ -0,0 +1,227 @@
# Da Chatbot ad Agente AI: Gap Analysis e Roadmap
## Stato Attuale del Progetto
L'attuale LangCode Agent è classificabile come **chatbot avanzato con tool calling**, non come agente AI autonomo.
---
## Chatbot vs Agente: Gap Analysis
| Caratteristica | Chatbot (Attuale) | Agente AI (Obiettivo) | Stato Attuale |
|----------------|-------------------|----------------------|---------------|
| **Input/Output** | Turn-by-turn | Goal-oriented | ⚠️ Parziale |
| **Planning** | Nessuno | Scomposizione in task | ❌ Assente |
| **Loop operativo** | Singola risposta | Pensa → Agisci → Osserva → Ripianifica | ❌ Assente |
| **Memoria** | Solo cronologia sessione | A lungo termine, persistente | ⚠️ Esiste ma non integrato |
| **Autonomia** | Dipende da input utente | Esegue autonomamente | ❌ Assente |
| **Tool use** | Arricchisci risposta | Agisci sull'ambiente | ⚠️ Parziale |
| **Goal tracking** | Nessuno | Tiene traccia obiettivi | ❌ Assente |
---
## Componenti Esistenti ma Non Integrati
### 1. Planning System (`enhancements/planning_enhancement.py`)
- **Esiste**: Task, priorità, dipendenze, progress tracking
- **Non usato**: Nessun tool nell'agente lo sfrutta
- **Stato**: Codice pronto, mai integrato in `OllamaToolAgent`
### 2. Simple Memory (`enhancements/simple_memory.py`)
- **Esiste**: Memorizzazione fatti, preferenze, cronologia
- **Non usato**: I tool `remember`, `recall` non sono nell'agente
- **Stato**: Implementato ma isolato
### 3. Enhanced Memory (`enhancements/memory_enhancement.py`)
- **Esiste**: Vector store con FAISS, semantic search
- **Non usato**: Dipende da `nomic-embed-text` non installato
- **Stato**: Parzialmente funzionante
---
## Cosa Manca per Diventare Agente
### 1. **Agent Loop (CORE)**
L'agente deve poter iterare:
```
WHILE goal NOT achieved:
1. THINK: Pianifica prossimo step
2. ACT: Esegui tool
3. OBSERVE: Leggi risultato
4. EVALUATE: Goal raggiunto? Ripianifica se necessario
```
### 2. **Goal Decomposition**
- LLM deve scomporre richieste complesse in task sequenziali
- Es: "Prepara un report delle vendite" → cerca file → analizza dati → scrivi report
### 3. **Self-Reflection**
- L'agente deve valutare se il risultato è soddisfacente
- Se un tool fallisce, provare approccio alternativo
### 4. **Persistent Memory Integration**
- Memoria deve essere доступна in ogni conversazione
- L'agente deve poter salvare e recuperare informazioni
### 5. **Multi-Step Execution Context**
- L'agente deve mantenere stato tra diverse chiamate tool
- Non ripetere azioni già completate
---
## Roadmap di Implementazione
### Fase 1: Agent Loop Base
**Obiettivo**: Abilitare esecuzione multi-step
```
enhancements/agent_loop.py
├── ThinkStep: LLM decide prossima azione
├── ActStep: Esegui tool
├── ObserveStep: Leggi risultato
├── EvaluateStep: Goal raggiunto?
└── ReplanStep: Ripianifica se fallito
```
**Modifiche a `ollama_agent.py`**:
- Aggiungere metodo `run()` con loop
- Aggiungere parametro `max_iterations`
- Integrare `enhanced_planner` per task tracking
### Fase 2: Memory Integration
**Obiettivo**: Rendere memoria parte dell'agente
- Integrare `simple_memory` in `OllamaToolAgent`
- Aggiungere tool: `remember`, `recall`
- Salvare conversazioni automaticamente
- Recuperare fatti rilevanti per contesto
### Fase 3: Goal-Oriented Interaction
**Obiettivo**: LLM pianifica autonomamente
- Aggiungere system prompt per goal decomposition
- LLM decide quali tool usare in sequenza
- Mantenere "memory of plans" per long-term goals
### Fase 4: Enhanced Observability
**Obiettivo**: Tracciare e mostrare progresso
- Logging delle azioni
- Report progresso task
- Feedback visivo all'utente
---
## Implementazione Proposta: Nuovo `ReActAgent`
```python
# enhancements/react_agent.py (nuovo)
class ReActAgent:
"""
Agente con Loop Pensa→Agisci→Osserva→Ripianifica
"""
def __init__(self, llm, tools, max_iterations=10):
self.llm = llm
self.tools = {t.name: t for t in tools}
self.max_iterations = max_iterations
self.planner = EnhancedPlanner() # Esistente
self.memory = SimplePersistentMemory() # Esistente
def run(self, goal: str) -> Dict:
"""
Esegue un goal attraverso il loop ReAct.
"""
context = f"Goal: {goal}\n\n"
for i in range(self.max_iterations):
# 1. THINK: LLM decide prossima azione
thought = self._think(context, goal)
# 2. ACT: Esegui tool se necessario
if thought.get("action"):
result = self._act(thought["action"], thought["args"])
context += f"\nAzione: {thought['action']}\nRisultato: {result}\n"
# Salva in memoria se rilevante
if thought["action"] in ["read_file", "execute"]:
self.memory.add_fact(f"Azione completata: {thought['action']}")
# 3. OBSERVE & EVALUATE
if self._goal_achieved(context, goal):
return {"success": True, "result": context}
return {"success": False, "result": context, "error": "Max iterations"}
def _think(self, context, goal) -> Dict:
"""LLM decide prossima azione basata su contesto"""
# Prompt ingegnerizzato per decision-making
...
def _act(self, action_name, args) -> str:
"""Esegue azione tramite tool"""
if action_name in self.tools:
return self.tools[action_name].invoke(args)
return f"Tool {action_name} non trovato"
def _goal_achieved(self, context, goal) -> bool:
"""Valuta se goal è stato raggiunto"""
...
```
---
## Dipendenze per Implementazione
### Già nel progetto:
- `planning_enhancement.py` ✅
- `simple_memory.py` ✅
- `langchain_core` ✅
### Da installare:
```bash
# Per enhanced memory (già parzialmente presente)
# Nominic-embed-text model deve essere scaricato in Ollama
ollama pull nomic-embed-text
```
---
## Comandi per Test Futuro
```bash
# Test futuro dell'agente
source venv/bin/activate
./venv/bin/python -c "
from enhancements.react_agent import ReActAgent
from ollama_agent import get_builtin_tools
from langchain_ollama import ChatOllama
llm = ChatOllama(model='qwen3.5:4b', base_url='http://192.168.0.50:11434')
agent = ReActAgent(llm, tools=get_builtin_tools())
# Goal complesso
result = agent.run('Leggi il file requirements.txt e creane uno backup')
print(result)
"
```
---
## Conclusione
**Il progetto attuale è un chatbot funzionante con tool calling avanzato.**
**Per diventare agente AI servono**:
1. Agent Loop (ReAct pattern) - **Da implementare**
2. Integrazione planning esistente - **Da completare**
3. Integrazione memory esistente - **Da completare**
4. Goal decomposition via LLM - **Da implementare**
Le fondamenta (planning, memory) esistono già nel progetto. Mancano l'integrazione e il loop operativo.
---
*Documento generato: 23 Marzo 2026*
*Autore: OpenAgent*