探索 Supabase 和 PostgreSQL 的强大组合:实现灵活的向量存储

342 阅读3分钟

引言

在现代应用中,存储和检索数据的能力是其核心组成部分。Supabase 作为一种开源的 Firebase 替代方案,正迅速成为开发者选择的热点。其构建在 PostgreSQL 之上,提供了强大的 SQL 查询能力,并能够与现有工具和框架轻松集成。在这篇文章中,我们将探索如何使用 Supabase 和 pgvector 作为您的向量存储,并通过实例代码演示如何进行文档的相似性搜索。

主要内容

1. 了解 Supabase 和 PostgreSQL

Supabase 是一个开源的 Firebase 替代品,使用 PostgreSQL 作为其数据库后端。PostgreSQL,或称 Postgres,是一种免费且开源的关系数据库管理系统(RDBMS),以其可扩展性和 SQL 标准的合规性著称。

2. 启用 pgvector 扩展

为了在 PostgreSQL 中使用向量(如嵌入)并进行向量搜索,您需要启用 pgvector 扩展。以下是启用的 SQL 代码:

-- 启用 pgvector 扩展
create extension if not exists vector;

3. 创建数据库表和函数

创建一个用于存储文档的表和一个用于搜索文档的函数:

-- 创建存储文档的表
create table
  documents (
    id uuid primary key,
    content text,
    metadata jsonb,
    embedding vector (1536) -- 使用适用于 OpenAI 嵌入的尺寸
  );

-- 创建一个搜索文档的函数
create function match_documents (
  query_embedding vector (1536),
  filter jsonb default '{}'
) returns table (
  id uuid,
  content text,
  metadata jsonb,
  similarity float
) language plpgsql as $$
begin
  return query
  select
    id,
    content,
    metadata,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where metadata @> filter
  order by documents.embedding <=> query_embedding;
end;
$$;

4. 安装所需的 Python 包

要使用 Supabase 及其向量存储功能,您需要安装相应的 Python 包:

# 使用 pip 安装 supabase
pip install --upgrade --quiet supabase

代码示例

在这个示例中,我们将展示如何使用 Python 来加载文档并进行相似性搜索。

import os
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import Client, create_client
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

supabase_url = os.environ.get("SUPABASE_URL")  # 使用API代理服务提高访问稳定性
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase: Client = create_client(supabase_url, supabase_key)

embeddings = OpenAIEmbeddings()

# 创建 Supabase 客户端和嵌入类
vector_store = SupabaseVectorStore(
    embedding=embeddings,
    client=supabase,
    table_name="documents",
    query_name="match_documents",
)

# 进行相似性搜索
query = "What did the president say about Ketanji Brown Jackson"
matched_docs = vector_store.similarity_search(query)

for doc in matched_docs:
    print(doc.page_content)

常见问题和解决方案

问题 1: 向量尺寸不匹配

解决方案: 确保数据库中的向量尺寸与使用的嵌入模型的尺寸一致。

问题 2: API 访问受限

解决方案: 在某些地区,可能需要使用 API 代理服务来提高访问稳定性。

总结和进一步学习资源

通过本文,我们了解了如何使用 Supabase 和 PostgreSQL 构建强大的向量存储系统。利用这些工具,我们可以轻松实现高效的相似性搜索。对于进一步的学习,您可以参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---