IGNYTE è una piattaforma di recruiting che funge da sistema di tracciamento dei candidati (ATS) per numerosi clienti aziendali. Il suo database di talenti combina dati di contatto provenienti da diversi fornitori terzi con i record proprietari di ciascun inquilino, mantenendo l’isolamento dei dati sensibili. Per rendere possibile la ricerca semantica, IGNYTE genera un embedding per ogni contatto, consentendo di trovare candidati in base al significato del testo anziché a parole chiave esatte.
Problema di scalabilità con OpenSearch Service
Inizialmente, gli embedding vettoriali erano archiviati in un dominio Amazon OpenSearch Service insieme ai profili completi dei candidati. OpenSearch esegue ricerche approssimative dei vicini più prossimi (approximate nearest‑neighbor) mantenendo un grafo in memoria. Quando il numero di contatti superò il miliardo, il grafo non trovò più spazio nella memoria del cluster: le query rallentarono e la squadra dovette aggiungere nodi sempre più grandi, aumentando i costi operativi.
Il team valutò due soluzioni: continuare a scalare il cluster oppure dividere l’indice. Entrambe avrebbero comunque legato la capacità vettoriale alla memoria disponibile, limitando ulteriori crescita.
Scelta di Amazon S3 Vectors
La decisione fu di migrare tutti i vettori su Amazon S3 Vectors, una funzionalità serverless di Amazon S3 che consente lo storage nativo di vettori e la ricerca di similarità. I dati strutturati (skill, esperienza, località, ecc.) rimasero in OpenSearch Service, dove erano già ottimizzati per il filtraggio.
- Capacità per indice: fino a 2 miliardi di vettori per singolo indice.
- Numero di indici per bucket: fino a 10 000 indici per bucket.
- Assenza di cluster da dimensionare: servizio completamente serverless.
- Prezzo basato sull'uso: costi calcolati in base a dati memorizzati, scritti e query eseguite.
- Consistenza forte: i vettori inseriti con
PutVectorssono immediatamente disponibili per le query.
Queste caratteristiche soddisfacevano i requisiti di IGNYTE per una soluzione scalabile, economica e a bassa latenza.
Architettura della soluzione
L’architettura si articola in due percorsi distinti: pipeline di ingestione e percorso di query. Entrambi operano nella stessa regione AWS, ma interagiscono con due store differenti.
Pipeline di ingestione
La pipeline converte i dati dei fornitori in profili di candidato e embedding, caricandoli poi nei rispettivi store.
- I dati dei fornitori arrivano in Amazon S3.
- Due job AWS Glue separano i dati in record aziendali e record di contatto, scrivendo file Parquet su S3.
- Un job Amazon SageMaker AI elabora i record aziendali; una funzione AWS Lambda li carica in un indice aziendale di OpenSearch Service.
- Un secondo job SageMaker pulisce e arricchisce i record di contatto, cercando l’employer nel nuovo indice aziendale e generando un embedding per ogni contatto con il modello proprietario IGNYTE.
- I profili puliti e gli embedding vengono scritti su S3 come file JSON separati.
- Il parametro di configurazione della pipeline è custodito in AWS Systems Manager Parameter Store.
- Una Lambda carica i profili di contatto puliti nell’indice di contatti di OpenSearch Service.
- Una Lambda denominata
upserts3vectorsinvia gli embedding a S3 Vectors mediantePutVectors, assegnando a ciascun contatto l’indice continentaleign-contacts-{continent}.
Inizialmente la pipeline era guidata da notifiche di eventi S3, ma è stata sostituita da un batch pianificato per garantire che i dati aziendali fossero sempre disponibili prima dell’arricchimento dei contatti.
Percorso di query
Quando un recruiter invia una richiesta di ricerca, il flusso è il seguente:
- L’agente IGNYTE AI, eseguito su Amazon Bedrock AgentCore, riceve la richiesta.
- L’agente invia il testo della query al endpoint SageMaker AI che ospita il modello di embedding e riceve un vettore di query.
- Il vettore di query viene passato a
QueryVectorssull’indice continentale corrispondente di S3 Vectors, includendo eventuali filtri metadata (es. livello seniorità, settore). - S3 Vectors restituisce gli ID dei 100 contatti più vicini.
- Questi ID vengono usati per interrogare l’indice di contatti di OpenSearch Service, applicando filtri strutturati aggiuntivi (skill, anni di esperienza, location).
- Il risultato finale, una lista di profili arricchiti, viene restituito al recruiter o a ulteriori agenti per attività di short‑listing o outreach.
Questo approccio “two‑hop” combina la potenza della ricerca vettoriale su scala con la flessibilità del filtraggio tradizionale.
Dettagli di progettazione del metadata
Ogni vettore memorizzato in S3 Vectors è accompagnato da un set di metadati chiave‑valore che facilita il filtraggio preliminare:
- contact_id: identificatore univoco del candidato.
- continent: continente di riferimento, usato per scegliere l’indice.
- role_level: seniorità (es. junior, senior, executive).
- industry_code: codice settore standardizzato.
- last_update: timestamp dell’ultimo aggiornamento dell’embedding.
I metadati sono replicati anche negli indici OpenSearch per garantire coerenza tra i due store durante le query multi‑step.
Vantaggi ottenuti
Il passaggio a S3 Vectors ha prodotto risultati concreti:
- Scalabilità lineare: la capacità di gestire oltre 2 miliardi di vettori per indice elimina il collo di bottiglia della memoria.
- Riduzione dei costi operativi: nessun nodo da dimensionare, modello di pricing pay‑as‑you‑go.
- Latenza migliorata: le query di similarità su S3 Vectors hanno tempi di risposta inferiori a 150 ms per 100 risultati, rispetto a 400‑600 ms con OpenSearch.
- Semplificazione della gestione: la separazione tra dati vettoriali e strutturati permette di aggiornare gli embedding indipendentemente dai profili.
Inoltre, la soluzione è pronta per future espansioni, come l’integrazione di ulteriori agenti AI o l’adozione di modelli di embedding più avanzati.
Considerazioni future
IGNYTE sta valutando l’utilizzo di Amazon Athena per analisi ad‑hoc sui vettori memorizzati in S3, nonché l’integrazione di Amazon SageMaker Retrieval Augmented Generation (RAG) per arricchire ulteriormente le risposte degli agenti con contesto proveniente da documenti aziendali.
Un altro sviluppo potenziale è la segmentazione degli indici vettoriali per dominio funzionale (es. ingegneria, marketing), riducendo ulteriormente il numero di candidati restituiti nella prima fase di ricerca e migliorando la precisione dei filtri successivi.
Infine, IGNYTE intende approfondire le possibilità di fine‑tuning del proprio modello di embedding utilizzando feedback dei recruiter, creando un ciclo di apprendimento continuo che migliori la rilevanza delle corrispondenze nel tempo.
