Skip to main content
Open In Colab在 GitHub 上打开

沙塔

Xata 是一个基于 PostgreSQL 的无服务器数据平台。它提供了一个用于与数据库交互的 Python 开发工具包,以及一个用于管理数据的 UI。 Xata 具有原生向量类型,可以添加到任何表中,并支持相似性搜索。LangChain 将向量直接插入到 Xata 中,并查询给定向量的最近邻域,以便您可以使用与 Xata 的所有 LangChain Embeddings 集成。

此笔记本将指导您如何将 Xata 用作 VectorStore。

设置

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

Xata UI 中,创建一个新数据库。你可以随心所欲地命名它,在这个记事本中,我们将使用langchain. 创建一个表,同样你可以给它起任何名字,但我们将使用vectors.通过 UI 添加以下列:

  • content的类型为 “Text”。这用于存储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,请转到您创建的数据库的 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}")