搜索
您的当前位置:首页正文

使用Supabase和OpenAI Embeddings进行向量存储和相似性搜索

来源:吉趣旅游网

引言

在构建现代应用程序时,高效的数据存储和检索是一个至关重要的环节。随着AI和机器学习的发展,向量存储成为了一种热门的选择。Supabase 是一个开源的 Firebase 替代方案,基于 PostgreSQL 构建,提供强大的 SQL 查询功能。本篇文章旨在介绍如何使用 Supabase 和 OpenAI Embeddings 搭建向量存储系统,并实现高效的相似性搜索。

主要内容

1. 环境准备

要使用 Supabase 和 pgvector 作为向量存储,您需要确保以下几点:

  • 已安装 langchain-community 包:pip install -qU langchain-community
  • 启用了 PostgreSQL 的 pgvector 扩展
  • 创建了 match_documents 函数和 documents 数据表
PostgreSQL 初始化脚本
-- 启用 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;
$$;

2. 配置 API 密钥

在代码中,首先需要配置 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 代理服务以提高访问稳定性。

3. 创建 Supabase 客户端和 OpenAI Embeddings 类

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()

4. 加载和解析数据

将文本数据加载并解析为文档块:

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)

5. 插入数据并进行相似性搜索

将文档插入数据库,并执行相似性搜索:

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. 搜索结果不准确

确保嵌入维度与模型匹配,检查函数 match_documents 的实现,调整查询参数。

2. 网络访问问题

在某些地区,访问 API 可能会受到限制。建议使用 API 代理服务来稳定访问。

总结与进一步学习资源

通过本篇文章,您了解了如何使用 Supabase 和 OpenAI Embeddings 实现向量存储和高效的相似性搜索。为了进一步深化您的理解,您可以参考以下资源:

参考资料

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top