Tensor search for humans.
Пошукова система тензором з відкритим кодом, яка легко інтегрується з вашими програмами, веб-сайтами та робочим процесом.
Marqo хмара ☁️ на даний момент в бета-версії. Якщо ви зацікавлені, зверніться сюди.
Тензорний пошук (tensor search) передбачає перетворення документів, зображень та інших данних в набір векторів, що називаються "тензори". Представлення данних у вигляді тензорів дозволяє нам зіставити запити з документами з людиноподібним розумінням цього запиту і змісту документа. Тензорний пошук може бути сильним рішенням у багатьох випадках користування, наприклад:
- пошук і рекомендації кінцевого користувача
- мультимодальний пошук (картинка до картинки, текст до картинки, картинка до тексту)
- чат боти і системи запитань та відповідей
- класифікація тексту та зображення
- Marqo потребує docker. Для встановлення Docker перейдіть до Docker Official website.
- Використовуйте docker для запуску Marqo (Користувачам Мас з чіпом серії М потрібно буде перейти сюди):
docker rm -f marqo;
docker pull marqoai/marqo:latest;
docker run --name marqo -it --privileged -p 8882:8882 --add-host host.docker.internal:host-gateway marqoai/marqo:latest
- Встановіть клієнт Marqo:
pip install marqo
- Почніть індексування та пошук! Розгляньмо простий приклад нижче:
import marqo
mq = marqo.Client(url='http://localhost:8882')
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"
}]
)
results = mq.index("my-first-index").search(
q="What is the best outfit to wear on the moon?"
)
mq
це клієнт, що обгортаєmarqo
APIadd_documents()
приймає список документів, представлених як словники python, для індексуванняadd_documents()
створює індекс зі стандартними налаштуваннями, якщо такого не існує- За бажання, ви можете встановити ID документа за допомогою спеціального
_id
поля. Інакше, Marqo згенерує такий - Якщо індекс не існує, Marqo створить його. Якщо він існує, то 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
. Це частина документа, яка найкраще збігалася з запитом
Отримати документ за ID.
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)
Використовуючи стандартний метод тензорного пошуку
result = mq.index("my-first-index").search('adventure', searchable_attributes=['Title'])
Видалити документи.
results = mq.index("my-first-index").delete_documents(ids=["article_591", "article_602"])
Видалити індекс.
results = mq.index("my-first-index").delete()
Для підсилення пошуку зображень та тексту, Marqo дозволяє користувачам підключати та працювати з CLIP моделями від HuggingFace. Зверніть увагу, якщо ви не налаштуєте мультимодальний пошук, адреси зображень будуть розглядатися як рядки. Для початку індексування та пошуку з зображеннями, спершу створіть індекс з конфігурацією 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)
Зображення потім можуть бути додані до документу в такий спосіб. Ви можете використати посилання з інтернету (наприклад S3) або з диску комп'ютера:
response = mq.index("my-multimodal-index").add_documents([{
"My Image": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Portrait_Hippopotamus_in_the_water.jpg/440px-Portrait_Hippopotamus_in_the_water.jpg",
"Description": "The hippopotamus, also called the common hippopotamus or river hippopotamus, is a large semiaquatic mammal native to sub-Saharan Africa",
"_id": "hippo-facts"
}])
Після цього ви можете виконувати пошук за текстом як зазвичай. Пошук буде здійснюватися як по тексту, так і по картинкам:
results = mq.index("my-multimodal-index").search('animal')
Встановлення searchable_attributes
для поля зображення ['My Image']
гарантує пошук лише зображень у цьому індексі:
results = mq.index("my-multimodal-index").search('animal', searchable_attributes=['My Image'])
Пошук за зображенням можна виконати, використовуючи посилання на зображення.
results = mq.index("my-multimodal-index").search('https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Standing_Hippopotamus_MET_DP248993.jpg/440px-Standing_Hippopotamus_MET_DP248993.jpg')
Повну документацію Marqo можна знайти тут https://marqo.pages.dev/.
Зверніть увагу, що вам не слід запускати інші програми на кластері Marqo's Opensearch, оскільки Marqo автоматично змінює та адаптує налаштування на кластері.
Marqo ще не підтримує docker-in-docker бекенд конфігурацію для архітектури arm64. Це означає, якщо ви використовуєте Mac серії M, вам також знадобиться запустити marqo's бекенд, marqo-os, локально.
Для запуску Marqo на Mac серії M, виконайте наступні кроки.
- В одному терміналі запустіть наступну команду для початку opensearch:
docker rm -f marqo-os; docker run -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" marqoai/marqo-os:0.0.3-arm
- В іншому терміналі запустіть наступну команду для запуску Marqo:
docker rm -f marqo; docker run --name marqo --privileged \
-p 8882:8882 --add-host host.docker.internal:host-gateway \
-e "OPENSEARCH_URL=https://localhost:9200" \
marqoai/marqo:latest
Marqo - це ком'юніті проект, метою якого є розповсюдити тензорний пошук для ширшої спільноти розробників. Ми раді, що ви зацікавлені у допомозі! Будь ласка, прочитайте це для початку
- Створити віртуальне середовище
python -m venv ./venv
- Активувати віртуальне середовище
source ./venv/bin/activate
- Встановити пакети з файлу:
pip install -r requirements.txt
- Виконати тести запустивши файл tox. CD до цієї папки, потім запустити "tox"
- Якщо ви оновлюєте залежності, переконайтесь, що видалили папку .tox та перезапустіть
- Запустити повний набір тестів (використовуючи команду
tox
в цій папці). - Створіть pull request з прикріпленим github issue.
- Приєднайтесь до нашого Slack community та спілкуйтесь з іншими учасниками спільноти щодо ідей.
- Зустрічі спільноти Marqo (скоро буде!)
Це readme доступно в наступних перекладах:
- English🇬🇧
- 中文 Chinese🇨🇳
- Polski🇵🇱
- Українська🇺🇦
- Français🇫🇷