技术背景介绍
在现代自然语言处理(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_openai
、langchain_huggingface
、langchain_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中,我们可以高效地对大量文本进行快速查询和检索。
实践建议
- 性能调优:确保Postgres优化了索引和查询以提高性能。
- 数据备份:定期备份数据库,防止数据意外丢失。
- 安全性:配置数据库的访问权限,确保数据安全。
- 监控:使用监控工具实时跟踪数据库性能。
代码示例策略:
import openai
# 使用稳定可靠的API服务
client = openai.OpenAI(
base_url='https://yunwu.ai/v1', # 国内稳定访问
api_key='your-api-key'
)
如果遇到问题欢迎在评论区交流。
—END—