Introduzione al Progetto
L'AI Interview Preparation Assistant è un'applicazione che utilizza agenti AI per aiutare gli utenti a prepararsi per colloqui di lavoro. Il progetto combina un'interfaccia utente Streamlit con il framework CrewAI per creare un'esperienza completa di preparazione ai colloqui, dalla ricerca sull'azienda alla simulazione di interviste con feedback in tempo reale.
Questo progetto è nato seguendo il corso "Build AI Agents with CrewAI" di Zero to Mastery, tenuto da Diogo Resende che ho esteso e personalizzato attraverso una ricostruzione che ha:
- Implementato un'interfaccia utente Streamlit completa
- Ottimizzato l'architettura del progetto con file YAML per la configurazione
- Utilizzato strumenti moderni come
uv
per la gestione delle dipendenze
- Incorporato considerazioni sulla privacy e sulla sicurezza
Dal Corso alla Ricostruzione: Il Mio Percorso
Fondamenta: Il Corso ZTM
Il punto di partenza è stato il corso di Zero to Mastery, che ha fornito una solida introduzione a CrewAI. Il corso ha illustrato:
- I concetti fondamentali degli agenti AI
- Come orchestrare agenti multipli con CrewAI
- L'integrazione con API esterne per la ricerca
Ricostruzione con la Documentazione Ufficiale
Dopo il completamento del corso, ho intrapreso una ricostruzione significativa del progetto utilizzando la documentazione ufficiale di CrewAI, che mi ha permesso di:
- Approfondire le capacità del framework
- Implementare pattern più avanzati per la gestione degli agenti
- Scoprire e utilizzare
uv
come alternativa moderna a pip
per la gestione delle dipendenze
Vantaggi di uv
L'utilizzo di uv
ha portato diversi vantaggi al progetto:
- Velocità di installazione 10-100x superiore rispetto a pip
- Risoluzione delle dipendenze più intelligente e deterministico
- Migliore gestione degli ambienti virtuali
- Supporto migliorato per progetti complessi con molte dipendenze
Strutturazione con YAML
Un'innovazione significativa nella ricostruzione è stata l'adozione di file YAML per la configurazione, che ha portato:
- Maggiore manutenibilità : Separazione netta tra codice e configurazione
- Flessibilità : Possibilità di modificare il comportamento degli agenti senza toccare il codice
- Internazionalizzazione: Supporto nativo per contenuti in italiano e altre lingue
Ecco un esempio dalla configurazione degli agenti:
<code>research_agent:
role: >
Agente di Ricerca
goal: >
Condurre ricerche approfondite su {company} e {interviewer}
backstory: >
Sei un ricercatore specializzato che eccelle nel trovare informazioni dettagliate su
aziende e individui. Il tuo obiettivo è raccogliere dati completi che aiuteranno
i candidati a prepararsi per i colloqui. IMPORTANTE: Devi sempre generare il tuo output
in lingua italiana, anche se le informazioni trovate sono in inglese o altre lingue.</code>
Code language: YAML (yaml)
Architettura Tecnica
Componenti Principali
Il sistema è composto da tre componenti chiave:
- Interfaccia Utente (Streamlit): Gestisce l'interazione con l'utente attraverso quattro pagine principali:
- Welcome: Introduzione all'applicazione
- Research: Raccolta di informazioni e generazione di domande
- Practice: Simulazione di colloquio con feedback in tempo reale
- Reports: Visualizzazione e download dei contenuti generati
- Backend (CrewAI): Orchestra gli agenti AI che eseguono compiti specifici:
- Research Agent: Raccoglie informazioni sulle aziende e gli intervistatori
- Interview Coach: Genera domande personalizzate e fornisce feedback
- Interview Agent: Simula un intervistatore reale
- Gestore di Sessione (InterviewManager): Mantiene lo stato dell'applicazione e gestisce la persistenza dei dati:
- Caricamento e salvataggio di domande
- Gestione dei feedback
- Sanitizzazione degli input per prevenire iniezioni
Flusso di Dati
Il sistema opera secondo questo flusso:
- L'utente inserisce informazioni sull'azienda e sulla posizione
- Il Research Agent conduce ricerche approfondite utilizzando API esterne
- L'Interview Coach genera domande personalizzate
- L'utente si esercita rispondendo alle domande
- L'Interview Coach fornisce feedback dettagliato
- I risultati vengono salvati per consultazione futura
Gestione delle Dipendenze
Il progetto utilizza un approccio moderno alla gestione delle dipendenze:
<code><em>
setup(
name="interview_prep",
version="0.1.0",
description="AI Interview Preparation using CrewAI",
author="Veronica Schembri",
author_email="veronicaschembri@gmail.com",
packages=find_packages(),
include_package_data=True,
install_requires=[
"crewai>=0.118.0",
"crewai-tools>=0.42.2",
"python-dotenv>=1.1.0",
"streamlit>=1.45.0",
"pysqlite3-binary"
],
)</code>
Code language: Python (python)
CrewAI vs LangChain: Analisi Comparativa
Durante lo sviluppo, ho avuto l'opportunità di confrontare CrewAI con LangChain, un altro framework popolare per lo sviluppo di applicazioni AI.
Similitudini
- Orchestrazione di LLM: Entrambi i framework forniscono astrazioni per lavorare con modelli linguistici
- Integrazione di Tool: Entrambi supportano l'uso di strumenti esterni come API di ricerca
- Chaining delle Operazioni: Entrambi permettono di concatenare operazioni in sequenze logiche
Differenze Chiave
Filosofia di Design
- CrewAI: Focalizzato sulla simulazione di "crew" di agenti specializzati che collaborano, ispirato alle strutture organizzative umane
- LangChain: Centrato sul concetto di "chain" (catene) di operazioni, con un'enfasi sulla composizione funzionale
Strutture Principali
- CrewAI:
- Agents (Agenti): Entità autonome con ruoli, obiettivi e backstory
- Tasks (Compiti): Azioni specifiche assegnate agli agenti
- Crew (Squadre): Gruppi di agenti che collaborano su un insieme di compiti
- LangChain:
- Chains: Sequenze di operazioni che trasformano input in output
- Tools: Funzionalità specifiche che possono essere invocate dalle catene
- Workflows: Orchestrazione più complessa di catene multiple
Implementazione nel Progetto
In questo progetto, ho utilizzato CrewAI per il suo modello mentale intuitivo basato su agenti collaborativi:
<code>@agent
def research_agent(self) -> Agent:
"""Create a research agent with tools."""
agent = Agent(
config=self.agents_config['research_agent'],
verbose=True
)
agent.tools = [SerperDevTool(), ScrapeWebsiteTool()]
return agent
@task
def research_company_task(self) -> Task:
"""Create a task to research the company."""
return Task(
config=self.tasks_config['research_company_task']
)
@crew
def crew(self) -> Crew:
"""Creates the Interview Preparation crew"""
return Crew(
agents=self.agents,
tasks=self.tasks,
process=Process.sequential,
verbose=True,
)</code>
Code language: Python (python)
Se avessi utilizzato LangChain, l'implementazione avrebbe seguito un pattern differente:
<code><em>
from langchain.agents import initialize_agent, Tool
from langchain.chains import LLMChain
research_chain = LLMChain(
llm=OpenAI(),
prompt=PromptTemplate(
input_variables=["company", "country"],
template="Ricerca informazioni su {company} in {country}"
)
)
tools = [
Tool(
name="WebSearch",
func=serper_search.run,
description="Ricerca informazioni sul web"
),
Tool(
name="WebScraper",
func=web_scraper.run,
description="Estrae informazioni da pagine web"
)
]
research_agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)
<em>
def interview_workflow(company, interviewer, job_position):
company_info = research_agent.run(f"Trova informazioni su {company}")
interviewer_info = research_agent.run(f"Trova informazioni su {interviewer}")
questions = question_generator_chain.run(
company=company_info,
interviewer=interviewer_info,
job_position=job_position
)
return questions</code>
Code language: PHP (php)
Perché Ho Scelto CrewAI
Ho scelto CrewAI per questo progetto per diverse ragioni:
- Modello Mentale Intuitivo: La metafora di "agenti collaborativi" si allinea perfettamente con il concetto di preparazione ai colloqui, dove diversi esperti (ricercatore, coach, intervistatore) collaborano
- Configurazione Dichiarativa: I file YAML rendono il comportamento degli agenti facilmente configurabile
- Supporto Nativo per Input Umani: CrewAI gestisce elegantemente l'interazione umana all'interno del flusso degli agenti
- Flessibilità nella Composizione delle Crew: Possibilità di creare crew specializzate per compiti specifici (ricerca, feedback, ecc.)
Considerazioni sulla Sicurezza e Privacy
Un aspetto fondamentale del progetto è stata l'attenzione alla sicurezza e alla privacy:
Gestione dei Dati
L'applicazione è progettata per garantire che i dati degli utenti non persistano tra sessioni diverse:
<code>def clear_all_data():
"""
Cancella completamente tutti i dati generati nella directory di output.
Garantisce che nessun dato rimanga accessibile ad altri utenti.
"""
<em># Ottieni il percorso della directory di output</em>
output_dir = get_session_path()
try:
<em># 1. Cancella tutti i file nella directory principale</em>
for filename in os.listdir(output_dir):
<em># Implementazione della pulizia dei dati</em>
<em># ...</em></code>
Code language: HTML, XML (xml)
Conclusioni e Lezioni Apprese
Lo sviluppo di questo progetto mi ha permesso di approfondire diversi aspetti dello sviluppo di applicazioni AI:
- Orchestrazione di Agenti: Ho imparato come far collaborare efficacemente modelli linguistici in ruoli specializzati
- Architettura Modulare: L'importanza di separare configurazione, logica di business e interfaccia utente
- UX nell'AI: Come progettare interfacce utente intuitive per applicazioni basate su AI
- Gestione di Dipendenze Moderne: L'uso di strumenti come
uv
per un processo di sviluppo più efficiente
Sviluppi Futuri
Questo progetto ha diverse direzioni interessanti per sviluppi futuri:
- Personalizzazione per Settori Specifici: Creare versioni specializzate per settori come tecnologia, sanità , finanza
- Integrazione con ATS: Collegamento con sistemi di tracciamento dei candidati per feedback ancora più personalizzati
- Supporto Multilingue Avanzato: Estendere il supporto linguistico oltre l'italiano e l'inglese
- Analisi Video: Aggiungere feedback sulla comunicazione non verbale tramite analisi video
Riflessione Finale
Questo progetto dimostra come i framework moderni per lo sviluppo di applicazioni AI, come CrewAI, possano essere utilizzati per creare soluzioni pratiche che affrontano problemi reali. La combinazione di agenti specializzati con un'interfaccia utente intuitiva crea un'esperienza che va oltre le semplici chatbot, offrendo un valore concreto agli utenti nel loro percorso di preparazione professionale.