使用PGVecto.rs在Postgres中进行向量数据库操作

使用PGVecto.rs在Postgres中进行向量数据库操作

技术背景介绍

向量数据库是一种用于存储和检索高维向量数据的数据库,非常适合应用于自然语言处理、推荐系统等领域。在这篇文章中,我们将介绍如何使用PGVecto.rs在Postgres中进行向量数据库操作。

核心原理解析

PGVecto.rs 是基于Postgres的向量数据库实现,可以轻松地实现向量的存储和高效检索。它通过Postgres的扩展实现了高效的向量内积计算和最近邻搜索。

代码实现演示

安装相关依赖

首先,我们需要安装所需的库:

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

导入所需模块

from typing import List
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings.fake import FakeEmbeddings
from langchain_community.vectorstores.pgvecto_rs import PGVecto_rs
from langchain_core.documents import Document
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)

生成嵌入向量

embeddings = FakeEmbeddings(size=3)

启动数据库

在运行以下命令前,请确保已经安装Docker:

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

构建数据库连接字符串

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

创建向量存储

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: 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

query = "What did the president say about Ketanji Brown Jackson"
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("======================")

或者:

query = "What did the president say about Ketanji Brown Jackson"
docs: List[Document] = db1.similarity_search(
    query, k=4, filter={"source": "../../how_to/state_of_the_union.txt"}
)

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

应用场景分析

通过PGVecto.rs,你可以构建强大的文本检索系统,应用于新闻推荐、法律文档查询等领域。

实践建议

  1. 确保数据库服务稳定运行。
  2. 根据实际需求选择合适的向量检索算法。
  3. 对输入文本进行预处理以提高检索质量。

如果遇到问题欢迎在评论区交流。

你可能感兴趣的:(数据库,python)