Website | Dokumentation | Demos | Diskurs | Slack-Community | Marquo Cloud
Marqo ist mehr als eine Vektordatenbank, es ist eine End-to-End-Vektorsuchmaschine für Text und Bilder. Die Vektorgenerierung, -speicherung und -abfrage erfolgt standardmäßig über eine einzige API. Sie müssen keine eigenen Einbettungen mitbringen.
Warum Marquo?
Vektorähnlichkeit allein reicht für die Vektorsuche nicht aus. Die Vektorsuche erfordert mehr als eine Vektordatenbank – sie erfordert auch die Bereitstellung und Verwaltung von maschinellem Lernen (ML), die Vorverarbeitung und Transformation von Eingaben sowie die Möglichkeit, das Suchverhalten zu ändern, ohne ein Modell neu zu trainieren. Marqo enthält all diese Teile und ermöglicht es Entwicklern, die Vektorsuche mit minimalem Aufwand in ihre Anwendung zu integrieren. Eine vollständige Liste der Funktionen finden Sie unten.
Warum die Einbettungsgenerierung mit der Vektorsuche bündeln?
Vektordatenbanken sind spezialisierte Komponenten für Vektorähnlichkeit und bedienen nur eine Komponente eines Vektorsuchsystems. Es handelt sich um „Vektoren rein – Vektoren raus“. Sie erfordern weiterhin die Produktion von Vektoren, die Verwaltung der ML-Modelle, die damit verbundene Orchestrierung und Verarbeitung der Eingaben. Marqo macht dies einfach, indem es „Dokumente rein, Dokumente raus“ bedeutet. Marqo übernimmt die Vorverarbeitung von Texten und Bildern, die Einbettung der Inhalte, die Speicherung von Metadaten sowie die Bereitstellung von Inferenz und Speicherung.
Schnellstart
Hier ist ein Codeausschnitt für ein Minimalbeispiel der Vektorsuche mit Marqo (siehe Erste Schritte):
Marqo erfordert Docker. Um Docker zu installieren, besuchen Sie die offizielle Docker-Website. Stellen Sie sicher, dass Docker über mindestens 8 GB Arbeitsspeicher und 50 GB Speicher verfügt. Im Docker-Desktop können Sie dies tun, indem Sie auf das Einstellungssymbol, dann auf Ressourcen klicken und 8 GB Speicher auswählen.
Verwenden Sie Docker, um Marqo auszuführen:
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?"
)
? Modernste Einbettungen
⚡ Leistung
? Dokumente-ein-Dokumente-aus
? Verwaltete Cloud
Marqo ist in gängige KI- und Datenverarbeitungs-Frameworks integriert, weitere sind in Vorbereitung.
? Heuhaufen
Haystack ist ein Open-Source-Framework zum Erstellen von Anwendungen, die NLP-Technologie wie LLMs, Einbettungsmodelle und mehr nutzen. Diese Integration ermöglicht Ihnen die Verwendung von Marqo als Dokumentenspeicher für Haystack-Pipelines wie Retrieval-Augmentation, Fragebeantwortung, Dokumentensuche und mehr.
? Griptape
Griptape ermöglicht die sichere und zuverlässige Bereitstellung von LLM-basierten Agenten für Unternehmensanwendungen. Der MarqoVectorStoreDriver ermöglicht diesen Agenten Zugriff auf eine skalierbare Suche mit Ihren eigenen Daten. Durch diese Integration können Sie Open-Source- oder benutzerdefinierte, fein abgestimmte Modelle über Marqo nutzen, um relevante Ergebnisse für Ihre LLMs zu liefern.
?? Langkette
Durch diese Integration können Sie Open-Source- oder benutzerdefinierte, fein abgestimmte Modelle über Marqo für LangChain-Anwendungen mit einer Vektorsuchkomponente nutzen. Die Marqo-Vektorspeicherimplementierung kann in bestehende Ketten wie Retrieval QA und Conversational Retrieval QA integriert werden.
⋙ Hamilton
Durch diese Integration können Sie Open-Source- oder benutzerdefinierte, fein abgestimmte Modelle über Marqo für Hamilton LLM-Anwendungen nutzen.
? Schnellstart | Erstellen Sie Ihre erste Anwendung mit Marqo in weniger als 5 Minuten. |
? Marqo für Bilddaten | Erstellen Sie eine erweiterte Bildsuche mit Marqo. |
Marko für Text | Aufbau einer mehrsprachigen Datenbank in Marqo. |
? Marqo mit GPT integrieren | Machen Sie GPT zu einem Fachexperten, indem Sie Marqo als Wissensdatenbank nutzen. |
? Marquo für kreative KI | Kombination stabiler Diffusion mit semantischer Suche zur Generierung und Kategorisierung von 100.000 Bildern von Hotdogs. |
? Marquo- und Sprachdaten | Fügen Sie Tagebuchführung und Transkription hinzu, um Audio für Fragen und Antworten mit Marqo und ChatGPT vorzuverarbeiten. |
Marqo für die Inhaltsmoderation | Erstellen Sie mit Marqo eine erweiterte Bildersuche, um Inhalte zu finden und zu entfernen. |
☁️ Erste Schritte mit Marqo Cloud | Erfahren Sie, wie Sie Marqo Cloud einrichten und in Betrieb nehmen, angefangen bei Ihrer ersten Anmeldung bis hin zur Erstellung Ihrer ersten Anwendung mit Marqo |
? Marqo für E-Commerce | Bei diesem Projekt handelt es sich um eine Webanwendung mit Frontend und Backend unter Verwendung von Python, Flask, ReactJS und Typescript. Das Frontend ist eine ReactJS-Anwendung, die Anfragen an das Backend stellt, bei dem es sich um eine Flask-Anwendung handelt. Das Backend stellt Anfragen an Ihre Marqo-Cloud-API. |
? Marquo-Chatbot | In diesem Leitfaden erstellen wir eine Chat-Bot-Anwendung mit Marqo und der ChatGPT-API von OpenAI. Wir beginnen mit einer vorhandenen Codebasis und gehen dann durch, wie das Verhalten angepasst wird. |
? Merkmale | Die Kernfunktionen von Marquo. |
Marqo erfordert Docker. Um Docker zu installieren, besuchen Sie die offizielle Docker-Website. Stellen Sie sicher, dass Docker über mindestens 8 GB Arbeitsspeicher und 50 GB Speicher verfügt.
Verwenden Sie Docker, um Marqo auszuführen:
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -p 8882:8882 marqoai/marqo:latest
Hinweis: Wenn Ihr marqo
-Container immer wieder abstürzt, liegt dies höchstwahrscheinlich daran, dass Docker nicht genügend Speicher zugewiesen wird. Das Problem kann möglicherweise behoben werden, indem Sie das Speicherlimit für Docker in Ihren Docker-Einstellungen auf mindestens 6 GB (8 GB empfohlen) erhöhen.
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
ist der Client, der die marqo
-API umschließt.create_index()
erstellt einen neuen Index mit Standardeinstellungen. Sie haben die Möglichkeit anzugeben, welches Modell verwendet werden soll. Beispielsweise erstellt mq.create_index("my-first-index", model="hf/all_datasets_v4_MiniLM-L6")
einen Index mit dem Standardtextmodell hf/all_datasets_v4_MiniLM-L6
. Oft ist das Experimentieren mit verschiedenen Modellen erforderlich, um den besten Abruf für Ihren spezifischen Anwendungsfall zu erzielen. Verschiedene Modelle bieten auch einen Kompromiss zwischen Inferenzgeschwindigkeit und Relevanz. Die vollständige Liste der Modelle finden Sie hier.add_documents()
nimmt eine Liste von Dokumenten entgegen, die als Python-Dicts zur Indizierung dargestellt werden. tensor_fields
bezieht sich auf die Felder, die als Vektorsammlungen indiziert und durchsuchbar gemacht werden._id
festlegen. Andernfalls generiert Marqo eines.Werfen wir einen Blick auf die Ergebnisse:
# 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
ist die maximale Anzahl der zurückgegebenen Treffer. Dies kann während der Suche als Parameter eingestellt werden._highlights
-Feld. Dies war der Teil des Dokuments, der am besten zur Suchanfrage passte. Rufen Sie ein Dokument anhand der ID ab.
result = mq . index ( "my-first-index" ). get_document ( document_id = "article_591" )
Beachten Sie, dass das erneute Hinzufügen des Dokuments mit add_documents
unter Verwendung derselben _id
dazu führt, dass ein Dokument aktualisiert wird.
Informationen zu einem Index abrufen.
results = mq . index ( "my-first-index" ). get_stats ()
Führen Sie eine Stichwortsuche durch.
result = mq . index ( "my-first-index" ). search ( 'marco polo' , search_method = marqo . SearchMethods . LEXICAL )
Um die Bild- und Textsuche zu unterstützen, ermöglicht Marqo den Benutzern das Plug-and-Play mit CLIP-Modellen von HuggingFace. Beachten Sie, dass Bild-URLs als Zeichenfolgen behandelt werden, wenn Sie die multimodale Suche nicht konfigurieren. Um mit der Indizierung und Suche mit Bildern zu beginnen, erstellen Sie zunächst einen Index mit einer CLIP-Konfiguration wie folgt:
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 )
Bilder können dann wie folgt in Dokumente eingefügt werden. Sie können URLs aus dem Internet (z. B. S3) oder von der Festplatte der Maschine verwenden:
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" ])
Anschließend können Sie das Bildfeld mithilfe von Text durchsuchen.
results = mq . index ( "my-multimodal-index" ). search ( 'animal' )
Die Suche anhand eines Bildes kann durch Bereitstellung des Bildlinks erfolgen.
results = mq . index ( "my-multimodal-index" ). search ( 'https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_statue.png' )
Abfragen können auch als Wörterbücher bereitgestellt werden, wobei jeder Schlüssel eine Abfrage und die entsprechenden Werte Gewichtungen sind. Dies ermöglicht komplexere Abfragen, die aus mehreren Komponenten mit Gewichtungen in Richtung oder gegen diese bestehen. Abfragen können Negationen durch negative Gewichtung aufweisen.
Das folgende Beispiel zeigt die Anwendung davon auf ein Szenario, in dem ein Benutzer möglicherweise eine Frage stellen, aber auch Ergebnisse verneinen möchte, die einem bestimmten semantischen Kriterium entsprechen.
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 )
Mit Marqo können Sie Indizes mit multimodalen Kombinationsfeldern erstellen. Multimodale Kombinationsfelder können Text und Bilder in einem Feld kombinieren. Dies ermöglicht die Bewertung von Dokumenten über die kombinierten Text- und Bildfelder hinweg. Es ermöglicht auch eine einzelne Vektordarstellung, anstatt viele zu benötigen, was Speicherplatz spart. Die relative Gewichtung jeder Komponente kann pro Dokument eingestellt werden.
Das folgende Beispiel veranschaulicht dies anhand des Abrufs von Bildunterschriften- und Bildpaaren mithilfe mehrerer Abfragetypen.
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 )
Dokumente löschen.
results = mq . index ( "my-first-index" ). delete_documents ( ids = [ "article_591" , "article_602" ])
Löschen Sie einen Index.
results = mq . index ( "my-first-index" ). delete ()
Wir unterstützen Kubernetes-Vorlagen für Marqo, die Sie bei einem Cloud-Anbieter Ihrer Wahl bereitstellen können. Mit der Kubernetes-Implementierung von Marqo können Sie Cluster mit Replikaten, mehreren Speicher-Shards und mehreren Inferenzknoten bereitstellen. Das Repo finden Sie hier: https://github.com/marqo-ai/marqo-on-kubernetes
Wenn Sie auf der Suche nach einem vollständig verwalteten Cloud-Service sind, können Sie sich hier für Marqo Cloud anmelden: https://cloud.marqo.ai.
Die vollständige Dokumentation für Marqo finden Sie hier https://docs.marqo.ai/.
Beachten Sie, dass Sie keine anderen Anwendungen auf dem Vespa-Cluster von Marqo ausführen sollten, da Marqo die Einstellungen auf dem Cluster automatisch ändert und anpasst.
Marqo ist ein Community-Projekt mit dem Ziel, die Tensorsuche einer breiteren Entwickler-Community zugänglich zu machen. Wir freuen uns, dass Sie Interesse haben, mitzuhelfen! Bitte lesen Sie dies, um zu beginnen.
Erstellen Sie eine virtuelle Umgebung python -m venv ./venv
.
Aktivieren Sie die source ./venv/bin/activate
.
Installieren Sie die Anforderungen aus der Anforderungsdatei: pip install -r requirements.txt
.
Führen Sie Tests durch, indem Sie die Tox-Datei ausführen. CD in dieses Verzeichnis und führen Sie dann „tox“ aus.
Wenn Sie Abhängigkeiten aktualisieren, löschen Sie unbedingt das .tox-Verzeichnis und führen Sie es erneut aus.
Führen Sie die vollständige Testsuite aus (indem Sie den Befehl tox
in diesem Verzeichnis verwenden).
Erstellen Sie eine Pull-Anfrage mit einem angehängten Github-Problem.