Европейский союз сталкивается со своеобразной проблемой — у него 24 официальных языка в 27 странах, и эти страны должны соблюдать законы ЕС. Перед экспертами в области права ЕС стоит сложная задача навигации по юридическим материалам на нескольких языках.
Что, если бы существовала система, в которой пользователь (например, юрист) мог бы искать в базе данных документы на предпочитаемом им языке и находить наиболее подходящий документ на другом языке? Что, если этот пользователь захочет предоставить доступ к этой базе данных коллеге, который говорит на другом языке?
В этой статье мы представляем решение, которое может выполнять поиск на нескольких языках с помощью многоязычной юридической базы данных, созданной с помощью Marqo, тензорный поисковик с открытым исходным кодом всего в 5 ключевых строках кода.
Набор данных
Набор данных MultiEURLEX представляет собой набор из 65 тысяч законов на 23 языках ЕС. Законы ЕС публикуются на всех языках-членах. Это означает, что мы можем встретить один и тот же закон на нескольких языках.
Область применения этого доказательства концепции
В интересах экономии времени и для простоты тиражирования эта экспериментальная версия будет представлять собой базу данных для хранения документов на двух языках: немецком и английском. Мы также будем использовать только разделы проверки набора данных с 5000 документами на каждом языке. Обратите внимание, что модель машинного обучения, которую будет использовать Marqo, stsb-xlm-r-multilingual (подробнее об этой модели можно найти здесь и здесь), может обрабатывать гораздо больше языков, чем просто эти двое".
Решение было запущено на компьютере AWS ml.g4dn.2xlarge. Это идет с графическим процессором Nvidia T4. Графический процессор ускоряет модель машинного обучения Marqo, которая обрабатывает наши документы по мере их вставки. Эти машины AWS очень легко настроить как экземпляры SageMaker Jupyter Notebook.
Решение
Если бы мы разработали это для традиционной базы данных SQL или поисковой системы, нам пришлось бы вручную создавать уровень перевода для обработки запросов и связывать каждый документ с переводами, созданными вручную или сгенерированными машиной.
Примером этого может быть перевод всех документов на английский язык по мере их хранения. Поисковый запрос также будет переведен на английский язык, а поиск по ключевым словам будет выполняться с использованием такой технологии, как Elasticsearch. Однако это проблематично, поскольку переведенное предложение представляет собой приближение к исходному языку с потерями и вводит в систему значительный компонент (перевод в реальном времени). Это приводит к снижению релевантности поиска, большей задержке и дополнительной сложности системы.
Тензорный поиск, технология, на которой работает Marqo, превосходит традиционные методы поиска по ключевым словам.
Во-первых, мы настраиваем экземпляр Marqo на машине, на которой установлен докер. Обратите внимание на опцию --gpus all
. Это позволяет Marqo использовать графические процессоры, которые он находит на машине. Если на используемом вами компьютере нет графических процессоров, удалите этот параметр из команды.
docker rm -f marqo; docker run — name marqo -it —-privileged -p 8882:8882 --gpus all \ —-add-host host.docker.internal:host-gateway marqoai/marqo:0.0.3
Мы используем pip для установки клиента Marqo (pip install marqo
) и пакета Python для наборов данных (pip install datasets
). Мы будем использовать пакет datasets
из Hugging Face для импорта набора данных MultiEURLEX.
Затем мы начинаем работу над нашим скриптом Python. Начнем с загрузки разделов проверки для наборов данных английского и немецкого языков:
from datasets import load_dataset dataset_en = load_dataset(‘multi_eurlex’, ‘en’, split=”validation”) dataset_de = load_dataset(‘multi_eurlex’, ‘de’, split=”validation”)
Затем мы импортируем Marqo и настраиваем клиент. Мы говорим клиенту Marqo подключиться к контейнеру Marqo Docker, который мы запускали ранее.
from marqo import Client mq = Client(“http://localhost:8882")
Затем добавьте строку, сообщающую Marqo о создании многоязычного указателя:
mq.create_index(index_name=’my-multilingual-index’, model=’stsb-xlm-r-multilingual’)
Обратите внимание, здесь мы говорим Марко, какую модель использовать. После этого мы пройдемся по каждому набору данных, индексируя каждый документ по мере продвижения.
Одно небольшое изменение, которое мы внесем, — это разделение текста очень длинных документов (более 100 000 символов), чтобы упростить индексацию и поиск.
В конце каждого цикла мы вызываем функцию add_documents()
для вставки документа:
mq.index(index_name="my-multilingual-index").add_documents( device="cuda", auto_refresh=False, documents=[{ "_id": doc_id, "language": lang, "text": sub_doc, "celex_id": doc["celex_id"], "labels": str(doc["labels"]) }] )
Здесь мы устанавливаем аргумент устройства как "cuda"
. Это говорит Marqo использовать GPU, который он находит на машине, для индексации документа. Если у вас нет графического процессора, удалите этот аргумент или установите для него значение "cpu"
. Мы рекомендуем использовать графический процессор, так как он значительно ускорит процесс add_documents
(наши тесты показали ускорение в 6–12 раз).
Мы также устанавливаем аргумент auto_refresh
равным False
. При индексировании больших объемов данных рекомендуется установить значение False
, так как это оптимизирует процесс индексирования.
И это процесс индексации! Запустите скрипт, чтобы заполнить индекс Marqo документами. На машине AWS ml.g4dn.2xlarge у нас ушло около 45 минут.
Поиск по индексу
Мы определим следующую функцию поиска, которая устанавливает некоторые параметры для вызова Marqo:
# pprint is an inbuilt python formatter package that prints data in a readable way import pprint def search(query: str): result = mq.index(’my-multilingual-index’).search( q=query, searchable_attributes=[“text”] ) for res in result[“hits”]: pprint.pprint(res[“_highlights”])
Первое, на что следует обратить внимание, это вызов функции Marqo search()
. Мы устанавливаем searchable_attribues
в поле "text"
. Это связано с тем, что это поле содержит контент, релевантный для поиска.
Мы могли бы сразу распечатать результат, но он содержит полные исходные документы. Они могут быть огромными. Вместо этого мы просто распечатаем основные моменты из каждого документа. Эти выделения также показывают нам, какую часть документа Марко считает наиболее релевантной поисковому запросу. Мы делаем это, печатая атрибут _highlights
для каждого попадания.
Мы ищем, передавая строковый запрос в функцию поиска. Для поиска со строкой запроса:
«Законы о рыболовстве»
Мы получаем следующие результаты в качестве основных 2 основных моментов:
{‘text’: ‘Consequently, catch limits and fishing effort limits for the cod stocks in the Baltic Sea should be established in accordance with the rules laid down in Council Regulation (EC) No 1098/2007 of 18 ‘… {‘text’: ‘(18)’ ‘Bei der Nutzung der Fangmöglichkeiten ist geltendes Unionsrecht uneingeschränkt zu befolgen -’ ‘HAT FOLGENDE VERORDNUNG ERLASSEN:’ ‘TITEL I’ ‘GELTUNGSBEREICH UND BEGRIFFSBESTIMMUNGEN’ ‘Artikel 1’…
Второй результат взят из немецкого документа. С помощью Google Translate первая строка немецкого документа переводится как
«При использовании возможностей рыболовства необходимо строго соблюдать действующее законодательство Союза»
Использование Google Translate для перевода исходной строки запроса закона о рыболовстве на немецкий язык дает нам:
«Образование для рыбной промышленности»
Поиск с этой строкой дает нам результаты, аналогичные английской версии запроса. Первый результат — документ на английском языке с тем же выделением, что и запрос на английском языке. Marqo идентифицирует обе строки запросов как имеющие одинаковое значение.
Поскольку мы добавили код языка в качестве свойства каждого документа, мы можем фильтровать определенные языки. Добавляем в поисковый запрос строку фильтра:
mq.index(index_name=’my-multilingual-index’).search( q=query, searchable_attributes=[‘text’], filter_string=’language:en’ )
Поиск с использованием этого фильтра по запросу «Gesetze über saubere Energie» (перевод Google «Законы о чистой энергии») дает результаты только на английском языке. Первые 3 результата:
Потребление электроэнергии и воды продуктами, подпадающими под действие настоящего Регламента, следует сделать более эффективным за счет применения существующих…
Продукты, подпадающие под действие настоящего Регламента, следует сделать более энергоэффективными за счет применения существующих непатентованных экономичных…
Потребление электроэнергии продуктами, подпадающими под действие настоящего Регламента, следует сделать более эффективным за счет применения существующих незапатентованных рентабельных технологий, которые могут снизить совокупные затраты на приобретение и эксплуатацию этих продуктов…
Заключение
Marqo — это тензорная поисковая система, которую можно развернуть всего в 3 строки кода и решать задачи поиска с использованием новейших моделей машинного обучения от HuggingFace и OpenAI. В этой статье я показал, как я использовал Marqo для быстрой настройки многоязычной юридической базы данных.
Marqo упрощает тензорный поиск. Не нужно быть экспертом по машинному обучению, вы можете использовать передовые модели машинного обучения, чтобы создать непревзойденный поиск с минимальным кодом. Ознакомьтесь с полным кодом демо здесь. Ознакомьтесь (и внесите свой вклад, если можете!) в нашу базу исходного кода здесь.