技术背景介绍
MongoDB Atlas 是一个完全托管的云数据库,支持 AWS、Azure 和 GCP。最新版本支持原生的向量搜索以及全文搜索(BM25),使得在 MongoDB 文档数据上执行近似最近邻搜索成为可能。这篇文章将介绍如何利用 langchain-mongodb
包在 LangChain 中使用 MongoDB Atlas 向量搜索。
核心原理解析
MongoDB Atlas 向量搜索允许存储嵌入向量到 MongoDB 文档中,创建向量搜索索引,并使用分层可导航小世界(Hierarchical Navigable Small Worlds, HNSW)算法执行 K 近邻搜索。它使用 $vectorSearch
MQL 阶段来执行这些操作。
代码实现演示
在开始之前,请确保您的 MongoDB Atlas 集群运行在 6.0.11、7.0.2 或以上版本。您还需要安装 langchain-mongodb
和 pymongo
来实现此集成。
pip install -qU langchain-mongodb pymongo
凭证
首先需要获取 MongoDB 集群的 URI。可以参考 这篇指南 获取详细信息。
import getpass
MONGODB_ATLAS_CLUSTER_URI = getpass.getpass("MongoDB Atlas Cluster URI:")
初始化
OpenAI
pip install -qU langchain-openai
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
HuggingFace
pip install -qU langchain-huggingface
from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model="sentence-transformers/all-mpnet-base-v2")
假嵌入
pip install -qU langchain-core
from langchain_core.embeddings import FakeEmbeddings
embeddings = FakeEmbeddings(size=4096)
MongoDB Atlas 向量搜索配置
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch
from pymongo import MongoClient
# 初始化 MongoDB 客户端
client = MongoClient(MONGODB_ATLAS_CLUSTER_URI)
DB_NAME = "langchain_test_db"
COLLECTION_NAME = "langchain_test_vectorstores"
ATLAS_VECTOR_SEARCH_INDEX_NAME = "langchain-test-index-vectorstores"
MONGODB_COLLECTION = client[DB_NAME][COLLECTION_NAME]
vector_store = MongoDBAtlasVectorSearch(
collection=MONGODB_COLLECTION,
embedding=embeddings,
index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME,
relevance_score_fn="cosine",
)
管理向量存储
添加文档到向量存储
from uuid import uuid4
from langchain_core.documents import Document
documents = [
Document(page_content="I had chocolate chip pancakes and scrambled eggs for breakfast this morning.", metadata={"source": "tweet"}),
Document(page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.", metadata={"source": "news"}),
# 更多文档...
]
uuids = [str(uuid4()) for _ in documents]
vector_store.add_documents(documents=documents, ids=uuids)
从向量存储中删除文档
vector_store.delete(ids=[uuids[-1]])
查询向量存储
相似性搜索
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy", k=2
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
带评分的相似性搜索
results = vector_store.similarity_search_with_score("Will it be hot tomorrow?", k=1)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
带预过滤的相似性搜索
vector_store.create_index(
dimensions=1536,
filters=[{"type":"filter", "path":"source"}],
update=True
)
results = vector_store.similarity_search(query="foo", k=1, pre_filter={"source": {"$eq": "news"}})
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
应用场景分析
在实际开发中,向量搜索可以用于多种场景,例如文档检索、推荐系统、语义搜索等。通过利用 MongoDB Atlas 的向量搜索,开发者可以在大规模数据集上高效执行近似最近邻搜索,并结合 LangChain 实现复杂的自然语言处理任务。
实践建议
- 性能优化:根据具体业务需求选择合适的嵌入模型和向量搜索算法,以优化查询性能。
- 索引管理:定期更新和维护向量索引,以确保检索结果的准确性和实时性。
- 安全性:确保 MongoDB Atlas 集群的访问权限设置和凭证管理,保护数据的安全性。
如果遇到问题欢迎在评论区交流。