Un sistema multi-agente intelligente per la pianificazione di viaggi a Goa (India), che combina Retrieval Augmented Generation (RAG) con ricerca web in tempo reale per fornire raccomandazioni personalizzate su hotel, attrazioni turistiche e itinerari completi.
- Raj (Travel Planner): Pianificatore principale che crea itinerari dettagliati giorno-per-giorno con ottimizzazione geografica e breakdown di budget
- Marco (Hotel Expert): Specialista in hotel e alloggi con verifica in tempo reale della disponibilitΓ e stato operativo
- Priya (Discovery Guide): Esperta di attrazioni turistiche, spiagge, nightlife, cultura e gastronomia locale
- Dense Embeddings: Ricerca semantica tramite Sentence Transformers (all-MiniLM-L6-v2)
- Sparse Embeddings: Ricerca keyword-based tramite TF-IDF
- Reciprocal Rank Fusion (RRF): Fusione ottimale dei risultati dense + sparse
- Cross-Encoder Reranking: Riordino finale con modello ms-marco-MiniLM-L-6-v2 per massima rilevanza
- Memoria conversazionale persistente per ogni agente
- Contesto condiviso quando si cambia agente durante la conversazione
- Gestione intelligente di riferimenti impliciti e pronomi
- Integrazione con Tavily API per informazioni aggiornate (orari, prezzi, eventi correnti)
- Verifica automatica dello stato operativo degli hotel
- Combinazione trasparente di dati storici (RAG) e informazioni attuali (web)
- Web UI sviluppata con Streamlit
- Chat interattiva con selezione agente
- Quick actions per domande frequenti
- Visualizzazione ottimizzata di itinerari e raccomandazioni
Il progetto utilizza un'architettura gerarchica multi-agente:
USER INTERFACE (Streamlit)
β
RAJ (Orchestrator)
β β
MARCO PRIYA
(Hotels) (Attractions)
β β
RAG + Web RAG + Web
(Qdrant) (Qdrant)
- Raj puΓ² delegare compiti specifici a Marco e Priya per ottenere informazioni specializzate
- Ogni agente mantiene il proprio contesto conversazionale
- La comunicazione tra agenti avviene tramite il meccanismo di tool calling del framework
Il progetto Γ¨ costruito su datapizza-ai, un framework modulare per la creazione di agenti AI che supporta:
- Client LLM multipli: OpenAI (GPT-3.5-turbo, GPT-4-turbo)
- Tool Calling: Conversione automatica di funzioni Python in strumenti invocabili dall'LLM
- Memory Management: Gestione avanzata della cronologia conversazionale con modalitΓ stateful/stateless
- Multi-Agent Orchestration: Pattern di delegazione gerarchica tra agenti specializzati
Come viene utilizzato nel progetto:
- Ogni agente (Raj, Marco, Priya) Γ¨ un'istanza della classe
Agentcon client OpenAI dedicato - I tool (ricerca RAG, web search, verifica hotel) sono funzioni Python con decoratore
@tool - La memoria conversazionale Γ¨ gestita automaticamente dal framework con
stateless=False - Raj puΓ² invocare Marco e Priya come "sub-agenti" grazie al metodo
can_call()
Qdrant Γ¨ utilizzato come database vettoriale per memorizzare e ricercare hotel e attrazioni turistiche:
- Due collezioni:
goa_hotels(500+ strutture) egoa_places(migliaia di POI) - Dual-vector storage: Ogni documento ha sia dense vector (384-dim) che sparse vector (TF-IDF)
- Metadata filtering: Filtri su categoria, localitΓ , rating, stelle
- Hybrid search: Combinazione di ricerca semantica e keyword matching con RRF
- LLM: OpenAI GPT-3.5-turbo (Marco, Priya) e GPT-4-turbo (Raj)
- Embeddings: Sentence Transformers, TF-IDF (scikit-learn)
- Reranking: Cross-Encoder
- Web Search: Tavily API
- UI: Streamlit
- Data: Kaggle datasets (Hotels on Goibibo e Indian Places to Visit)
Dashboard principale con statistiche e quick start
Interfaccia chat con selezione agente e memoria conversazionale
Esempio di ricerca hotel dettagliata
- Python 3.10+
- Account OpenAI con API key
- Account Qdrant Cloud (gratuito) o istanza locale
- Account Tavily per web search (opzionale ma consigliato)
- Account Kaggle per download dataset
git clone https://github.com/nynuz/goa-travel-agent-ai.git
cd goa-travel-agent-aiIl progetto utilizza uv per la gestione delle dipendenze (piΓΉ veloce di pip):
# Installa dipendenze del progetto
uv syncCrea un file .env nella root del progetto:
# OpenAI API
OPENAI_API_KEY=sk-...
# Qdrant (Cloud o locale)
QDRANT_URL=https://your-cluster.qdrant.io
QDRANT_API_KEY=your-api-key
# Tavily (opzionale)
TAVILY_API_KEY=tvly-...
# Kaggle API Credentials
KAGGLE_USERNAME=your-kaggle-username
KAGGLE_KEY=KGAT_...Per Qdrant locale:
QDRANT_URL=http://localhost:6333
# QDRANT_API_KEY non necessaria per localhostIl primo avvio esegue automaticamente:
- Download dataset da Kaggle (hotels, places)
- Preprocessing e pulizia dati
- Fitting TF-IDF sul corpus completo
- Generazione embeddings dense e sparse
- Upload su Qdrant
# CLI interattiva
uv run python main.py
# Web UI
uv run python main.py --uiNota: Il setup iniziale puΓ² richiedere 5-10 minuti a seconda della connessione e hardware.
Se i dati sono giΓ stati processati e caricati su Qdrant, l'avvio Γ¨ immediato:
# Avvia direttamente la Web UI
uv run python main.py --ui
# Oppure usa Streamlit direttamente
uv run streamlit run goa_travel_agent/ui/app.pyPer una versione command-line senza UI:
uv run python main.pyPotrai selezionare l'agente con cui conversare e interagire via terminale.
goa_travel_agent/
βββ config/
β βββ settings.py # Configurazione centralizzata
βββ data/
β βββ raw/ # Dataset Kaggle originali
β βββ processed/ # CSV preprocessati
β βββ cache/ # TF-IDF model, embeddings
βββ src/
β βββ data_management/ # Download e preprocessing Kaggle
β βββ embeddings/ # Hybrid embedder (dense + sparse)
β βββ vector_db/ # Qdrant manager e hybrid searcher
β βββ tools/ # Tool per agenti (RAG, web, budget)
β βββ agents/ # Definizione agenti (Raj, Marco, Priya)
β βββ utils/ # Logger, helpers
βββ ui/
βββ app.py # Entry point Streamlit
βββ components/ # Componenti UI riutilizzabili
βββ views/ # Pagine (Home, Chat, Hotels, etc.)
βββ styles/ # CSS custom
- Seleziona Marco nella chat
- Chiedi: "Cerca hotel di lusso vicino alla spiaggia di Baga con piscina"
- Marco eseguirΓ :
- Ricerca RAG su Qdrant con filtri
- Verifica web (Tavily) per ogni hotel trovato
- Restituisce 3-5 hotel verificati con raccomandazioni
- Seleziona Priya nella chat
- Chiedi: "Migliori luoghi per tramonto romantico"
- Priya eseguirΓ :
- Ricerca RAG semantica su attrazioni
- Ricerca web per info aggiornate (orari, eventi)
- Combina risultati storici + attuali
- Seleziona Raj nella chat
- Chiedi: "Crea itinerario 5 giorni per coppia, budget medio, interesse in cultura e spiagge"
- Raj eseguirΓ :
- Delega a Marco per trovare hotel
- Delega a Priya per trovare attrazioni
- Ottimizza geograficamente l'itinerario
- Calcola budget breakdown dettagliato
- Genera piano giorno-per-giorno
- Inizia con Priya: "Dimmi di Margao Market"
- Cambia a Marco: "Cerca hotel vicino" β Marco riceve il contesto e cerca hotel vicini a Margao Market
- Torna a Priya: "Cosa mangiare lΓ¬?" β Priya ricorda che si parlava di Margao Market
Elimina la cache e riavvia per ricreare le collezioni:
rm -rf goa_travel_agent/data/cache/*
uv run python main.pyIl modello TF-IDF non Γ¨ stato salvato correttamente. Rimuovi la cache:
rm goa_travel_agent/data/cache/tfidf_model.pkl
uv run python main.pyVerifica che hai inserito correttamente le tue credenziali Kaggle nel file .env.
- Usa Qdrant Cloud invece di localhost per latency migliore
- Riduci
top_knei parametri di ricerca - Considera di usare solo dense search disabilitando sparse (meno accuracy, piΓΉ veloce)
Contributi benvenuti! Per favore:
- Fai fork del repository
- Crea un branch per la tua feature (
git checkout -b feature/amazing-feature) - Commit delle modifiche (
git commit -m 'Add amazing feature') - Push al branch (
git push origin feature/amazing-feature) - Apri una Pull Request
Questo progetto Γ¨ rilasciato sotto licenza MIT. Vedi il file LICENSE per dettagli.
- Framework AI: datapizza-ai
- Vector Database: Qdrant
- LLM: OpenAI GPT-3.5-turbo e GPT-4-turbo
- Web Search: Tavily
- Datasets: Kaggle (Hotels on Goibibo, Indian Places to Visit)
Per domande o supporto, apri una issue su GitHub.
Buon viaggio a Goa! π΄