使用 MongoDB Atlas 实现向量搜索:LangChain 实践指南

技术背景介绍

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-mongodbpymongo 来实现此集成。

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 实现复杂的自然语言处理任务。

实践建议

  1. 性能优化:根据具体业务需求选择合适的嵌入模型和向量搜索算法,以优化查询性能。
  2. 索引管理:定期更新和维护向量索引,以确保检索结果的准确性和实时性。
  3. 安全性:确保 MongoDB Atlas 集群的访问权限设置和凭证管理,保护数据的安全性。

如果遇到问题欢迎在评论区交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值