# 利用LangChain和Postgres实现高效向量存储:从入门到精通
## 引言
在大数据和AI日益增长的时代,处理和存储大量的文本数据变得极其重要。向量存储是一种将文本数据转换为数值向量并进行快速检索的技术,而LangChain结合Postgres的pgvector扩展提供了一个强大的解决方案。本文将帮助您搭建一个使用LangChain和Postgres的向量存储系统,并展示如何利用它进行文档检索。
## 主要内容
### 1. 环境设置
首先,我们需要安装 `langchain_postgres` 包,并确保已经下载并启动包含 `pgvector` 扩展的 Postgres 容器。
```bash
pip install -qU langchain_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. 创建连接
使用 psycopg3 驱动程序连接到 Postgres 数据库:
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain" # 使用API代理服务提高访问稳定性
3. 初始化向量存储
我们需要选择合适的嵌入模型,并使用LangChain提供的PGVector进行存储初始化。
from langchain_openai import OpenAIEmbeddings
from langchain_postgres.vectorstores import PGVector
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
collection_name = "my_docs"
vector_store = PGVector(
embeddings=embeddings,
collection_name=collection_name,
connection=connection,
use_jsonb=True,
)
4. 添加和管理文档
通过以下代码,我们可以将文本文档添加到向量存储中,并通过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])
5. 查询文档
可以使用多种操作符进行复杂的查询,包括相似度搜索。
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}]")
代码示例
以下是完整的代码示例,演示了如何使用LangChain和Postgres进行向量存储和查询。
from langchain_postgres.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
# 设置连接和初始化PGVector
connection = "postgresql+psycopg://langchain:langchain@localhost:6024/langchain"
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
collection_name = "my_docs"
vector_store = PGVector(
embeddings=embeddings,
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代理来提高稳定性。
总结和进一步学习资源
通过本文,您学习了如何使用LangChain和Postgres的pgvector扩展来创建向量存储系统。为进一步深入研究,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---