使用PGVector实现高效的向量存储:LangChain与Postgres的完美结合

395 阅读2分钟
## 引言

在构建智能应用时,处理和存储大量高维向量是一个常见的需求。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---