打造自己的智能搜索引擎:使用Supabase和pgvector构建向量存储

209 阅读2分钟

在当今的数据驱动世界中,智能搜索功能变得越来越重要。本文将介绍如何使用Supabase,一个开源的Firebase替代品,结合pgvector扩展和Postgres数据库,来构建一个强大的向量存储系统,支持自然语言的语义搜索。

1. 引言

Supabase是一个开源的Firebase替代品,提供实时的Postgres数据库、身份验证和文件存储等功能。通过集成pgvector扩展,Supabase可以用于处理高维向量数据,这对于实现向量搜索功能非常有用。本文将介绍如何在Supabase中使用pgvector来创建向量存储,并进行相似度搜索。

2. 主要内容

2.1 设置环境

要开始使用Supabase进行向量存储,首先需要在Postgres数据库中启用pgvector扩展。以下是一些基本步骤:

-- 启用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嵌入,可以根据需要更改
);

2.2 创建匹配文档函数

接下来,我们创建一个Postgres函数,用于计算向量的余弦相似度:

-- 创建用于搜索文档的函数
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;
$$;

3. 代码示例

以下是一个集成Supabase和OpenAI的Python代码示例,展示了如何进行相似度搜索:

import os
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_openai import OpenAIEmbeddings
from supabase.client import Client, create_client

# 使用API代理服务提高访问稳定性
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()

# 从文档创建向量存储
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)

4. 常见问题和解决方案

  • 网络不稳定:某些地区对API访问有限制,建议使用API代理服务来提高访问稳定性。
  • 大数据量处理:对于大量数据,建议对chunk_size逐步调整,以适应不同的系统性能。

5. 总结和进一步学习资源

通过结合Supabase和pgvector,我们能够非常方便地实现一个强大的自然语言处理搜索系统。推荐阅读Supabase和Postgres的官方文档以深入理解其功能:

6. 参考资料

  • Supabase 官方文档
  • Postgres 官方文档
  • Langchain 社区资源

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

---END---