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


Руководство. Использование eventhouse в качестве векторной базы данных

В этом руководстве вы узнаете, как использовать Eventhouse в качестве векторной базы данных для хранения и запроса векторных данных в аналитике в режиме реального времени. Общие сведения о векторных базах данных см. в разделе "Векторные базы данных"

Этот сценарий включает использование семантических поисков на страницах Википедии для поиска страниц с общими темами. Вы используете доступный пример набора данных, который включает векторы для десятков тысяч страниц Википедии. Эти страницы были внедрены с помощью модели OpenAI для создания векторов для каждой страницы. Векторы, а также некоторые соответствующие метаданные, связанные со страницей, затем хранятся в хранилище событий. Этот набор данных можно использовать для поиска страниц, похожих друг на друга, или для поиска страниц, похожих на ту или иную тему, которую вы хотите найти. Например, предположим, что вы хотите найти "известных женщин-ученых 19-го века". Вы кодируете эту фразу с помощью той же модели OpenAI, а затем выполняете поиск по сходству вектора по сохраненным данным страницы Википедии, чтобы найти страницы с наивысшей семантической сходства.

В частности, в этом руководстве вы узнаете:

  • Подготовьте таблицу в хранилище событий с Vector16 кодировкой для векторных столбцов.
  • Храните векторные данные из предварительно внедренного набора данных в хранилище событий.
  • Внедрение запроса естественного языка с помощью модели Open AI.
  • Используйте функцию KQL series_cosine_similarity, чтобы вычислить сходство между вектором внедрения запроса и вики-страницами.
  • Просмотрите строки наивысшего сходства, чтобы получить вики-страницы, наиболее релевантные для поискового запроса.

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

Схема дома событий в качестве рабочего процесса векторной базы данных.

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

  • Рабочая область с емкостью с поддержкой Microsoft Fabric
  • Хранилище событий в рабочей области
  • Ресурс Azure OpenAI с развернутой моделью text-embedding-ada-002 (версия 2). Эта модель в настоящее время доступна только в определенных регионах. Дополнительную информацию см. в разделе Создание ресурса.
    • Убедитесь, что локальная проверка подлинности включена в ресурсе Azure OpenAI.
  • Скачивание примера записной книжки из репозитория GitHub

Примечание.

Хотя в этом руководстве используется Azure OpenAI, вы можете использовать любой поставщик модели внедрения для создания векторов для текстовых данных.

Подготовка среды Eventhouse

На этом шаге установки вы создадите таблицу в хранилище событий с необходимыми столбцами и политиками кодирования для хранения векторных данных.

  1. Перейдите на домашнюю страницу рабочей области в аналитике в режиме реального времени.

  2. Выберите хранилище событий, созданное в предварительных требованиях.

  3. Выберите целевую базу данных, в которой требуется хранить векторные данные. Если у вас нет базы данных, ее можно создать, нажав кнопку "Добавить базу данных".

  4. Выберите "Просмотреть мои данные". Скопируйте и вставьте следующий запрос KQL, чтобы создать таблицу с необходимыми столбцами:

    .create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
    
  5. Скопируйте и вставьте следующие команды, чтобы задать политику кодирования столбцов векторов. Выполните эти команды последовательно.

    .alter column Wiki.title_vector policy encoding type='Vector16'
    
    .alter column Wiki.content_vector policy encoding type='Vector16'
    

Запись векторных данных в хранилище событий

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

Импорт записной книжки

  1. Скачайте пример записной книжки из репозитория GitHub.
  2. Перейдите в среду Fabric. В переключателе интерфейса выберите Fabric, а затем рабочую область.
  3. Выберите записную>книжку с этого компьютера>", а затем выберите записную книжку, скачаемую на предыдущем шаге.
  4. После завершения импорта откройте импортированную записную книжку из рабочей области.

