跳到主要內容
Open In ColabOpen on GitHub

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,請前往您已建立的資料庫的「Settings」頁面。資料庫 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}")

此頁面是否對您有幫助?