Поделиться через


Векторы индексов и запросов в Azure Cosmos DB для NoSQL в Python

В этой статье описывается процесс создания векторных данных, индексирования данных и последующего запроса данных в контейнере.

Прежде чем использовать индексирование и поиск векторов, необходимо сначала включить векторный поиск в Azure Cosmos DB для NoSQL. После настройки контейнера Azure Cosmos DB для поиска векторов создайте политику внедрения векторов. Затем вы добавите векторные индексы в политику индексирования контейнеров. Затем вы создадите контейнер с векторными индексами и политикой внедрения векторов. Наконец, выполняется векторный поиск хранимых данных.

Предварительные условия

Включение функции

Чтобы включить векторный поиск Azure Cosmos DB для NoSQL, выполните следующие действия.

  1. Перейдите на страницу ресурсов Azure Cosmos DB для NoSQL.
  2. На левой панели в разделе "Параметры" выберите "Компоненты".
  3. Выберите векторный поиск в Azure Cosmos DB для NoSQL.
  4. Ознакомьтесь с описанием функции, чтобы убедиться, что вы хотите включить ее.
  5. Выберите "Включить", чтобы включить векторный поиск в Azure Cosmos DB для NoSQL.

Совет

Кроме того, используйте Azure CLI, чтобы обновить возможности учетной записи для поддержки векторного поиска в Azure Cosmos DB для NoSQL.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

Запрос на регистрацию автоматически одобряется, но на это может уйти 15 минут.

В следующих шагах предполагается, что вы знаете, как настроить учетную запись Azure Cosmos DB для NoSQL и создать базу данных. Функция поиска векторов в настоящее время не поддерживается в существующих контейнерах. Необходимо создать новый контейнер. При создании контейнера необходимо указать политику внедрения вектора на уровне контейнера и политику индексирования векторов.

Давайте рассмотрим пример создания базы данных для интернет-магазина книг. Вы хотите сохранить название, автор, ISBN и описание каждой книги. Кроме того, необходимо определить следующие два свойства, чтобы содержать векторные внедрения:

  • Свойство contentVector содержит вставки текста , созданные из текстового содержимого книги. Например, вы объединяете title, author, isbn свойства и description свойства перед созданием встраивания.
  • Свойство coverImageVector генерируется из изображений обложки книги.

Чтобы выполнить векторный поиск, выполните следующие действия.

  1. Создайте и сохраните векторные внедрения для полей, в которых требуется выполнить поиск векторов.
  2. Укажите пути встраивания вектора в политику встраивания вектора.
  3. Включите все векторные индексы, которые требуется в политике индексирования для контейнера.

Для последующих разделов этой статьи рассмотрим следующую структуру для элементов, хранящихся в контейнере:

{
  "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.)
dimensions Длина каждого вектора в пути. (Значение по умолчанию — 1536.)
distanceFunction Метрика, используемая для вычисления расстояния или сходства. (Значение по умолчанию — Cosine.)

В примере с сведениями о книге политика вектора может выглядеть следующим образом:

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" 
        } 
    ] 
} 

Внимание

Векторный путь добавляется в excludedPaths раздел политики индексирования, чтобы оптимизировать производительность при вставке. Не добавление пути вектора в excludedPaths приводит к увеличению платы за единицу запроса и задержке при вставке векторов.

В настоящее время поиск векторов в 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 в запросе для проведения векторного поиска.

Предположим, вы хотите искать книги о рецептах пищи, глядя на описание. Сначала необходимо получить встраивание текста запроса. В этом случае может потребоваться создать внедрения для текста food recipeзапроса. После получения встраивания для вашего поискового запроса, его можно использовать в функции 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))