跳到主要内容

MongoDB Atlas

MongoDB Atlas 是一个完全托管的 云数据库,可在 AWS、Azure 和 GCP 上使用。它支持对 MongoDB 文档数据进行原生向量搜索和全文搜索(BM25 算法)。

Atlas 向量搜索 功能允许您将嵌入存储在 MongoDB 文档中,创建 向量搜索索引,并使用称为分层可导航小世界的近似 最近邻算法执行 KNN 搜索。 MongoDB 与 LangChain4j 的集成通过使用 $vectorSearch 聚合阶段在内部实现 Atlas 向量搜索。

您可以将 Atlas 向量搜索与 LangChain4j 一起使用,对您的数据执行语义 搜索并构建简单的 RAG 实现。要查看 执行这些任务的完整教程,请参阅 MongoDB Atlas 文档中的 开始使用 LangChain4j 集成 教程。

先决条件

您必须运行以下 MongoDB 服务器版本 才能使用 Atlas 向量搜索:

  • 6.0.11 或更高版本
  • 7.0.2 或更高版本

MongoDB 提供永久免费集群。请参阅 Atlas 入门 教程, 了解有关设置账户和连接到部署的更多信息。

您还必须拥有具有信用额度的 API 密钥,用于提供嵌入模型的 LLM 服务, 例如 Voyage AI,它提供免费层级。对于 RAG 应用程序,您还必须拥有具有聊天模型 功能的服务的 API 密钥,例如 OpenAIHuggingFace 的模型。

环境和安装

  1. 在您首选的 IDE 中创建一个新的 Java 应用程序。
  2. 将以下依赖项添加到您的应用程序,以安装 LangChain4j 和 MongoDB Java Sync 驱动程序:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mongodb-atlas</artifactId>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>5.4.0</version>
</dependency>

您还必须为您的嵌入模型安装依赖项,例如 Voyage AI:

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-voyage-ai</artifactId>
</dependency>

连接到 MongoDB Atlas

此代码演示如何连接到 MongoDB Atlas 并创建一个 MongoDBAtlasEmbeddingStore 实例。

// 创建 MongoDB 客户端
MongoClient mongoClient = MongoClients.create(
"mongodb+srv://<username>:<password>@<cluster-url>/?retryWrites=true&w=majority"
);

// 创建嵌入存储
MongoDBAtlasEmbeddingStore embeddingStore = MongoDBAtlasEmbeddingStore.builder()
.mongoClient(mongoClient)
.databaseName("langchain4j")
.collectionName("embeddings")
.vectorSearchIndexName("vector_index")
.build();

创建嵌入模型

此代码演示如何创建一个嵌入模型,该模型将文本转换为向量。

// 创建嵌入模型
EmbeddingModel embeddingModel = VoyageAiEmbeddingModel.builder()
.apiKey(System.getenv("VOYAGE_API_KEY"))
.modelName("voyage-2")
.build();

添加文档

此代码演示如何将文档添加到嵌入存储中。

// 添加文档
List<String> documents = Arrays.asList(
"企鹅是生活在南半球的不会飞的海鸟。",
"大多数企鹅生活在南极洲,但也有一些生活在南美洲、非洲和澳大利亚的沿海地区。",
"企鹅是社会性动物,通常生活在大型群体中。"
);

for (String document : documents) {
TextSegment segment = TextSegment.from(
document,
Metadata.from(
Map.of(
"author", "自然历史学家",
"website", "自然栖息地"
)
)
);
Embedding embedding = embeddingModel.embed(segment).content();
embeddingStore.add(embedding, segment);
}

执行语义/相似度搜索

此代码演示如何创建搜索请求,将您的 查询转换为向量并返回语义相似的文档。结果 EmbeddingMatch 实例包含文档内容以及 描述每个结果与您的查询匹配程度的分数。

String query = "企鹅住在哪里?";
Embedding queryEmbedding = embeddingModel.embed(query).content();

EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.maxResults(3)
.build();

System.out.println("执行查询...");

EmbeddingSearchResult<TextSegment> searchResult = embeddingStore.search(searchRequest);
List<EmbeddingMatch<TextSegment>> matches = searchResult.matches();

for (EmbeddingMatch<TextSegment> embeddingMatch : matches) {
System.out.println("响应: " + embeddingMatch.embedded().text());
System.out.println("作者: " + embeddingMatch.embedded().metadata().getString("author"));
System.out.println("分数: " + embeddingMatch.score());
}

元数据过滤

您可以在构建 EmbeddingSearchRequest 时使用 filter() 方法 实现元数据过滤。filter() 方法接受一个继承自 Filter 的参数。

此代码实现了元数据过滤,仅针对 website 值为 列出值之一的文档。

EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.filter(new IsIn("website", List.of("自然地球", "自然栖息地")))
.maxResults(3)
.build();

RAG

要查看有关使用 MongoDB Atlas 作为向量存储实现 RAG 的说明, 请参阅 Atlas 文档中 LangChain4j 教程的 使用您的数据回答问题 部分。

API 文档

有用的链接