教學課程:使用 Eventhouse 作為向量資料庫
在本教學課程中,您將瞭解如何使用 Eventhouse 作為向量資料庫,以即時智慧儲存和查詢向量資料。 如需向量資料庫的一般資訊,請參閱 向量資料庫
指定的案例牽涉到使用維琪百科頁面上的語意搜尋來尋找具有常見主題的頁面。 您使用可用的範例資料集,其中包含數萬個維基百科頁面的向量。 這些頁面內嵌於 OpenAI 模型,以產生每個頁面的向量。 向量,以及與頁面相關的一些相關元資料,然後儲存在 Eventhouse 中。 您可以使用此資料集來尋找彼此相似的頁面,或尋找與您想要尋找之某些主題類似的頁面。 例如,假設您想要查閱“19世紀的著名女科學家”。您可以使用相同的 OpenAI 模型來編碼此片語組,然後在儲存的Wikipedia頁面數據上執行向量相似度搜尋,以尋找具有最高語意相似性的頁面。
具體來說,在本教學課程中,您將:
- 在 Eventhouse 中準備具有
Vector16
向量資料行編碼的資料表。 - 將預先內嵌資料集的向量資料儲存至 Eventhouse。
- 使用 Open AI 模型內嵌自然語言查詢。
- 使用 series_cosine_similarity KQL 函式來計算查詢內嵌向量與Wiki頁面的相似性。
- 檢視最高相似度的資料列,以取得與您的搜尋查詢最相關的Wiki頁面。
此流程可以可視化,如下所示:
必要條件
- 工作區,具有已啟用 Microsoft Fabric 的容量
- 工作區中的事件存放區
- 已部署 text-embedding-ada-002 (第 2 版) 模型的 Azure OpenAI 資源。 此模型目前僅適用於 特定區域。 如需詳細資訊,請參閱建立資源。
- 請確定已在 Azure OpenAI 資源上啟用本機驗證。
- 從 Github 存放庫下載範例 notebook。
注意
雖然本教學課程使用 Azure OpenAI,但您可以使用任何內嵌模型提供者來產生文字資料的向量。
準備您的 Eventhouse 環境
在此設定步驟中,您會在 Eventhouse 中建立資料表,其中包含儲存向量資料的必要資料行和編碼原則。
流覽至即時智慧中的工作區首頁。
選取您在先決條件中建立的 Eventhouse。
選取您要在其中儲存向量資料的目標資料庫。 如果您沒有資料庫,您可以選取 [新增資料庫] 來建立資料庫。
選取 [ 探索我的資料]。 複製/貼上下列 KQL 查詢,以建立具有必要資料行的資料表:
.create table Wiki (id:string,url:string,['title']:string,text:string,title_vector:dynamic,content_vector:dynamic,vector_id:long)
複製/貼上下列命令,以設定向量資料行的編碼原則。 循序執行這些命令。
.alter column Wiki.title_vector policy encoding type='Vector16' .alter column Wiki.content_vector policy encoding type='Vector16'
將向量資料寫入 Eventhouse
下列步驟可用來匯入內嵌維琪百科資料,並將其寫入 Eventhouse:
匯入 Notebook
- 從 Github 存放庫下載範例 notebook。
- 流覽至您的Fabric環境。 在體驗切換器中,選擇 [ 開發 ],然後選擇您的工作區。
- 選取 [從這部計算機>上傳],然後選擇您在上一個步驟中下載的筆記本。
- 匯入完成後,請從您的工作區開啟匯入的筆記本。
將資料寫入 Eventhouse
執行資料格來設定您的環境。
%%configure -f {"conf": { "spark.rpc.message.maxSize": "1024" } }
%pip install wget
%pip install openai
執行資料格以下載預先計算的內嵌。
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()
若要寫入 eventhouse,請輸入您的叢集 URI,您可以在系統概觀頁面上找到,以及資料庫的名稱。 資料表會在筆記本中建立,稍後會在查詢中參考。
# replace with your Eventhouse Cluster URI, Database name, and Table name KUSTO_CLUSTER = "Eventhouse Cluster URI" KUSTO_DATABASE = "Database name" KUSTO_TABLE = "Wiki"
執行其餘的資料格,將資料寫入 Eventhouse。 此作業可能需要一些時間才能執行。
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()
若要在 Eventhouse 中檢視資料
此時,您可以瀏覽至資料庫詳細資料頁面,以確認資料已寫入事件存放區。
- 流覽至即時智慧中的工作區首頁。
- 選取上一節中提供的資料庫項目。 您應該會看到寫入 「Wiki」 資料表的數據摘要。
產生搜尋字詞的內嵌
既然您已將內嵌的Wiki資料儲存在 Eventhouse 中,您可以使用此資料作為特定文章上尋找頁面的參考。 為了進行比較,您可以內嵌搜尋字詞,然後在搜尋字詞與維琪百科頁面之間進行比較。
若要成功對 Azure OpenAI 進行呼叫,您需要一個端點、金鑰和部署 ID。
變數名稱 | 值 |
---|---|
endpoint | 從 Azure 入口網站檢查您的資源時,可以在金鑰與端點區段中找到此值。 或者,您可以在 Azure AI Foundry> Playground > 代碼檢視中找到值。 範例端點為:https://docs-test-001.openai.azure.com/ 。 |
API 金鑰 | 從 Azure 入口網站檢查您的資源時,可以在金鑰與端點區段中找到此值。 您可以使用 KEY1 或 KEY2。 |
部署 ID | 此值可在 azure AI Foundry的 |
執行 Azure OpenAI 資料格時,請使用資料表中的資訊。
重要
您必須在 Azure Open AI 資源上啟用本機驗證,才能使用 API 金鑰。
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)
查詢相似度
查詢會直接從筆記本執行,並使用從上一個步驟傳回的內嵌內嵌,來比較儲存在 eventhouse 中的內嵌維琪百科頁面。 此查詢會 使用餘弦相似度函 式,並傳回前 10 個最相似的向量。
在筆記本中執行資料格,以查看查詢的結果。 您可以變更搜尋字詞並重新執行查詢,以查看不同的結果。 您也可以比較Wiki資料庫中的現有專案,以尋找類似的專案。
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()
清除資源
當您完成本教學課程時,您可以刪除資源,以避免產生其他成本。 若要刪除資源,請依照這些步驟操作:
- 流覽至工作區首頁。
- 刪除您在本教學課程中建立的 Notebook。
- 刪除本教學課程中使用的 Eventhouse 或 資料庫 。