Skip to main content
Open In ColabOpen on GitHub

Xata

Xata 是一个基于 PostgreSQL 的无服务器数据平台。它提供了一个 Python SDK,用于与数据库进行交互,以及一个用于管理数据的用户界面。 Xata 具有原生的向量类型,可以添加到任意表中,并支持相似性搜索。LangChain 可直接将向量插入 Xata,并查询给定向量的最近邻居,因此你可以将所有 LangChain 嵌入(Embeddings)集成与 Xata 结合使用。

本笔记本指导您如何将 Xata 用作向量存储。

设置

创建一个用作向量存储的数据库

Xata UI 中创建一个新数据库。你可以将其命名为任何名称,在此记事本中我们将使用 langchain。 创建一个表,同样你可以任意命名,但我们将会使用 vectors。通过 UI 添加以下列:

  • content 类型为“文本”。用于存储 Document.pageContent 的值。
  • embedding 类型为 \"Vector\"。请使用你计划使用的模型对应的维度。在本笔记本中,我们使用 OpenAI 嵌入,其维度为 1536。
  • source 类型为 \"Text\"。此示例中用作元数据列。
  • 您想要用作元数据的任何其他列。它们从 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 用户界面,你应该能看到文档及其嵌入向量已一并加载。 要使用已包含向量内容的现有 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}")