跳至主要內容

Xata

Xata 是一個基於 PostgreSQL 的無伺服器資料平台。 它提供一個 Python SDK 用於與資料庫互動,以及一個 UI 用於管理您的資料。 Xata 具有原生向量類型,可以添加到任何表格,並支援相似性搜尋。 LangChain 直接將向量插入 Xata,並查詢給定向量的最近鄰,以便您可以使用所有 LangChain Embeddings 與 Xata 的整合。

本筆記本指導您如何使用 Xata 作為 VectorStore。

設定

建立一個資料庫以用作向量儲存

Xata UI 中建立一個新的資料庫。 您可以隨意命名,在本筆記本中我們將使用 langchain。 建立一個表格,您也可以隨意命名,但我們將使用 vectors。 透過 UI 新增以下欄位

  • 類型為 "Text" 的 content。 這用於儲存 Document.pageContent 值。
  • 類型為 "Vector" 的 embedding。 使用您計劃使用的模型所使用的維度。 在本筆記本中,我們使用 OpenAI 嵌入,它具有 1536 個維度。
  • 類型為 "Text" 的 source。 在此範例中,這用作元數據欄位。
  • 您想要用作元數據的任何其他欄位。 它們從 Document.metadata 物件中填充。 例如,如果在 Document.metadata 物件中,您有一個 title 屬性,則可以在表格中建立一個 title 欄位,它將會被填充。

讓我們先安裝我們的依賴項

%pip install --upgrade --quiet  xata langchain-openai langchain-community tiktoken langchain

讓我們將 OpenAI 金鑰載入到環境中。 如果您沒有,您可以建立一個 OpenAI 帳戶並在此 頁面上建立一個金鑰。

import getpass
import os

if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

同樣地,我們需要取得 Xata 的環境變數。 您可以造訪您的帳戶設定來建立新的 API 金鑰。 若要找到資料庫 URL,請前往您建立的資料庫的設定頁面。 資料庫 URL 應該如下所示: https://demo-uni3q8.eu-west-1.xata.sh/db/langchain

api_key = getpass.getpass("Xata API key: ")
db_url = input("Xata database URL (copy it from your DB settings):")
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.xata import XataVectorStore
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

建立 Xata 向量儲存

讓我們導入我們的測試資料集

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

現在建立實際的向量儲存,由 Xata 表格支持。

vector_store = XataVectorStore.from_documents(
docs, embeddings, api_key=api_key, db_url=db_url, table_name="vectors"
)

執行上述命令後,如果您前往 Xata UI,您應該會看到文件與其嵌入一起載入。 若要使用已包含向量內容的現有 Xata 表格,請初始化 XataVectorStore 建構函數

vector_store = XataVectorStore(
api_key=api_key, db_url=db_url, embedding=embeddings, table_name="vectors"
)
query = "What did the president say about Ketanji Brown Jackson"
found_docs = vector_store.similarity_search(query)
print(found_docs)

具有分數的相似性搜尋 (向量距離)

query = "What did the president say about Ketanji Brown Jackson"
result = vector_store.similarity_search_with_score(query)
for doc, score in result:
print(f"document={doc}, score={score}")

此頁面是否有幫助?