Site Web | Documents | Démos | Discours | Communauté Slack | Marqo Nuage
Marqo est plus qu'une base de données vectorielles, c'est un moteur de recherche vectorielle de bout en bout pour le texte et les images. La génération, le stockage et la récupération de vecteurs sont gérés immédiatement via une seule API. Pas besoin d'apporter vos propres intégrations.
Pourquoi Marco ?
La similarité des vecteurs ne suffit pas à elle seule pour la recherche de vecteurs. La recherche de vecteurs nécessite plus qu'une base de données de vecteurs : elle nécessite également le déploiement et la gestion du machine learning (ML), le prétraitement et la transformation des entrées, ainsi que la possibilité de modifier le comportement de recherche sans recycler un modèle. Marqo contient tous ces éléments, permettant aux développeurs d'intégrer la recherche vectorielle dans leur application avec un minimum d'effort. Une liste complète des fonctionnalités peut être trouvée ci-dessous.
Pourquoi regrouper la génération d'intégration avec la recherche vectorielle ?
Les bases de données vectorielles sont des composants spécialisés pour la similarité des vecteurs et ne servent qu'un seul composant d'un système de recherche de vecteurs. Ce sont des « vecteurs d’entrée – vecteurs de sortie ». Ils nécessitent encore la production de vecteurs, la gestion des modèles ML, l'orchestration associée et le traitement des entrées. Marqo rend cela facile en étant « documents entrants, documents sortants ». Le prétraitement du texte et des images, l'intégration du contenu, le stockage des métadonnées et le déploiement de l'inférence et du stockage sont tous pris en charge par Marqo.
Démarrage rapide
Voici un extrait de code pour un exemple minimal de recherche vectorielle avec Marqo (voir Mise en route) :
Marqo nécessite Docker. Pour installer Docker, accédez au site Web officiel de Docker. Assurez-vous que Docker dispose d'au moins 8 Go de mémoire et de 50 Go de stockage. Dans le bureau Docker, vous pouvez le faire en cliquant sur l'icône des paramètres, puis sur les ressources, et en sélectionnant 8 Go de mémoire.
Utilisez Docker pour exécuter Marqo :
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -it -p 8882:8882 marqoai/marqo:latest
pip install marqo
import marqo
mq = marqo . Client ( url = 'http://localhost:8882' )
mq . create_index ( "my-first-index" , model = "hf/e5-base-v2" )
mq . index ( "my-first-index" ). add_documents ([
{
"Title" : "The Travels of Marco Polo" ,
"Description" : "A 13th-century travelogue describing Polo's travels"
},
{
"Title" : "Extravehicular Mobility Unit (EMU)" ,
"Description" : "The EMU is a spacesuit that provides environmental protection, "
"mobility, life support, and communications for astronauts" ,
"_id" : "article_591"
}],
tensor_fields = [ "Description" ]
)
results = mq . index ( "my-first-index" ). search (
q = "What is the best outfit to wear on the moon?"
)
? Des intégrations de pointe
⚡ Performances
? Documents entrants et sortants
? Cloud géré
Marqo est intégré aux frameworks d'IA et de traitement de données populaires, et d'autres sont en cours.
? Meule de foin
Haystack est un framework open source permettant de créer des applications qui utilisent la technologie NLP telles que les LLM, l'intégration de modèles et bien plus encore. Cette intégration vous permet d'utiliser Marqo comme magasin de documents pour les pipelines Haystack tels que la récupération-augmentation, la réponse aux questions, la recherche de documents et bien plus encore.
? Bande antidérapante
Griptape permet un déploiement sûr et fiable d'agents basés sur LLM pour les applications d'entreprise, MarqoVectorStoreDriver donne à ces agents l'accès à une recherche évolutive avec vos propres données. Cette intégration vous permet d'exploiter des modèles open source ou personnalisés via Marqo pour fournir des résultats pertinents à vos LLM.
?? Langchain
Cette intégration vous permet d'exploiter des modèles open source ou personnalisés via Marqo pour les applications LangChain avec un composant de recherche vectorielle. L'implémentation du magasin vectoriel Marqo peut se connecter à des chaînes existantes telles que Retrieval QA et Conversational Retrieval QA.
⋙Hamilton
Cette intégration vous permet d'exploiter des modèles open source ou personnalisés via Marqo pour les applications Hamilton LLM.
? Démarrage rapide | Créez votre première application avec Marqo en moins de 5 minutes. |
? Marqo pour les données d'image | Création d'une recherche d'images avancée avec Marqo. |
Marqo pour le texte | Construire une base de données multilingue dans Marqo. |
? Intégration de Marqo avec GPT | Faire de GPT un expert en la matière en utilisant Marqo comme base de connaissances. |
? Marqo pour l'IA créative | Combiner diffusion stable et recherche sémantique pour générer et catégoriser 100 000 images de hot-dogs. |
? Marqo et données vocales | Ajoutez une diarisation et une transcription pour prétraiter l'audio pour les questions-réponses avec Marqo et ChatGPT. |
Marqo pour la modération du contenu | Création d'une recherche d'images avancée avec Marqo pour rechercher et supprimer du contenu. |
☁️ Premiers pas avec Marqo Cloud | Découvrez comment configurer et exécuter Marqo Cloud, depuis votre première connexion jusqu'à la création de votre première application avec Marqo. |
? Marqo pour le commerce électronique | Ce projet est une application Web avec frontend et backend utilisant Python, Flask, ReactJS et Typescript. Le frontend est une application ReactJS qui envoie des requêtes au backend qui est une application Flask. Le backend envoie des requêtes à votre API cloud Marqo. |
? Chatbot Marqo | Dans ce guide, nous allons créer une application de chatbot à l'aide de Marqo et de l'API ChatGPT d'OpenAI. Nous commencerons par une base de code existante, puis expliquerons comment personnaliser le comportement. |
? Caractéristiques | Les principales fonctionnalités de Marqo. |
Marqo nécessite Docker. Pour installer Docker, accédez au site Web officiel de Docker. Assurez-vous que Docker dispose d'au moins 8 Go de mémoire et de 50 Go de stockage.
Utilisez Docker pour exécuter Marqo :
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -p 8882:8882 marqoai/marqo:latest
Remarque : si votre conteneur marqo
continue d'être tué, cela est probablement dû à un manque de mémoire allouée à Docker. Augmenter la limite de mémoire pour Docker à au moins 6 Go (8 Go recommandés) dans vos paramètres Docker peut résoudre le problème.
pip install marqo
import marqo
mq = marqo . Client ( url = 'http://localhost:8882' )
mq . create_index ( "my-first-index" )
mq . index ( "my-first-index" ). add_documents ([
{
"Title" : "The Travels of Marco Polo" ,
"Description" : "A 13th-century travelogue describing Polo's travels"
},
{
"Title" : "Extravehicular Mobility Unit (EMU)" ,
"Description" : "The EMU is a spacesuit that provides environmental protection, "
"mobility, life support, and communications for astronauts" ,
"_id" : "article_591"
}],
tensor_fields = [ "Description" ]
)
results = mq . index ( "my-first-index" ). search (
q = "What is the best outfit to wear on the moon?"
)
mq
est le client qui encapsule l'API marqo
.create_index()
crée un nouvel index avec les paramètres par défaut. Vous avez la possibilité de spécifier quel modèle utiliser. Par exemple, mq.create_index("my-first-index", model="hf/all_datasets_v4_MiniLM-L6")
créera un index avec le modèle de texte par défaut hf/all_datasets_v4_MiniLM-L6
. L'expérimentation avec différents modèles est souvent nécessaire pour obtenir la meilleure récupération pour votre cas d'utilisation spécifique. Différents modèles proposent également un compromis entre vitesse d’inférence et pertinence. Voir ici pour la liste complète des modèles.add_documents()
prend une liste de documents, représentés sous forme de dictionnaires Python pour l'indexation. tensor_fields
fait référence aux champs qui seront indexés en tant que collections vectorielles et rendus consultables._id
. Sinon, Marqo en générera un.Jetons un coup d'œil aux résultats :
# let's print out the results:
import pprint
pprint . pprint ( results )
{
'hits' : [
{
'Title' : 'Extravehicular Mobility Unit (EMU)' ,
'Description' : 'The EMU is a spacesuit that provides environmental protection, mobility, life support, and'
'communications for astronauts' ,
'_highlights' : [{
'Description' : 'The EMU is a spacesuit that provides environmental protection, '
'mobility, life support, and communications for astronauts'
}],
'_id' : 'article_591' ,
'_score' : 0.61938936
},
{
'Title' : 'The Travels of Marco Polo' ,
'Description' : "A 13th-century travelogue describing Polo's travels" ,
'_highlights' : [{ 'Title' : 'The Travels of Marco Polo' }],
'_id' : 'e00d1a8d-894c-41a1-8e3b-d8b2a8fce12a' ,
'_score' : 0.60237324
}
],
'limit' : 10 ,
'processingTimeMs' : 49 ,
'query' : 'What is the best outfit to wear on the moon?'
}
limit
est le nombre maximum de hits à renvoyer. Ceci peut être défini comme paramètre lors de la recherche._highlights
. C'est la partie du document qui correspondait le mieux à la requête. Récupérer un document par ID.
result = mq . index ( "my-first-index" ). get_document ( document_id = "article_591" )
Notez qu'en ajoutant à nouveau le document à l'aide add_documents
en utilisant le même _id
, un document sera mis à jour.
Obtenir des informations sur un index.
results = mq . index ( "my-first-index" ). get_stats ()
Effectuez une recherche par mot-clé.
result = mq . index ( "my-first-index" ). search ( 'marco polo' , search_method = marqo . SearchMethods . LEXICAL )
Pour alimenter la recherche d'images et de texte, Marqo permet aux utilisateurs de brancher et de jouer avec les modèles CLIP de HuggingFace. Notez que si vous ne configurez pas la recherche multimodale, les URL des images seront traitées comme des chaînes. Pour démarrer l'indexation et la recherche avec des images, créez d'abord un index avec une configuration CLIP, comme ci-dessous :
settings = {
"treat_urls_and_pointers_as_images" : True , # allows us to find an image file and index it
"model" : "ViT-L/14"
}
response = mq . create_index ( "my-multimodal-index" , ** settings )
Les images peuvent ensuite être ajoutées dans les documents comme suit. Vous pouvez utiliser des urls provenant d'internet (par exemple S3) ou du disque de la machine :
response = mq . index ( "my-multimodal-index" ). add_documents ([{
"My_Image" : "https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_realistic.png" ,
"Description" : "The hippopotamus, also called the common hippopotamus or river hippopotamus, is a large semiaquatic mammal native to sub-Saharan Africa" ,
"_id" : "hippo-facts"
}], tensor_fields = [ "My_Image" ])
Vous pouvez ensuite rechercher le champ d'image en utilisant du texte.
results = mq . index ( "my-multimodal-index" ). search ( 'animal' )
La recherche à l’aide d’une image peut être réalisée en fournissant le lien de l’image.
results = mq . index ( "my-multimodal-index" ). search ( 'https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_statue.png' )
Les requêtes peuvent également être fournies sous forme de dictionnaires dans lesquels chaque clé est une requête et leurs valeurs correspondantes sont des poids. Cela permet des requêtes plus avancées composées de plusieurs composants avec des pondérations en faveur ou en défaveur d'eux, les requêtes peuvent avoir des négations via une pondération négative.
L'exemple ci-dessous montre l'application de ceci à un scénario dans lequel un utilisateur peut vouloir poser une question mais également annuler les résultats qui correspondent à un certain critère sémantique.
import marqo
import pprint
mq = marqo . Client ( url = "http://localhost:8882" )
mq . create_index ( "my-weighted-query-index" )
mq . index ( "my-weighted-query-index" ). add_documents (
[
{
"Title" : "Smartphone" ,
"Description" : "A smartphone is a portable computer device that combines mobile telephone "
"functions and computing functions into one unit." ,
},
{
"Title" : "Telephone" ,
"Description" : "A telephone is a telecommunications device that permits two or more users to"
"conduct a conversation when they are too far apart to be easily heard directly." ,
},
{
"Title" : "Thylacine" ,
"Description" : "The thylacine, also commonly known as the Tasmanian tiger or Tasmanian wolf, "
"is an extinct carnivorous marsupial."
"The last known of its species died in 1936." ,
}
],
tensor_fields = [ "Description" ]
)
# initially we ask for a type of communications device which is popular in the 21st century
query = {
# a weighting of 1.1 gives this query slightly more importance
"I need to buy a communications device, what should I get?" : 1.1 ,
# a weighting of 1 gives this query a neutral importance
# this will lead to 'Smartphone' being the top result
"The device should work like an intelligent computer." : 1.0 ,
}
results = mq . index ( "my-weighted-query-index" ). search ( q = query )
print ( "Query 1:" )
pprint . pprint ( results )
# now we ask for a type of communications which predates the 21st century
query = {
# a weighting of 1 gives this query a neutral importance
"I need to buy a communications device, what should I get?" : 1.0 ,
# a weighting of -1 gives this query a negation effect
# this will lead to 'Telephone' being the top result
"The device should work like an intelligent computer." : - 0.3 ,
}
results = mq . index ( "my-weighted-query-index" ). search ( q = query )
print ( " n Query 2:" )
pprint . pprint ( results )
Marqo vous permet d'avoir des index avec des champs de combinaison multimodaux. Les champs de combinaison multimodaux peuvent combiner du texte et des images en un seul champ. Cela permet de noter les documents dans les champs de texte et d'image combinés. Il permet également d'avoir une seule représentation vectorielle au lieu d'en avoir besoin de plusieurs, ce qui permet d'économiser du stockage. La pondération relative de chaque composant peut être définie par document.
L'exemple ci-dessous le démontre avec la récupération de paires de légendes et d'images à l'aide de plusieurs types de requêtes.
import marqo
import pprint
mq = marqo . Client ( url = "http://localhost:8882" )
settings = { "treat_urls_and_pointers_as_images" : True , "model" : "ViT-L/14" }
mq . create_index ( "my-first-multimodal-index" , ** settings )
mq . index ( "my-first-multimodal-index" ). add_documents (
[
{
"Title" : "Flying Plane" ,
"caption" : "An image of a passenger plane flying in front of the moon." ,
"image" : "https://raw.githubusercontent.com/marqo-ai/marqo/mainline/examples/ImageSearchGuide/data/image2.jpg" ,
},
{
"Title" : "Red Bus" ,
"caption" : "A red double decker London bus traveling to Aldwych" ,
"image" : "https://raw.githubusercontent.com/marqo-ai/marqo/mainline/examples/ImageSearchGuide/data/image4.jpg" ,
},
{
"Title" : "Horse Jumping" ,
"caption" : "A person riding a horse over a jump in a competition." ,
"image" : "https://raw.githubusercontent.com/marqo-ai/marqo/mainline/examples/ImageSearchGuide/data/image1.jpg" ,
},
],
# Create the mappings, here we define our captioned_image mapping
# which weights the image more heavily than the caption - these pairs
# will be represented by a single vector in the index
mappings = {
"captioned_image" : {
"type" : "multimodal_combination" ,
"weights" : {
"caption" : 0.3 ,
"image" : 0.7
}
}
},
# We specify which fields to create vectors for.
# Note that captioned_image is treated as a single field.
tensor_fields = [ "captioned_image" ]
)
# Search this index with a simple text query
results = mq . index ( "my-first-multimodal-index" ). search (
q = "Give me some images of vehicles and modes of transport. I am especially interested in air travel and commercial aeroplanes."
)
print ( "Query 1:" )
pprint . pprint ( results )
# search the index with a query that uses weighted components
results = mq . index ( "my-first-multimodal-index" ). search (
q = {
"What are some vehicles and modes of transport?" : 1.0 ,
"Aeroplanes and other things that fly" : - 1.0
},
)
print ( " n Query 2:" )
pprint . pprint ( results )
results = mq . index ( "my-first-multimodal-index" ). search (
q = { "Animals of the Perissodactyla order" : - 1.0 }
)
print ( " n Query 3:" )
pprint . pprint ( results )
Supprimez des documents.
results = mq . index ( "my-first-index" ). delete_documents ( ids = [ "article_591" , "article_602" ])
Supprimer un index.
results = mq . index ( "my-first-index" ). delete ()
Nous prenons en charge les modèles Kubernetes pour Marqo que vous pouvez déployer sur le fournisseur cloud de votre choix. L'implémentation Kubernetes de Marqo vous permet de déployer des clusters avec des réplicas, plusieurs fragments de stockage et plusieurs nœuds d'inférence. Le dépôt peut être trouvé ici : https://github.com/marqo-ai/marqo-on-kubernetes
Si vous recherchez un service cloud entièrement géré, vous pouvez vous inscrire à Marqo Cloud ici : https://cloud.marqo.ai.
La documentation complète de Marqo peut être trouvée ici https://docs.marqo.ai/.
Notez que vous ne devez pas exécuter d'autres applications sur le cluster Vespa de Marqo car Marqo modifie et adapte automatiquement les paramètres du cluster.
Marqo est un projet communautaire dont le but est de rendre la recherche tensorielle accessible à la communauté des développeurs au sens large. Nous sommes heureux que vous souhaitiez nous aider ! Veuillez lire ceci pour commencer.
Créez un environnement virtuel python -m venv ./venv
.
Activez la source ./venv/bin/activate
.
Installez les exigences à partir du fichier d'exigences : pip install -r requirements.txt
.
Exécutez des tests en exécutant le fichier tox. CD dans ce répertoire, puis exécutez "tox".
Si vous mettez à jour les dépendances, assurez-vous de supprimer le répertoire .tox et de réexécuter.
Exécutez la suite de tests complète (en utilisant la commande tox
dans ce répertoire).
Créez une pull request avec un problème github joint.