如何在LangChain中使用PGVector扩展Postgres作为向量存储

技术背景介绍

在现代自然语言处理(NLP)应用中,向量存储(vectorstore)是一个关键组件,它可以有效地存储和检索文本向量。LangChain是一个强大的工具,它提供了一些优秀的向量存储抽象。在这篇文章中,我们将介绍如何使用 langchain_postgres 包,通过 Postgres 的 pgvector 扩展实现向量存储。

核心原理解析

pgvector 是一个为Postgres设计的扩展,它允许在数据库中存储和操作高维向量。这使得我们可以使用Postgres作为一个高效的向量存储后端。langchain_postgres 包提供了一种方法,通过使用Postgres和 pgvector 扩展来实现LangChain向量存储抽象。

代码实现演示(重点)

环境配置及容器启动

首先,安装需要的包:

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

配置和初始化

确保安装了 langchain_openailangchain_huggingfacelangchain_core 包:

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

然后,我们可以初始化连接和嵌入对象:

import openai
import getpass
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.embeddings import FakeEmbeddings
from langchain_core.documents import Document
from langchain_postgres import PGVector

# 使用OpenAI嵌入
os.environ["OPENAI_API_KEY"] = getpass.getpass()
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# 使用HuggingFace嵌入
embeddings = HuggingFaceEmbeddings(model="sentence-transformers/all-mpnet-base-v2")

# 使用Fake Embedding
embeddings = FakeEmbeddings(size=4096)

# 配置Postgres连接
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"

# 初始化向量存储
vector_store = PGVector(
    embeddings=embeddings,
    collection_name="my_docs",
    connection=connection,
    use_jsonb=True,
)

增加文档至向量存储

我们可以通过以下代码增加文档到向量存储中:

docs = [
    Document(page_content="there are cats in the pond", metadata={"id": 1, "location": "pond", "topic": "animals"}),
    Document(page_content="ducks are also found in the pond", metadata={"id": 2, "location": "pond", "topic": "animals"}),
    Document(page_content="fresh apples are available at the market", metadata={"id": 3, "location": "market", "topic": "food"}),
    # ... (其他文档)
]

vector_store.add_documents(docs, ids=[doc.metadata["id"] for doc in docs])

# 验证添加的文档
print(vector_store.add_documents(docs, ids=[doc.metadata["id"] for doc in docs]))

删除文档

可以使用以下代码删除特定ID的文档:

vector_store.delete(ids=["3"])

查询向量存储

执行简单的相似性搜索:

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

详细评分查询

results = vector_store.similarity_search_with_score(query="cats", k=1)
for doc, score in results:
    print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

应用场景分析

这套向量存储解决方案适用于多种NLP应用场景,包括但不限于文档检索、问答系统、内容推荐等。通过将文本转换为向量并存储在Postgres中,我们可以高效地对大量文本进行快速查询和检索。

实践建议

  1. 性能调优:确保Postgres优化了索引和查询以提高性能。
  2. 数据备份:定期备份数据库,防止数据意外丢失。
  3. 安全性:配置数据库的访问权限,确保数据安全。
  4. 监控:使用监控工具实时跟踪数据库性能。

代码示例策略:

import openai
# 使用稳定可靠的API服务
client = openai.OpenAI(
    base_url='https://yunwu.ai/v1',  # 国内稳定访问
    api_key='your-api-key'
)

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值