Sitio web | Documentación | Demostraciones | Discurso | Comunidad floja | Nube Marqo
Marqo es más que una base de datos vectorial, es un motor de búsqueda vectorial de extremo a extremo, tanto para texto como para imágenes. La generación, el almacenamiento y la recuperación de vectores se gestionan de forma inmediata a través de una única API. No es necesario traer tus propias incrustaciones.
¿Por qué Marqo?
La similitud de vectores por sí sola no es suficiente para la búsqueda de vectores. La búsqueda de vectores requiere más que una base de datos de vectores: también requiere implementación y administración de aprendizaje automático (ML), preprocesamiento y transformaciones de entradas, así como la capacidad de modificar el comportamiento de búsqueda sin volver a entrenar un modelo. Marqo contiene todas estas piezas, lo que permite a los desarrolladores integrar la búsqueda vectorial en su aplicación con un mínimo esfuerzo. Puede encontrar una lista completa de funciones a continuación.
¿Por qué combinar la generación de incrustaciones con la búsqueda vectorial?
Las bases de datos de vectores son componentes especializados para la similitud de vectores y solo dan servicio a un componente de un sistema de búsqueda de vectores. Son “vectores de entrada - vectores de salida”. Todavía requieren la producción de vectores, la gestión de los modelos ML, la orquestación asociada y el procesamiento de las entradas. Marqo facilita esto al ser “documentos que entran, documentos que salen”. Marqo se encarga del preprocesamiento de texto e imágenes, de la incrustación del contenido, del almacenamiento de metadatos y del despliegue de la inferencia y el almacenamiento.
Inicio rápido
Aquí hay un fragmento de código para un ejemplo mínimo de búsqueda vectorial con Marqo (consulte Introducción):
Marqo requiere Docker. Para instalar Docker, vaya al sitio web oficial de Docker. Asegúrese de que la ventana acoplable tenga al menos 8 GB de memoria y 50 GB de almacenamiento. En el escritorio Docker, puede hacer esto haciendo clic en el ícono de configuración, luego en recursos y seleccionando 8 GB de memoria.
Utilice la ventana acoplable para ejecutar 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?"
)
? Incrustaciones de última generación
⚡ Rendimiento
? Documentos-dentro-documentos-fuera
? Nube administrada
Marqo está integrado en marcos populares de procesamiento de datos e inteligencia artificial, y hay más en camino.
? Almiar
Haystack es un marco de código abierto para crear aplicaciones que utilizan tecnología NLP, como LLM, modelos integrados y más. Esta integración le permite utilizar Marqo como su almacén de documentos para canales de Haystack, como recuperación y aumento, respuesta a preguntas, búsqueda de documentos y más.
? Cinta de agarre
Griptape permite la implementación segura y confiable de agentes basados en LLM para aplicaciones empresariales; MarqoVectorStoreDriver brinda a estos agentes acceso a búsquedas escalables con sus propios datos. Esta integración le permite aprovechar modelos de código abierto o personalizados y ajustados a través de Marqo para ofrecer resultados relevantes a sus LLM.
?? Cadena Lang
Esta integración le permite aprovechar modelos de código abierto o ajustados personalizados a través de Marqo para aplicaciones LangChain con un componente de búsqueda vectorial. La implementación del almacén de vectores Marqo puede conectarse a cadenas existentes, como Retrieval QA y Conversational Retrieval QA.
⋙Hamilton
Esta integración le permite aprovechar modelos de código abierto o personalizados a través de aplicaciones Marqo para Hamilton LLM.
? Inicio rápido | Cree su primera aplicación con Marqo en menos de 5 minutos. |
? Marqo para datos de imagen | Creación de búsqueda avanzada de imágenes con Marqo. |
Marqo para texto | Construyendo una base de datos multilingüe en Marqo. |
? Integrando Marqo con GPT | Hacer de GPT un experto en la materia utilizando Marqo como base de conocimientos. |
? Marqo para la IA creativa | Combinando difusión estable con búsqueda semántica para generar y categorizar 100.000 imágenes de perritos calientes. |
? Marqo y datos de voz | Agregue diario y transcripción para preprocesar audio para preguntas y respuestas con Marqo y ChatGPT. |
Marqo para moderación de contenidos | Creación de búsqueda avanzada de imágenes con Marqo para buscar y eliminar contenido. |
☁️ Comenzando con Marqo Cloud | Vea cómo configurar y ejecutar Marqo Cloud desde el primer inicio de sesión hasta la creación de su primera aplicación con Marqo. |
? Marqo para el comercio electrónico | Este proyecto es una aplicación web con frontend y backend que utiliza Python, Flask, ReactJS y Typecript. El frontend es una aplicación ReactJS que realiza solicitudes al backend, que es una aplicación Flask. El backend realiza solicitudes a su API en la nube de Marqo. |
? chatbot marqo | En esta guía, crearemos una aplicación de chatbot utilizando Marqo y la API ChatGPT de OpenAI. Comenzaremos con una base de código existente y luego explicaremos cómo personalizar el comportamiento. |
? Características | Características principales de Marqo. |
Marqo requiere Docker. Para instalar Docker, vaya al sitio web oficial de Docker. Asegúrese de que la ventana acoplable tenga al menos 8 GB de memoria y 50 GB de almacenamiento.
Utilice la ventana acoplable para ejecutar Marqo:
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -p 8882:8882 marqoai/marqo:latest
Nota: Si su contenedor marqo
sigue muriendo, lo más probable es que se deba a una falta de memoria asignada a Docker. Aumentar el límite de memoria para Docker a al menos 6 GB (se recomiendan 8 GB) en la configuración de Docker puede solucionar el problema.
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
es el cliente que encapsula la API marqo
.create_index()
crea un nuevo índice con la configuración predeterminada. Tiene la opción de especificar qué modelo usar. Por ejemplo, mq.create_index("my-first-index", model="hf/all_datasets_v4_MiniLM-L6")
creará un índice con el modelo de texto predeterminado hf/all_datasets_v4_MiniLM-L6
. A menudo es necesario experimentar con diferentes modelos para lograr la mejor recuperación para su caso de uso específico. Los diferentes modelos también ofrecen un equilibrio entre velocidad de inferencia y relevancia. Consulte aquí para obtener la lista completa de modelos.add_documents()
toma una lista de documentos, representados como dictados de Python para indexar. tensor_fields
se refiere a los campos que se indexarán como colecciones de vectores y se podrán buscar._id
. De lo contrario, Marqo generará uno.Echemos un vistazo a los resultados:
# 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
es el número máximo de visitas que se devolverán. Esto se puede configurar como parámetro durante la búsqueda._highlights
. Esta fue la parte del documento que mejor coincidió con la consulta. Recuperar un documento por DNI.
result = mq . index ( "my-first-index" ). get_document ( document_id = "article_591" )
Tenga en cuenta que al agregar el documento usando add_documents
nuevamente usando el mismo _id
se actualizará el documento.
Obtener información sobre un índice.
results = mq . index ( "my-first-index" ). get_stats ()
Realice una búsqueda de palabras clave.
result = mq . index ( "my-first-index" ). search ( 'marco polo' , search_method = marqo . SearchMethods . LEXICAL )
Para potenciar la búsqueda de imágenes y texto, Marqo permite a los usuarios conectar y usar modelos CLIP de HuggingFace. Tenga en cuenta que si no configura la búsqueda multimodal, las URL de las imágenes se tratarán como cadenas. Para comenzar a indexar y buscar con imágenes, primero cree un índice con una configuración CLIP, como se muestra a continuación:
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 )
Luego se pueden agregar imágenes dentro de los documentos de la siguiente manera. Puedes utilizar URL de Internet (por ejemplo S3) o del disco de la máquina:
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" ])
Luego puede buscar el campo de imagen usando texto.
results = mq . index ( "my-multimodal-index" ). search ( 'animal' )
La búsqueda utilizando una imagen se puede lograr proporcionando el enlace de la imagen.
results = mq . index ( "my-multimodal-index" ). search ( 'https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_statue.png' )
Las consultas también se pueden proporcionar como diccionarios donde cada clave es una consulta y sus valores correspondientes son pesos. Esto permite consultas más avanzadas que constan de múltiples componentes con ponderaciones a favor o en contra de ellos; las consultas pueden tener negaciones mediante ponderación negativa.
El siguiente ejemplo muestra la aplicación de esto a un escenario en el que un usuario puede querer hacer una pregunta pero también negar resultados que coincidan con un determinado criterio semántico.
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 te permite tener índices con campos de combinación multimodal. Los campos de combinación multimodal pueden combinar texto e imágenes en un solo campo. Esto permite calificar documentos en los campos combinados de texto e imagen. También permite una representación vectorial única en lugar de necesitar muchas, lo que ahorra almacenamiento. La ponderación relativa de cada componente se puede establecer por documento.
El siguiente ejemplo demuestra esto con la recuperación de pares de títulos e imágenes mediante múltiples tipos de consultas.
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 )
Eliminar documentos.
results = mq . index ( "my-first-index" ). delete_documents ( ids = [ "article_591" , "article_602" ])
Eliminar un índice.
results = mq . index ( "my-first-index" ). delete ()
Admitimos plantillas de Kubernetes para Marqo que puede implementar en el proveedor de nube de su elección. La implementación de Kubernetes de Marqo le permite implementar clústeres con réplicas, múltiples fragmentos de almacenamiento y múltiples nodos de inferencia. El repositorio se puede encontrar aquí: https://github.com/marqo-ai/marqo-on-kubernetes
Si está buscando un servicio en la nube totalmente administrado, puede registrarse en Marqo Cloud aquí: https://cloud.marqo.ai.
La documentación completa de Marqo se puede encontrar aquí https://docs.marqo.ai/.
Tenga en cuenta que no debe ejecutar otras aplicaciones en el clúster Vespa de Marqo, ya que Marqo cambia y adapta automáticamente la configuración del clúster.
Marqo es un proyecto comunitario con el objetivo de hacer que la búsqueda tensorial sea accesible para la comunidad de desarrolladores en general. ¡Nos alegra que esté interesado en ayudar! Lea esto para comenzar.
Cree un entorno virtual python -m venv ./venv
.
Active la source ./venv/bin/activate
.
Instale los requisitos desde el archivo de requisitos: pip install -r requirements.txt
.
Ejecute pruebas ejecutando el archivo tox. CD en este directorio y luego ejecute "tox".
Si actualiza las dependencias, asegúrese de eliminar el directorio .tox y volver a ejecutarlo.
Ejecute el conjunto de pruebas completo (utilizando el comando tox
en este directorio).
Cree una solicitud de extracción con un problema de github adjunto.