Бөлісу құралы:


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

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

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

  1. Регистрация для предварительной версии векторного поиска в Azure Cosmos DB для NoSQL
  2. Настройка контейнера Azure Cosmos DB для поиска векторов
  3. Разработка векторной политики внедрения
  4. Добавление векторных индексов в политику индексирования контейнеров
  5. Создание контейнера с векторными индексами и политикой внедрения векторов
  6. Выполнение векторного поиска по сохраненным данным.
  7. В этом руководстве описывается процесс создания векторных данных, индексирования данных и последующего запроса данных в контейнере.

Необходимые компоненты

Регистрация для предварительной версии

Для поиска векторов для Azure Cosmos DB для NoSQL требуется предварительная версия функции. Выполните следующие действия, чтобы зарегистрировать:

  1. Перейдите на страницу ресурсов Azure Cosmos DB для NoSQL.

  2. В меню "Параметры" выберите область "Компоненты".

  3. Выберите "Векторный поиск в Azure Cosmos DB для NoSQL".

  4. Ознакомьтесь с описанием функции, чтобы подтвердить, что вы хотите зарегистрировать в предварительной версии.

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

Примечание.

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

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

Давайте рассмотрим пример создания базы данных для интернет-магазина книг, и вы храните название, автор, ISBN и описание каждой книги. Мы также определим два свойства, которые содержат векторные внедрения. Первым является свойство contentVector, которое содержит вставки текста, созданные из текстового содержимого книги (например, объединение свойств "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)
  • "измерения": длина каждого вектора в пути (по умолчанию 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))