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