Site | Documentação | Demonstrações | Discurso | Comunidade Slack | Marquês Nuvem
Marqo é mais do que um banco de dados vetorial, é um mecanismo de pesquisa vetorial ponta a ponta para texto e imagens. A geração, o armazenamento e a recuperação de vetores são feitos imediatamente por meio de uma única API. Não há necessidade de trazer seus próprios embeddings.
Por que Marquês?
A similaridade vetorial por si só não é suficiente para a pesquisa vetorial. A pesquisa vetorial requer mais do que um banco de dados vetorial - ela também requer implantação e gerenciamento de aprendizado de máquina (ML), pré-processamento e transformações de entradas, bem como a capacidade de modificar o comportamento de pesquisa sem treinar novamente um modelo. Marqo contém todas essas peças, permitindo que os desenvolvedores incluam pesquisa vetorial em seus aplicativos com o mínimo de esforço. Uma lista completa de recursos pode ser encontrada abaixo.
Por que agrupar a geração de incorporação com a pesquisa vetorial?
Bancos de dados vetoriais são componentes especializados para similaridade vetorial e atendem apenas um componente de um sistema de pesquisa vetorial. Eles são “vetores de entrada - vetores de saída”. Ainda requerem a produção de vetores, gestão dos modelos de ML, orquestração associada e processamento dos inputs. Marqo facilita isso ao ser “entra documentos, sai documentos”. O pré-processamento de texto e imagens, a incorporação do conteúdo, o armazenamento de metadados e a implantação de inferência e armazenamento são feitos por Marqo.
Início rápido
Aqui está um trecho de código para um exemplo mínimo de pesquisa vetorial com Marqo (consulte Primeiros passos):
Marqo requer Docker. Para instalar o Docker, acesse o site oficial do Docker. Certifique-se de que o docker tenha pelo menos 8 GB de memória e 50 GB de armazenamento. Na área de trabalho do Docker, você pode fazer isso clicando no ícone de configurações, depois em recursos e selecionando 8 GB de memória.
Use o docker para executar o 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?"
)
? Incorporações de última geração
⚡ Desempenho
? Documentos que entram, documentos que saem
? Nuvem gerenciada
Marqo está integrado a estruturas populares de IA e processamento de dados, com mais a caminho.
? Palheiro
Haystack é uma estrutura de código aberto para a construção de aplicativos que fazem uso de tecnologia de PNL, como LLMs, modelos de incorporação e muito mais. Essa integração permite que você use o Marqo como seu armazenamento de documentos para pipelines do Haystack, como aumento de recuperação, resposta a perguntas, pesquisa de documentos e muito mais.
? Griptape
O Griptape permite a implantação segura e confiável de agentes baseados em LLM para aplicativos corporativos. O MarqoVectorStoreDriver dá a esses agentes acesso à pesquisa escalonável com seus próprios dados. Essa integração permite que você aproveite modelos de código aberto ou personalizados ajustados por meio do Marqo para fornecer resultados relevantes aos seus LLMs.
?? Langchain
Essa integração permite aproveitar modelos de código aberto ou personalizados por meio de aplicativos Marqo for LangChain com um componente de pesquisa vetorial. A implementação do armazenamento vetorial Marqo pode ser conectada a cadeias existentes, como Retrieval QA e Conversational Retrieval QA.
⋙Hamilton
Essa integração permite aproveitar modelos de código aberto ou personalizados por meio de aplicativos Marqo for Hamilton LLM.
? Início rápido | Crie seu primeiro aplicativo com Marqo em menos de 5 minutos. |
? Marqo para dados de imagem | Construindo pesquisa avançada de imagens com Marqo. |
Marqo para texto | Construindo um banco de dados multilíngue no Marqo. |
? Integrando Marqo com GPT | Tornar o GPT um especialista no assunto usando o Marqo como base de conhecimento. |
? Marqo para IA criativa | Combinando difusão estável com pesquisa semântica para gerar e categorizar 100 mil imagens de cachorro-quente. |
? Marqo e dados de fala | Adicione diarização e transcrição para pré-processar áudio para perguntas e respostas com Marqo e ChatGPT. |
Marqo pela moderação de conteúdo | Construindo pesquisa avançada de imagens com Marqo para localizar e remover conteúdo. |
☁️ Primeiros passos com Marqo Cloud | Veja como configurar e executar o Marqo Cloud desde o primeiro login até a construção de seu primeiro aplicativo com o Marqo |
? Marqo para comércio eletrônico | Este projeto é uma aplicação web com frontend e backend usando Python, Flask, ReactJS e Typescript. O frontend é uma aplicação ReactJS que faz solicitações ao backend que é uma aplicação Flask. O back-end faz solicitações à API da nuvem Marqo. |
? Chatbot Marqo | Neste guia, construiremos um aplicativo de chat bot usando Marqo e a API ChatGPT da OpenAI. Começaremos com uma base de código existente e depois explicaremos como personalizar o comportamento. |
? Características | Principais recursos do Marqo. |
Marqo requer Docker. Para instalar o Docker, acesse o site oficial do Docker. Certifique-se de que o docker tenha pelo menos 8 GB de memória e 50 GB de armazenamento.
Use o docker para executar o Marqo:
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -p 8882:8882 marqoai/marqo:latest
Nota: Se o seu contêiner marqo
continuar sendo interrompido, isso provavelmente se deve à falta de memória alocada para o Docker. Aumentar o limite de memória do Docker para pelo menos 6 GB (8 GB recomendado) nas configurações do Docker pode resolver o 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
é o cliente que encapsula a API marqo
.create_index()
cria um novo índice com configurações padrão. Você tem a opção de especificar qual modelo usar. Por exemplo, mq.create_index("my-first-index", model="hf/all_datasets_v4_MiniLM-L6")
criará um índice com o modelo de texto padrão hf/all_datasets_v4_MiniLM-L6
. Freqüentemente, é necessária a experimentação com diferentes modelos para obter a melhor recuperação para seu caso de uso específico. Diferentes modelos também oferecem uma compensação entre velocidade de inferência e relevância. Veja aqui a lista completa de modelos.add_documents()
pega uma lista de documentos, representados como dictos python para indexação. tensor_fields
refere-se aos campos que serão indexados como coleções de vetores e tornados pesquisáveis._id
. Caso contrário, o Marqo irá gerar um.Vamos dar uma olhada nos 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
é o número máximo de ocorrências a serem retornadas. Isso pode ser definido como parâmetro durante a pesquisa._highlights
. Esta foi a parte do documento que melhor correspondeu à consulta. Recuperar um documento por ID.
result = mq . index ( "my-first-index" ). get_document ( document_id = "article_591" )
Observe que adicionar o documento usando add_documents
novamente usando o mesmo _id
fará com que o documento seja atualizado.
Obtenha informações sobre um índice.
results = mq . index ( "my-first-index" ). get_stats ()
Faça uma pesquisa por palavra-chave.
result = mq . index ( "my-first-index" ). search ( 'marco polo' , search_method = marqo . SearchMethods . LEXICAL )
Para potencializar a pesquisa de imagens e texto, o Marqo permite que os usuários conectem e usem modelos CLIP do HuggingFace. Observe que se você não configurar a pesquisa multimodal, os URLs das imagens serão tratados como strings. Para iniciar a indexação e busca com imagens, primeiro crie um índice com configuração CLIP, conforme abaixo:
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 )
As imagens podem então ser adicionadas aos documentos da seguinte maneira. Você pode usar URLs da internet (por exemplo S3) ou do disco da 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" ])
Você pode então pesquisar o campo da imagem usando texto.
results = mq . index ( "my-multimodal-index" ). search ( 'animal' )
A pesquisa usando uma imagem pode ser feita fornecendo o link da imagem.
results = mq . index ( "my-multimodal-index" ). search ( 'https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_statue.png' )
As consultas também podem ser fornecidas como dicionários onde cada chave é uma consulta e seus valores correspondentes são pesos. Isso permite consultas mais avançadas que consistem em vários componentes com ponderações a favor ou contra eles. As consultas podem ter negações por meio de ponderação negativa.
O exemplo abaixo mostra a aplicação disso a um cenário onde um usuário pode querer fazer uma pergunta, mas também negar resultados que correspondam a um determinado critério 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 permite ter índices com campos de combinação multimodal. Os campos de combinação multimodal podem combinar texto e imagens em um campo. Isso permite a pontuação de documentos nos campos combinados de texto e imagem. Ele também permite uma representação vetorial única em vez de precisar de muitas, o que economiza armazenamento. O peso relativo de cada componente pode ser definido por documento.
O exemplo abaixo demonstra isso com a recuperação de pares de legenda e imagem usando vários 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 )
Exclua documentos.
results = mq . index ( "my-first-index" ). delete_documents ( ids = [ "article_591" , "article_602" ])
Exclua um índice.
results = mq . index ( "my-first-index" ). delete ()
Oferecemos suporte a modelos Kubernetes para Marqo que você pode implantar em um provedor de nuvem de sua escolha. A implementação do Kubernetes do Marqo permite implantar clusters com réplicas, vários fragmentos de armazenamento e vários nós de inferência. O repositório pode ser encontrado aqui: https://github.com/marqo-ai/marqo-on-kubernetes
Se você procura um serviço de nuvem totalmente gerenciado, pode se inscrever no Marqo Cloud aqui: https://cloud.marqo.ai.
A documentação completa do Marqo pode ser encontrada aqui https://docs.marqo.ai/.
Observe que você não deve executar outros aplicativos no cluster Vespa do Marqo, pois o Marqo altera e adapta automaticamente as configurações do cluster.
Marqo é um projeto comunitário com o objetivo de tornar a pesquisa de tensores acessível à comunidade mais ampla de desenvolvedores. Ficamos felizes que você esteja interessado em ajudar! Por favor, leia isto para começar.
Crie um ambiente virtual python -m venv ./venv
.
Ative a source ./venv/bin/activate
.
Instale os requisitos do arquivo de requisitos: pip install -r requirements.txt
.
Execute testes executando o arquivo tox. CD neste diretório e execute "tox".
Se você atualizar as dependências, certifique-se de excluir o diretório .tox e executar novamente.
Execute o conjunto de testes completo (usando o comando tox
neste diretório).
Crie uma solicitação pull com um problema do GitHub anexado.