以编程方式使用文档

本笔记本介绍了如何将 MongoDB 向量搜索与 LangChain 结合使用。同时展示了 MongoDB Atlas 嵌入和重排序 API,用于访问 Voyage AI 最先进的嵌入模型和重排序器。

>MongoDB Atlas 是一个全托管的云数据库,可在 AWS、Azure 和 GCP 上使用。它支持原生向量搜索、全文搜索(BM25)以及针对 MongoDB 文档数据的混合搜索。

>MongoDB 向量搜索 允许将嵌入向量存储在 MongoDB 文档中,创建向量搜索索引,并使用近似最近邻算法(Hierarchical Navigable Small Worlds)执行 KNN 搜索。它使用 $vectorSearch MQL Stage.

>MongoDB Atlas 嵌入和重排序 API 支持通过 MongoDB Atlas 访问 Voyage AI 模型。

注意: MongoDBAtlasVectorSearch 接口与社区版中的 MongoDB 向量搜索兼容。

设置

要使用 MongoDB Atlas,必须首先部署一个集群。要开始使用,请 免费注册 Atlas.

为了使用 Voyage AI 嵌入和重排序模型,您需要创建一个模型 API 密钥。 生成您的 API 密钥,并获得最新模型的 2 亿免费令牌访问权限。

首先,安装以下库以跟随本笔记本进行操作。

!pip install -qU langchain-mongodb langchain-voyageai langchain-community

将以下代码单元格中的占位符值替换为您的 Atlas 集群连接字符串和模型 API 密钥。

from pymongo import MongoClient
from langchain_mongodb import MongoDBAtlasVectorSearch
from langchain_mongodb.retrievers import MongoDBAtlasHybridSearchRetriever
from langchain_voyageai import VoyageAIEmbeddings, VoyageAIRerank
from langchain_community.document_loaders import WikipediaLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# Setup credentials
MONGODB_ATLAS_URI = "YOUR_ATLAS_CONNECTION_STRING_HERE"
MONGODB_ATLAS_MODEL_API_KEY = "YOUR_ATLAS_MODEL_API_KEY"
os.environ["VOYAGE_API_KEY"] = MONGODB_ATLAS_MODEL_API_KEY

client = MongoClient(MONGODB_ATLAS_URI)
db_name = "langchain_db"
collection_name = "vector_store_example"
atlas_collection = client[db_name][collection_name]
vector_index_name = "vector_index"

## 插入数据 我们加载文档,通过 Atlas 托管的 Voyage AI 模型生成嵌入向量,并以编程方式创建向量搜索索引。

# Load sample data
loader = WikipediaLoader(query="MongoDB", load_max_docs=2)
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(data)

# Initialize Embeddings (Voyage AI hosted on Atlas)
embeddings = VoyageAIEmbeddings(model="voyage-4-lite")

# Initialize Vector Store
vector_store = MongoDBAtlasVectorSearch(
    collection=atlas_collection,
    embedding=embeddings,
    index_name=vector_index_name
)

创建向量索引

# Create the vector search index with specific filters for optimized metadata searching
vector_store.create_vector_search_index(
    dimensions=1024,
    wait_until_complete=45 # waits 45 seconds for index readiness
)

[可选] 除了上述 vector_store.create_vector_search_index 命令外,您还可以使用以下索引定义通过 Atlas UI 创建向量搜索索引:

{
  "fields":[
    {
      "type": "vector",
      "path": "embedding",
      "numDimensions": 1024,
      "similarity": "cosine"
    }
  ]
}
# Ingest documents
vector_store.add_documents(docs)

查询向量存储

### 语义搜索 根据语义相似性查找最相关的文档。

query = "What is MongoDB Atlas?"
results = vector_store.similarity_search(query, k=3)

for doc in results:
    print(f"* {doc.page_content[:100]}...")

带评分的语义搜索

检索文档及其相关性评分。

results_with_score = vector_store.similarity_search_with_score(query, k=3)

for doc, score in results_with_score:
    print(f"Score: {score:.4f} | Content: {doc.page_content[:80]}...")

带过滤的语义搜索

首先,让我们通过提供要过滤的字段来更新向量搜索索引。

# Create the vector search index with specific filters for optimized metadata searching
vector_store.create_vector_search_index(
    dimensions=1024,
    wait_until_complete=60,
    update=True,
    filters=["source"]
)

使用元数据过滤器缩小结果范围。请注意,Atlas 向量搜索需要明确的运算符,如 $eq.

# Use a source known to exist in our loaded docs
sample_source = "https://en.wikipedia.org/wiki/MongoDB"

filtered_results = vector_store.similarity_search(
    query,
    k=3,
    pre_filter={"source": {"$eq": sample_source}}
)

print(f"Retrieved {len(filtered_results)} documents matching source: {sample_source}")

混合搜索

使用互惠排名融合(RRF)将向量搜索与全文搜索(关键词)相结合。

from langchain_mongodb.index import create_fulltext_search_index

# Use helper method to create the search index
create_fulltext_search_index(
   collection = atlas_collection,
    wait_until_complete=60,
   field = "text",
   index_name = "search_index"
)
# Requires a standard Search Index named 'default' on the collection
retriever = MongoDBAtlasHybridSearchRetriever(
    vectorstore=vector_store,
    search_index_name="search_index",
    fulltext_penalty = 50,
    vector_penalty = 50,
    top_k=5
)

hybrid_docs = retriever.invoke("database-as-a-service")
for doc in hybrid_docs:
   print("Title: " + doc.metadata["title"])
   print("Plot: " + doc.page_content)
   print("Search score: {}".format(doc.metadata["fulltext_score"]))
   print("Vector Search score: {}".format(doc.metadata["vector_score"]))
   print("Total score: {}\n".format(doc.metadata["fulltext_score"] + doc.metadata["vector_score"]))

向量搜索和重排序

两阶段流程:先广泛召回,再高精度重排序,确保最大相关性。

from langchain_classic.retrievers.contextual_compression import ContextualCompressionRetriever

# 1. Define the base retriever to fetch a broad pool
base_retriever = vector_store.as_retriever(search_kwargs={"k": 20})

# 2. Initialize the Atlas-hosted Voyage AI Reranker
reranker = VoyageAIRerank(model="rerank-2.5-lite", top_k=3)

# 3. Create the Compression Retriever
compression_retriever = ContextualCompressionRetriever(
    base_compressor=reranker,
    base_retriever=base_retriever
)

print("--- Reranked Results ---")
final_docs = compression_retriever.invoke("Explain how MongoDB stores vectors")
for doc in final_docs:
    print(f"Relevance Score: {doc.metadata['relevance_score']:.4f} | {doc.page_content[:100]}...")

检索增强生成(RAG)

有关如何将 MongoDB 向量存储与 LangChain 结合用于检索增强生成(RAG)的指南,请参阅以下教程:

其他说明

> * 更多文档请访问 MongoDB LangChain 文档. > * 此功能已正式发布,可用于生产部署。

API 参考

有关所有功能的详细文档 MongoDBAtlasVectorSearch 功能和配置的详细信息,请参阅 API reference