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}")