在构建现代应用程序时,高效的数据存储和检索是一个至关重要的环节。随着AI和机器学习的发展,向量存储成为了一种热门的选择。Supabase 是一个开源的 Firebase 替代方案,基于 PostgreSQL 构建,提供强大的 SQL 查询功能。本篇文章旨在介绍如何使用 Supabase 和 OpenAI Embeddings 搭建向量存储系统,并实现高效的相似性搜索。
要使用 Supabase 和 pgvector 作为向量存储,您需要确保以下几点:
langchain-community
包:pip install -qU langchain-community
pgvector
扩展match_documents
函数和 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;
$$;
在代码中,首先需要配置 OpenAI 和 Supabase 的 API 密钥:
import os
import getpass
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:")
注意:如果您在某些地区遇到网络限制问题,建议考虑使用 API 代理服务以提高访问稳定性。
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("path/to/your/textfile.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)
确保嵌入维度与模型匹配,检查函数 match_documents
的实现,调整查询参数。
在某些地区,访问 API 可能会受到限制。建议使用 API 代理服务来稳定访问。
通过本篇文章,您了解了如何使用 Supabase 和 OpenAI Embeddings 实现向量存储和高效的相似性搜索。为了进一步深化您的理解,您可以参考以下资源:
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
因篇幅问题不能全部显示,请点此查看更多更全内容