Запись данных в хранилище событий

  1. Запустите ячейки, чтобы настроить среду.

    %%configure -f
    {"conf":
        {
            "spark.rpc.message.maxSize": "1024"
        }
    }
    
    %pip install wget
    
    %pip install openai
    
  2. Запустите ячейки, чтобы скачать предварительно компьютерированные внедрения.

    import wget
    
    embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip"
    
    # The file is ~700 MB so it might take some time
    wget.download(embeddings_url)
    
    import zipfile
    
    with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip","r") as zip_ref:
        zip_ref.extractall("/lakehouse/default/Files/data")
    
    import pandas as pd
    
    from ast import literal_eval
    
    article_df = pd.read_csv('/lakehouse/default/Files/data/vector_database_wikipedia_articles_embedded.csv')
    # Read vectors from strings back into a list
    article_df["title_vector"] = article_df.title_vector.apply(literal_eval)
    article_df["content_vector"] = article_df.content_vector.apply(literal_eval)
    article_df.head()
    
  3. Чтобы записать в хранилище событий, введите универсальный код ресурса (URI) кластера, который можно найти на странице обзора системы и имя базы данных. Таблица создается в записной книжке и далее ссылается на запрос.

    # replace with your Eventhouse Cluster URI, Database name, and Table name
    KUSTO_CLUSTER =  "Eventhouse Cluster URI"
    KUSTO_DATABASE = "Database name"
    KUSTO_TABLE = "Wiki"
    
  4. Запустите оставшиеся ячейки, чтобы записать данные в хранилище событий. Эта операция может занять некоторое время.

    kustoOptions = {"kustoCluster": KUSTO_CLUSTER, "kustoDatabase" :KUSTO_DATABASE, "kustoTable" : KUSTO_TABLE }
    
    access_token=mssparkutils.credentials.getToken(kustoOptions["kustoCluster"])
    
    #Pandas data frame to spark dataframe
    sparkDF=spark.createDataFrame(article_df)
    
    # Write data to a table in Eventhouse
    sparkDF.write. \
    format("com.microsoft.kusto.spark.synapse.datasource"). \
    option("kustoCluster",kustoOptions["kustoCluster"]). \
    option("kustoDatabase",kustoOptions["kustoDatabase"]). \
    option("kustoTable", kustoOptions["kustoTable"]). \
    option("accessToken", access_token). \
    option("tableCreateOptions", "CreateIfNotExist").\
    mode("Append"). \
    save()
    

Просмотр данных в хранилище событий

На этом этапе можно проверить, были ли данные записаны в хранилище событий, перейдя на страницу сведений о базе данных.

  1. Перейдите на домашнюю страницу рабочей области в аналитике в режиме реального времени.
  2. Выберите элемент базы данных, предоставленный в предыдущем разделе. Вы увидите сводку данных, записанных в таблицу Wiki.

Создание внедрения для поискового термина

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

Чтобы успешно выполнить вызов к Azure OpenAI, вам потребуется конечная точка, ключ и идентификатор развертывания.

Имя переменной Значение
конечная точка Это значение можно найти в разделе "Ключи и конечная точка" при изучении ресурса из портал Azure. Кроме того, можно найти значение в Azure AI Foundry> playground > Code View. Пример конечной точки: https://docs-test-001.openai.azure.com/.
Ключ API Это значение можно найти в разделе "Ключи и конечная точка" при изучении ресурса из портал Azure. Вы можете использовать KEY1 или KEY2.
Идентификатор развертывания Это значение можно найти в разделе Развертывания в Azure AI Foundry.

Используйте сведения в таблице при запуске ячеек Azure OpenAI.

Внимание

Для использования ключа API необходимо включить локальную проверку подлинности в ресурсе Azure Open AI.

import openai
openai.api_version = '2022-12-01'
openai.api_base = 'endpoint' # Add your endpoint here
openai.api_type = 'azure'
openai.api_key = 'api key'  # Add your api key here

def embed(query):
  # Creates embedding vector from user query
  embedded_query = openai.Embedding.create(
          input=query,
          deployment_id="deployment id", # Add your deployment id here
          chunk_size=1
  )["data"][0]["embedding"]
  return embedded_query
searchedEmbedding = embed("most difficult gymnastics moves in the olympics")
#print(searchedEmbedding)

Запрос к подобию

Запрос выполняется непосредственно из записной книжки и использует возвращаемое внедрение из предыдущего шага в сравнении со встроенными страницами Википедии, хранящимися в вашем хранилище событий. Этот запрос использует функцию сходства косинуса и возвращает первые 10 самых похожих векторов.

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

kustoQuery = "Wiki | extend similarity = series_cosine_similarity(dynamic("+str(searchedEmbedding)+"), content_vector) | top 10 by similarity desc" 
accessToken = mssparkutils.credentials.getToken(KUSTO_CLUSTER)
kustoDf  = spark.read\
    .format("com.microsoft.kusto.spark.synapse.datasource")\
    .option("accessToken", accessToken)\
    .option("kustoCluster", KUSTO_CLUSTER)\
    .option("kustoDatabase", KUSTO_DATABASE)\
    .option("kustoQuery", kustoQuery).load()

# Example that uses the result data frame.
kustoDf.show()

Снимок экрана: выполнение ячейки результатов сходства.

Очистка ресурсов

После завершения работы с руководством вы можете удалить ресурсы, созданные для предотвращения других затрат. Чтобы удалить ресурсы, выполните следующие действия.

  1. Перейдите на домашнюю страницу рабочей области.
  2. Удалите записную книжку, созданную в этом руководстве.
  3. Удалите хранилище событий или базу данных , используемую в этом руководстве.