Векторы индексов и запросов в Azure Cosmos DB для NoSQL в Python
Прежде чем использовать индексирование векторов и поиск, необходимо сначала включить эту функцию. В этой статье рассматриваются следующие задачи:
- Включение векторного поиска в Azure Cosmos DB для NoSQL
- Настройка контейнера Azure Cosmos DB для поиска векторов
- Разработка векторной политики внедрения
- Добавление векторных индексов в политику индексирования контейнеров
- Создание контейнера с векторными индексами и политикой внедрения векторов
- Выполнение векторного поиска хранимых данных
В этом руководстве описывается процесс создания векторных данных, индексирования данных и последующего запроса данных в контейнере.
Необходимые компоненты
- Существующая учетная запись Azure Cosmos DB для NoSQL.
- Если у вас нет подписки Azure, попробуйте использовать Azure Cosmos DB для NoSQL бесплатно.
- Если у вас есть подписка Azure, создайте новую учетную запись Azure Cosmos DB для NoSQL.
- Последняя версия пакета SDK для Python для Azure Cosmos DB.
Включение функции
Поиск вектора для Azure Cosmos DB для NoSQL требует включения функции, выполнив следующие действия:
Перейдите на страницу ресурсов Azure Cosmos DB для NoSQL.
В меню "Параметры" выберите область "Компоненты".
Выберите "Векторный поиск в Azure Cosmos DB для NoSQL".
Ознакомьтесь с описанием функции, чтобы подтвердить ее включение.
Выберите "Включить", чтобы включить векторный поиск в Azure Cosmos DB для NoSQL.
Совет
Кроме того, используйте Azure CLI для обновления возможностей учетной записи для поддержки поиска векторов NoSQL.
az cosmosdb update \ --resource-group <resource-group-name> \ --name <account-name> \ --capabilities EnableNoSQLVectorSearch
Примечание.
Запрос на регистрацию будет автоматически утвержден; однако для принятия в силу может потребоваться 15 минут.
Общие сведения о шагах, связанных с векторным поиском
В следующих шагах предполагается, что вы знаете, как настроить учетную запись NoSQL Cosmos DB и создать базу данных. Функция поиска векторов в настоящее время не поддерживается в существующих контейнерах, поэтому необходимо создать новый контейнер и указать политику внедрения вектора на уровне контейнера и политику индексирования векторов во время создания контейнера.
Давайте рассмотрим пример создания базы данных для интернет-магазина книг, и вы храните название, автор, ISBN и описание каждой книги. Мы также определим два свойства, которые содержат векторные внедрения. Первым является свойство contentVector, которое содержит вставки текста, созданные из текстового содержимого книги (например, объединение свойств "author" "isbn" и "description" перед созданием внедрения). Второй — "coverImageVector", который создается на основе изображений обложки книги.
- Создайте и сохраните векторные внедрения для полей, в которых требуется выполнить поиск векторов.
- Укажите пути внедрения вектора в политику внедрения вектора.
- Включите все нужные векторные индексы в политику индексирования для контейнера.
В последующих разделах этой статьи мы рассмотрим приведенную ниже структуру для элементов, хранящихся в нашем контейнере:
{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}
Создание политики внедрения вектора для контейнера
Затем необходимо определить политику вектора контейнера. Эта политика предоставляет сведения, используемые для информирования обработчика запросов Azure Cosmos DB о том, как обрабатывать свойства векторов в системных функциях VectorDistance. Это также сообщает политике индексирования векторов необходимых сведений, следует указать его. Следующие сведения включаются в содержащуюся векторную политику:
- "path": путь свойства, содержащий векторы
- "datatype": тип элементов вектора (по умолчанию Float32)
- "измерения": длина каждого вектора в пути (по умолчанию 1536)
- "distanceFunction": метрика, используемая для вычисления расстояния или сходства (по умолчанию Cosine)
В нашем примере с сведениями о книге векторная политика может выглядеть как пример JSON:
vector_embedding_policy = {
"vectorEmbeddings": [
{
"path": "/coverImageVector",
"dataType": "float32",
"distanceFunction": "dotproduct",
"dimensions": 8
},
{
"path": "/contentVector",
"dataType": "float32",
"distanceFunction": "cosine",
"dimensions": 10
}
]
}
Создание векторного индекса в политике индексирования
После решения путей внедрения векторов необходимо добавить в политику индексирования векторные индексы. В этом примере политика индексирования будет выглядеть примерно так:
indexing_policy = {
"includedPaths": [
{
"path": "/*"
}
],
"excludedPaths": [
{
"path": "/\"_etag\"/?",
"path": "/coverImageVector/*",
"path": "/contentVector/*"
}
],
"vectorIndexes": [
{"path": "/coverImageVector",
"type": "quantizedFlat"
},
{"path": "/contentVector",
"type": "quantizedFlat"
}
]
}
Внимание
Векторный путь, добавленный в раздел "исключенныеPaths" политики индексирования, чтобы обеспечить оптимизированную производительность для вставки. Не добавляя векторный путь к "исключеннымPaths", будет взиматься более высокая плата за единицу запросов и задержку для вставок векторов.
Внимание
В настоящее время поиск векторов в Azure Cosmos DB для NoSQL поддерживается только в новых контейнерах. Необходимо задать как политику вектора контейнера, так и любую политику индексирования векторов во время создания контейнера, так как ее нельзя изменить позже.
Создание контейнера с помощью векторной политики
В настоящее время функция поиска векторов для Azure Cosmos DB для NoSQL поддерживается только в новых контейнерах, поэтому необходимо применить политику вектора во время создания контейнера и ее нельзя изменить позже.
try:
container = db.create_container_if_not_exists(
id=CONTAINER_NAME,
partition_key=PartitionKey(path='/id'),
indexing_policy=indexing_policy,
vector_embedding_policy=vector_embedding_policy)
print('Container with id \'{0}\' created'.format(id))
except exceptions.CosmosHttpResponseError:
raise
Выполнение запроса поиска сходства векторов
Создав контейнер с требуемой политикой векторов и вставив в контейнер векторные данные, можно выполнить векторный поиск с помощью функции системы "Векторное расстояние " в запросе. Предположим, что вы хотите искать книги о рецептах продуктов питания, глядя на описание, сначала необходимо получить внедрения текста запроса. В этом случае может потребоваться создать внедрения для текста запроса — "рецепт еды". После внедрения поискового запроса его можно использовать в функции VectorDistance в векторном поисковом запросе и получить все элементы, похожие на запрос, как показано здесь:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])
Этот запрос извлекает названия книги, а также оценки сходства в отношении запроса. Ниже приведен пример в Python:
query_embedding = [1,2,3,4,5,6,7,8,9,10]
# Query for items
for item in container.query_items(
query='SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)',
parameters=[
{"name": "@embedding", "value": query_embedding}
],
enable_cross_partition_query=True):
print(json.dumps(item, indent=True))