利用PGVector打造高效的LangChain向量存储

157 阅读2分钟
# 引言
在现代AI应用中,向量存储是处理海量嵌入数据的关键组件。本文将介绍如何使用LangChain集成包`langchain_postgres``pgvector`扩展,在Postgres中实现高效的向量存储。我们将详细介绍安装、配置和使用方法,并探讨实现过程中可能遇到的挑战与解决方案。

# 主要内容

## PGVector简介
`langchain_postgres`是一个允许你在Postgres中使用向量存储的集成包,利用`pgvector`扩展来支持高效的向量运算。它具备以下特点:
- 使用`psycopg3`驱动连接数据库
- 支持用户指定ID的文档存储
- 提供丰富的查询过滤功能

## 设置与安装

首先,安装`langchain_postgres`包:
```bash
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

配置连接

from langchain_core.documents import Document
from langchain_postgres import PGVector

connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"  # 使用API代理服务提高访问稳定性
collection_name = "my_docs"

vector_store = PGVector(
    embeddings=OpenAIEmbeddings(model="text-embedding-3-large"),
    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代理服务来提高访问的稳定性。

总结和进一步学习资源

PGVector为在Postgres中实现LangChain向量存储提供了一种高效的解决方案。其灵活的配置和丰富的查询功能,使其成为处理海量嵌入数据的理想工具。

进一步学习:

参考资料

  • LangChain与pgvector官方文档
  • 向量存储概念指南

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

---END---