## 引言
在构建智能应用时,处理和存储大量高维向量是一个常见的需求。PGVector是一种利用Postgres作为后端的向量存储解决方案,它结合了LangChain的向量存储抽象和pgvector扩展。本文将详细介绍如何利用`langchain_postgres`包来实现高效的向量存储,以及一些常见问题和解决方案。
## 主要内容
### 环境设置
首先,我们需要安装`langchain_postgres`包:
```bash
pip install -qU langchain_postgres
接着,使用Docker启动一个启用了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
向量存储初始化
在初始化向量存储时,你需要提供连接字符串和向量模型。以下是如何使用OpenAI Embeddings进行初始化:
from langchain_openai import OpenAIEmbeddings
from langchain_postgres import PGVector
from langchain_core.documents import Document
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain" # 使用psycopg3驱动
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
collection_name = "my_docs"
vector_store = PGVector(
embeddings=embeddings,
collection_name=collection_name,
connection=connection,
use_jsonb=True,
)
管理和查询向量存储
我们可以通过以下方式将文档添加到向量存储中:
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}]")
处理网络访问限制
由于某些地区的网络限制,开发者可能需要通过API代理服务来提高访问稳定性。例如,通过代理访问OpenAI API:
import os
from langchain_openai import OpenAIEmbeddings
os.environ["OPENAI_API_KEY"] = "your_api_key" # 使用API代理服务提高访问稳定性
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
常见问题和解决方案
-
Schema 变更问题: 目前PGVector不支持自动数据迁移,任何schema的变化需要重新创建表并重新添加文档。如果频繁更改schema,可以考虑使用其他向量存储方案。
-
连接问题: 确保使用
psycopg3驱动更新连接字符串,以确保兼容性。
总结和进一步学习资源
PGVector作为LangChain的向量存储实现,为开发者提供了一种便捷而高效的向量存储方案。要深入学习PGVector,可以参考以下资源:
参考资料
- PGVector GitHub仓库
- LangChain官方指南
- Postgres与pgvector扩展
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---