[利用Supabase和pgvector:构建强大的相似度搜索引擎]

196 阅读3分钟

利用Supabase和pgvector:构建强大的相似度搜索引擎

在当今数据驱动的世界中,快速而精确的文档检索变得至关重要。Supabase结合PostgreSQL和pgvector提供了一种强大的解决方案。本文旨在引导你通过简单的步骤使用Supabase和pgvector来实现文档的相似度搜索。

主要内容

Supabase和PostgreSQL的结合

Supabase是一个开源的Firebase替代解决方案,利用PostgreSQL作为其数据库引擎,后者以其强大的SQL查询能力和易于集成现有工具而闻名。通过pgvector扩展,Supabase可以高效地处理嵌入向量,从而实现快速的相似度搜索。

环境准备

在开始之前,需要确保以下几点:

  • 已启用PostgreSQL的pgvector扩展。
  • 安装了必要的软件包,包括supabase-pylangchain-community
  • 数据库中创建了一个match_documents函数用于执行相似度查询。
  • public模式下创建了一个类似如下结构的表:
-- 启用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 $$
#variable_conflict use_column
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;
$$;

配置API密钥和创建Supabase客户端

为了使用OpenAI的嵌入功能,我们需要获取API密钥。此外,还需要设置Supabase的URL和服务密钥。以下是如何通过环境变量配置:

import os
from dotenv import load_dotenv

load_dotenv()

os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")  # 设置OpenAI API密钥
os.environ["SUPABASE_URL"] = os.getenv("SUPABASE_URL")  # 设置Supabase URL
os.environ["SUPABASE_SERVICE_KEY"] = os.getenv("SUPABASE_SERVICE_KEY")  # 设置Supabase服务密钥

from supabase.client import Client, create_client
from langchain_openai import OpenAIEmbeddings

supabase_url = os.environ["SUPABASE_URL"]
supabase_key = os.environ["SUPABASE_SERVICE_KEY"]
supabase: Client = create_client(supabase_url, supabase_key)  # 使用API代理服务提高访问稳定性

embeddings = OpenAIEmbeddings()

数据加载和向量存储

首先需要加载数据并将其解析为适合存储的格式。接下来,我们将这些文档插入到数据库中,系统会自动为每个文档生成嵌入。

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

# 加载文档
loader = TextLoader("path/to/your/file.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 创建向量存储
from langchain_community.vectorstores import SupabaseVectorStore

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)  # 输出与查询最相似的文档内容

常见问题和解决方案

挑战1:API访问不稳定

对于某些地区的开发者而言,访问外部API可能不稳定。建议使用API代理服务来提高访问的稳定性。

挑战2:查询性能

随着数据量的增加,查询性能可能下降。可以通过调整索引、优化查询函数来提高性能。

总结和进一步学习资源

通过本文的介绍,你应该已经了解如何通过Supabase和pgvector来实现文档的相似度检索。要掌握更多信息,可以参考以下资源:

参考资料

  1. PostgreSQL Official Documentation
  2. Supabase GitHub Repository
  3. Langchain Documentation

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

---END---