Веб-сайт | Документация | Демо | Дискурс | Slack-сообщество | Марко Клауд
Marqo — это больше, чем векторная база данных, это комплексная векторная поисковая система для текста и изображений. Генерация, хранение и извлечение векторов выполняются «из коробки» через единый API. Не нужно приносить свои вложения.
Почему Марко?
Одного сходства векторов недостаточно для векторного поиска. Для векторного поиска требуется нечто большее, чем просто база данных векторов: он также требует развертывания и управления машинным обучением (ML), предварительной обработки и преобразования входных данных, а также возможности изменять поведение поиска без переобучения модели. Marqo содержит все эти элементы, что позволяет разработчикам с минимальными усилиями встраивать векторный поиск в свои приложения. Полный список функций можно найти ниже.
Зачем объединять генерацию встраивания с векторным поиском?
Базы данных векторов представляют собой специализированные компоненты для определения сходства векторов и обслуживают только один компонент системы поиска векторов. Это «входящие векторы – исходящие векторы». Им по-прежнему требуется создание векторов, управление моделями машинного обучения, соответствующая оркестровка и обработка входных данных. Marqo упрощает эту задачу, предлагая «документы на входе и на выходе». Предварительная обработка текста и изображений, встраивание контента, хранение метаданных, а также развертывание логических выводов и хранилищ — все это берет на себя Marqo.
Быстрый старт
Вот фрагмент кода для минимального примера векторного поиска с помощью Marqo (см. «Начало работы»):
Marqo требует Docker. Чтобы установить Docker, перейдите на официальный сайт Docker. Убедитесь, что в докере имеется не менее 8 ГБ памяти и 50 ГБ встроенной памяти. На рабочем столе Docker это можно сделать, щелкнув значок настроек, затем ресурсы и выбрав 8 ГБ памяти.
Используйте Docker для запуска 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?"
)
? Современные вставки
⚡ Производительность
? Документы в документах на выходе
? Управляемое облако
Marqo интегрирован в популярные платформы искусственного интеллекта и обработки данных, и в ближайшее время их станет еще больше.
? стог сена
Haystack — это платформа с открытым исходным кодом для создания приложений, использующих технологию НЛП, таких как LLM, встраивание моделей и многое другое. Эта интеграция позволяет вам использовать Marqo в качестве хранилища документов для конвейеров Haystack, таких как поиск и расширение, ответы на вопросы, поиск документов и многое другое.
? Гриптейп
Griptape обеспечивает безопасное и надежное развертывание агентов на основе LLM для корпоративных приложений, а MarqoVectorStoreDriver предоставляет этим агентам доступ к масштабируемому поиску по вашим собственным данным. Эта интеграция позволяет вам использовать модели с открытым исходным кодом или специально настроенные модели через Marqo для предоставления релевантных результатов вашим LLM.
?? Лангчейн
Эта интеграция позволяет использовать модели с открытым исходным кодом или пользовательские точно настроенные модели через Marqo для приложений LangChain с компонентом векторного поиска. Реализация векторного хранилища Marqo может подключаться к существующим цепочкам, таким как контроль качества поиска и контроль качества диалогового поиска.
⋙ Гамильтон
Эта интеграция позволяет использовать модели с открытым исходным кодом или специально настроенные модели с помощью приложений Marqo for Hamilton LLM.
? Быстрый старт | Создайте свое первое приложение с помощью Marqo менее чем за 5 минут. |
? Марко для данных изображения | Создание расширенного поиска изображений с помощью Marqo. |
Марко для текста | Создание многоязычной базы данных в Marqo. |
? Интеграция Marqo с GPT | Превратите GPT в эксперта в предметной области, используя Marqo в качестве базы знаний. |
? Марко для творческого искусственного интеллекта | Сочетание стабильной диффузии с семантическим поиском для создания и классификации 100 тысяч изображений хот-догов. |
? Марко и речевые данные | Добавьте диаризацию и транскрипцию для предварительной обработки аудио для вопросов и ответов с помощью Marqo и ChatGPT. |
Марко за модерацию контента | Создание расширенного поиска изображений с помощью Marqo для поиска и удаления контента. |
☁️ Начало работы с Marqo Cloud | Узнайте, как настроить и запустить Marqo Cloud, начиная с первого входа в систему и заканчивая созданием первого приложения с помощью Marqo. |
? Марко для электронной коммерции | Этот проект представляет собой веб-приложение с интерфейсом и серверной частью, использующее Python, Flask, ReactJS и Typescript. Интерфейс — это приложение ReactJS, которое отправляет запросы на серверную часть, которая является приложением Flask. Серверная часть отправляет запросы к вашему облачному API Marqo. |
? Чат-бот Марко | В этом руководстве мы создадим приложение чат-бота, используя Marqo и API ChatGPT OpenAI. Мы начнем с существующей базы кода, а затем рассмотрим, как настроить поведение. |
? Функции | Основные возможности Marqo. |
Marqo требует Docker. Чтобы установить Docker, перейдите на официальный сайт Docker. Убедитесь, что в докере имеется не менее 8 ГБ памяти и 50 ГБ встроенной памяти.
Используйте Docker для запуска Marqo:
docker rm -f marqo
docker pull marqoai/marqo:latest
docker run --name marqo -p 8882:8882 marqoai/marqo:latest
Примечание. Если ваш контейнер marqo
продолжает отключаться, скорее всего, это связано с нехваткой памяти, выделенной для Docker. Увеличение лимита памяти для Docker как минимум до 6 ГБ (рекомендуется 8 ГБ) в настройках Docker может решить проблему.
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
— это клиент, который является оболочкой API marqo
.create_index()
создает новый индекс с настройками по умолчанию. У вас есть возможность указать, какую модель использовать. Например, mq.create_index("my-first-index", model="hf/all_datasets_v4_MiniLM-L6")
создаст индекс с текстовой моделью по умолчанию hf/all_datasets_v4_MiniLM-L6
. Часто требуется экспериментировать с различными моделями, чтобы добиться наилучшего результата для вашего конкретного случая использования. Различные модели также предлагают компромисс между скоростью вывода и релевантностью. Полный список моделей смотрите здесь.add_documents()
принимает список документов, представленных в виде диктовок Python, для индексации. tensor_fields
относится к полям, которые будут индексироваться как векторные коллекции и станут доступными для поиска._id
. В противном случае Marqo сгенерирует его.Давайте посмотрим на результаты:
# 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
— максимальное количество возвращаемых совпадений. Это можно установить в качестве параметра во время поиска._highlights
. Это была часть документа, которая лучше всего соответствовала запросу. Получить документ по идентификатору.
result = mq . index ( "my-first-index" ). get_document ( document_id = "article_591" )
Обратите внимание: повторное добавление документа с помощью add_documents
с тем же _id
приведет к обновлению документа.
Получить информацию об индексе.
results = mq . index ( "my-first-index" ). get_stats ()
Выполните поиск по ключевым словам.
result = mq . index ( "my-first-index" ). search ( 'marco polo' , search_method = marqo . SearchMethods . LEXICAL )
Для обеспечения поиска изображений и текста Marqo позволяет пользователям подключать и играть с моделями CLIP от HuggingFace. Обратите внимание: если вы не настроите мультимодальный поиск, URL-адреса изображений будут обрабатываться как строки. Чтобы начать индексирование и поиск по изображениям, сначала создайте индекс с конфигурацией CLIP, как показано ниже:
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 )
Затем изображения можно добавлять в документы следующим образом. Вы можете использовать URL-адреса из Интернета (например, S3) или с диска машины:
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" ])
Затем вы можете выполнить поиск по полю изображения, используя текст.
results = mq . index ( "my-multimodal-index" ). search ( 'animal' )
Поиск по изображению можно осуществить, предоставив ссылку на изображение.
results = mq . index ( "my-multimodal-index" ). search ( 'https://raw.githubusercontent.com/marqo-ai/marqo-api-tests/mainline/assets/ai_hippo_statue.png' )
Запросы также могут быть предоставлены в виде словарей, где каждый ключ является запросом, а соответствующие значения — весами. Это позволяет создавать более сложные запросы, состоящие из нескольких компонентов с весами в их сторону или против них. Запросы могут иметь отрицательные значения за счет отрицательного веса.
В приведенном ниже примере показано применение этого к сценарию, когда пользователь может захотеть задать вопрос, но также отклонить результаты, соответствующие определенному семантическому критерию.
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 позволяет создавать индексы с мультимодальными комбинированными полями. Поля мультимодальной комбинации могут объединять текст и изображения в одно поле. Это позволяет оценивать документы по комбинированным полям текста и изображения. Это также позволяет использовать одно векторное представление вместо необходимости использования многих, что экономит место для хранения. Относительный вес каждого компонента можно установить для каждого документа.
Пример ниже демонстрирует это с получением пар подписи и изображения с использованием нескольких типов запросов.
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 )
Удалить документы.
results = mq . index ( "my-first-index" ). delete_documents ( ids = [ "article_591" , "article_602" ])
Удалить индекс.
results = mq . index ( "my-first-index" ). delete ()
Мы поддерживаем шаблоны Kubernetes для Marqo, которые вы можете развернуть у любого облачного провайдера по вашему выбору. Реализация Kubernetes от Marqo позволяет развертывать кластеры с репликами, несколькими сегментами хранилища и несколькими узлами вывода. Репозиторий можно найти здесь: https://github.com/marqo-ai/marqo-on-kubernetes.
Если вы ищете полностью управляемый облачный сервис, вы можете зарегистрироваться в Marqo Cloud здесь: https://cloud.marqo.ai.
Полную документацию по Marqo можно найти здесь https://docs.marqo.ai/.
Обратите внимание, что вам не следует запускать другие приложения в кластере Vespa Marqo, поскольку Marqo автоматически изменяет и адаптирует настройки кластера.
Marqo — это проект сообщества, цель которого сделать тензорный поиск доступным для более широкого сообщества разработчиков. Мы рады, что вы заинтересованы в помощи! Пожалуйста, прочитайте это, чтобы начать.
Создайте виртуальную среду python -m venv ./venv
.
Активируйте source ./venv/bin/activate
.
Установите требования из файла требований: pip install -r requirements.txt
.
Запустите тесты, запустив tox-файл. CD в этот каталог, а затем запустите «tox».
Если вы обновляете зависимости, обязательно удалите каталог .tox и повторите запуск.
Запустите полный набор тестов (используя команду tox
в этом каталоге).
Создайте запрос на включение с прикрепленной проблемой GitHub.