随着 AI 技术的普及,越来越多的开发者开始寻求高效的解决方案来处理和查询大量的数据。Supabase 是一种开源的 Firebase 替代品,它建立在 PostgreSQL 之上,具有强大的 SQL 查询能力,并能与现有工具和框架简单对接。本篇博文将详细介绍如何使用 Supabase 和 pgvector 来实现向量存储(VectorStore),以支持先进的搜索功能。
技术背景介绍
Supabase 是一个开源的实时数据库和身份验证后端,基于 PostgreSQL 构建。它不仅提供了 SQL 数据库,还包括实时订阅、身份验证和存储等功能。pgvector 是一个 PostgreSQL 插件,用于存储和查询嵌入向量,使得 PostgreSQL 可以胜任机器学习相关的任务。
核心原理解析
向量搜索的核心在于计算查询向量与存储向量之间的相似度。其中,余弦相似度是常用的度量方法。通过在 PostgreSQL 中使用 pgvector 插件,我们可以在数据库层面上高效地处理向量操作。
代码实现演示
环境配置
首先,确保已安装 supabase-py
和 langchain-community
:
pip install -qU supabase-py langchain-community
并启用 PostgreSQL 的 pgvector
扩展:
create extension if not exists vector;
创建数据表和函数
在 PostgreSQL 数据库中创建用于存储文档的表和用于搜索的函数:
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;
$$;
初始化 Supabase 客户端和 OpenAI 嵌入
import os
from supabase.client import create_client
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
# 环境变量配置
os.environ["SUPABASE_URL"] = 'your_supabase_url'
os.environ["SUPABASE_SERVICE_KEY"] = 'your_service_key'
os.environ["OPENAI_API_KEY"] = 'your_openai_api_key'
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase = create_client(supabase_url, supabase_key)
embeddings = OpenAIEmbeddings() # 初始化 OpenAI 嵌入
加载并解析数据
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("path_to_your_document.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) # 输出最相似的文档内容
应用场景分析
Supabase 和 pgvector 的结合为数据驱动的应用提供了一个强大且灵活的搜索引擎。它适用于需要高效信息检索的各类应用,例如文档搜索、推荐系统和智能问答系统。
实践建议
- 在处理大规模数据时,合理设置数据库索引以优化查询速度。
- 对于不同类型的查询需求,可自定义相似度度量标准。
- 在文档存储和搜索中,定期清理和更新嵌入以保持数据的时效性和相关性。
如果遇到问题欢迎在评论区交流。
—END—