Vector Databases

Vespa pour la recherche multimodale : combiner données vectorielles, mots-clés et géospatiales dans une seule requête

Les applications de recherche modernes vont bien au-delà de la simple correspondance de mots-clés. Les utilisateurs d'aujourd'hui s'attendent à une expérience fluide qui comprend l'intention sémantique, respecte la terminologie spécifique et tient compte de la localisation physique. Par exemple, un utilisateur pourrait rechercher « meilleurs restaurants végétaliens près de moi », où « près de moi » est géospatial, « végétalien » est une contrainte de mot-clé et « meilleurs » implique un classement sémantique basé sur les avis ou les embeddings d'images.

De nombreuses architectures traditionnelles peinent à traiter simultanément ces trois types de données distincts sans une orchestration complexe de microservices. Vespa, un moteur de recherche et de service open source, répond à ce défi de manière native. En traitant les vecteurs, le texte et la localisation comme des citoyens de premier ordre, Vespa permet aux développeurs de fusionner ces signaux dans une seule requête haute performance.

Pourquoi la recherche multimodale est importante

La recherche hybride n'est plus une nouveauté ; c'est une exigence. La recherche vectorielle pure manque souvent de la précision nécessaire pour les noms de marque exacts ou les codes techniques. La recherche par mots-clés pure échoue à capturer la nuance sémantique des requêtes en langage naturel. L'ajout de contraintes géospatiales crée une autre couche de complexité, car les données de localisation sont souvent stockées séparément du contenu.

L'architecture de Vespa élimine ces silos. Elle indexe tous les types de données dans un schéma unifié, permettant au profil de classement de pondérer et de combiner ces signaux à l'aide de fonctions de classement personnalisées. Cela se traduit par une latence plus faible et une pertinence plus élevée par rapport à la fédération de plusieurs moteurs de recherche.

Définition du schéma : structurer les données multimodales

Pour permettre la recherche multimodale, votre schéma doit définir les types de champs appropriés. Vespa prend en charge string pour le texte, geopoint pour la localisation et tensor pour les embeddings vectoriels.

schema products {
    document store {
        field name type string {
            index
        }
        field location type geopoint {
            index
        }
        field embedding type tensor<float>[128] {
            index
        }
        field category type string {
            index
        }
    }
}

Notez que le champ tensor nécessite un index pour être interrogeable via la similarité vectorielle, tandis que geopoint nécessite un index pour les requêtes spatiales.

Élaboration de la requête multimodale

La puissance de Vespa réside dans sa capacité à exécuter une seule requête ciblant plusieurs types de données. Vous pouvez utiliser l'énoncé select pour filtrer par localisation, filtrer par mots-clés et effectuer une recherche de plus proche voisin vectoriel simultanément.

Considérez une requête pour « hôtels de luxe à Paris avec une décoration moderne ». Vous pourriez structurer votre requête comme suit :

GET /search/?query=(
    userQuery:(luxury hotel) OR 
    embedding:nearestNeighbor(embedding, [0.1, 0.2, ...]) 
) AND location:geoCircle(48.8566, 2.3522, 5km)
&ranking=queryName

Dans cet exemple :

  1. Correspondance par mots-clés : userQuery:(luxury hotel) assure la correspondance textuelle traditionnelle.
  2. Correspondance vectorielle : nearestNeighbor trouve des documents sémantiquement similaires sur la base du vecteur de requête embarqué.
  3. Filtre géospatial : geoCircle restreint les résultats à un rayon de 5 km des coordonnées de Paris.

Stratégies de classement pour la fusion

Il ne suffit pas de récupérer les résultats des trois sources ; vous devez les classer de manière cohérente. Le profil de classement de Vespa vous permet de définir des formules personnalisées qui mélangent les scores provenant de différents champs.

rank-profile MultiModalRank {
    inputs {
        input<float> vectorWeight: 0.5
        input<float> keywordWeight: 0.3
        input<float> locationWeight: 0.2
    }
    first-phase {
        function<float> vector_score() {
            expression: closestMatchDistance(embedding)
        }
        function<float> keyword_score() {
            expression: bm25(name)
        }
        function<float> location_score() {
            expression: 1.0 - geoDistance(location) / 10000.0
        }
        expression: vectorWeight * vector_score() + 
                    keywordWeight * keyword_score() + 
                    locationWeight * location_score()
    }
}

Cette formule pondère dynamiquement chaque composante. Les développeurs peuvent ajuster ces poids sur la base de tests A/B pour optimiser leur cas d'usage spécifique, qu'ils privilégient la pertinence sémantique ou la proximité géographique.

Conclusion

Vespa fournit une solution robuste et évolutive pour la recherche multimodale, éliminant la complexité de l'intégration de bases de données vectorielles, textuelles et géospatiales distinctes. En exploitant son indexation unifiée et son moteur de classement flexible, les développeurs peuvent créer des expériences de recherche hautement pertinentes et conscientes du contexte avec une faible latence. À mesure que les données deviennent plus diverses, la capacité de fusionner ces modalités dans une seule requête devient un avantage concurrentiel critique.

Share: