网站首页 > java教程 正文
检索增强生成(RAG)技术为大型语言模型(LLM)注入了强大的能力。这类应用既能回答关于特定知识库的提问,又能保持传统LLM的表达与复杂推理优势。
本教程将完整演示如何构建基于RAG的智能问答机器人,该应用具备以下功能:
- 从MongoDB Atlas数据库检索数据
- 将文档转化为向量嵌入并存储
- 通过LangChain4J查询数据库,用检索结果增强LLM提示
- 实现安全可靠、可扩展的高效AI应用
为什么使用 RAG?
RAG通过从你的知识库中检索相关数据,并利用这些信息来丰富输入给大型语言模型(LLM)的内容。其主要优势包括:
- 敏感数据管理:RAG 允许你使用敏感或专有数据,而无需将其纳入 LLM 的训练集中。这既保证了数据隐私和安全,又能实现智能响应。
- 实时更新:RAG通过从知识库实时拉取最新数据,避免了重新训练模型这一昂贵的过程,实现了信息的实时更新。
- 提高相关性:通过基于自有语料库生成回答,RAG确保了回答的准确性和上下文相关性。
RAG 的应用场景
RAG 非常适合多种应用,包括:
- 问答应用:基于公司文档、常见问题解答或内部知识库,精准回答用户提问。
- 客户支持聊天机器人:通过参考客户历史记录、CRM数据和以往交互,实现个性化互动。
- 动态业务智能工具:利用数据库或电子表格中的实时运营数据,为业务智能应用提供洞察。
LangChain4J 与 RAG
LangChain4J 是一个基于 Java 的库,旨在通过封装 AI 应用中许多必要组件,简化大型语言模型(LLM)在 Java 应用中的集成。它提供了一个强大的工具箱,用于构建基于检索增强生成的应用,帮助我们更快速地开发、构建模块化应用程序。
LangChain4J 提供了构建块,能够在保持对底层架构完整控制的前提下,简化 RAG 的实现过程。
MongoDB 在 RAG 中的应用
MongoDB 是实现 RAG 的理想数据库,原因如下:
- 原生向量搜索:可将向量嵌入直接存储在 MongoDB 中,并与业务数据一同查询,实现相关上下文的高效检索。
- 灵活的数据模式:无需复杂的数据迁移即可轻松添加新字段或调整数据模型。
- 可扩展性:借助 MongoDB 的水平扩展能力,能够处理高吞吐量和大规模数据集。
- 运行效率:利用 MongoDB 的聚合管道、时序集合和多模态功能,既可支持 RAG 工作负载,也能支持其他非 RAG 应用。
前置条件
在开始本教程之前,你需要准备以下内容:
- Java 21 或更高版本
- Maven 或 Gradle(用于管理依赖):
本教程中我们使用 Maven - 一个已创建并运行中的 MongoDB Atlas 账号和集群
- 一组 OpenAI API 密钥
配置依赖
首先第一件事,配置依赖
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.0.0-alpha1</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mongodb-atlas</artifactId>
<version>1.0.0-alpha1</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.0.0-alpha1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.1</version>
</dependency>
</dependencies>
- langchain4j-open-ai:
- 嵌入生成:支持使用OpenAI的嵌入模型(如 text-embedding-ada-002)将文本数据转换为向量表示。
- 聊天模型集成:支持与 OpenAI 的 GPT 模型(如 GPT-3.5、GPT-4)进行通信,具备对话式 AI 能力。
- 简化 API 调用:封装与 OpenAI API 的交互细节,减少重复代码,提高开发效率。
- langchain4j-mongodb-atlas:
- 嵌入存储管理:简化在 MongoDB 中嵌入数据的存储与检索,是构建 RAG 应用的理想选择。
- 向量搜索支持:利用MongoDB Atlas 的原生能力,实现高性能的向量相似度查询。
- 元数据处理:支持存储和查询与嵌入数据相关的元信息,有助于构建更加丰富、具备上下文感知的系统。
- langchain4j:提供构建 RAG 工作流所需的工具,包括:
- 文本分段、文档拆分和分块的类,用于将大文档拆解成更易处理的小片段。
- 用于连接和编排嵌入模型、向量存储、内容检索器等组件的实用工具。
- Jackson Databind:简化加载和处理 JSON 数据的流程。
设置 MongoDB 和我们的嵌入存储
为了让检索增强生成(RAG)应用高效运行,我们需要一个强大且可扩展的方案来存储和查询嵌入向量。MongoDB 利用其 Atlas Search 功能,成为这个任务的核心支撑。本节将介绍如何设置 MongoDB,并使用 LangChain4J 的 MongoDB 集成功能配置嵌入存储。
MongoDB 设置
第一步是初始化与 MongoDB 集群的连接。我们使用MongoDB Java驱动中的 MongoClient 来连接数据库,例如:
package com.mongodb;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.model.CreateCollectionOptions;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.Metadata;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModelName;
import dev.langchain4j.model.openai.OpenAiTokenizer;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.*;
import dev.langchain4j.store.embedding.mongodb.IndexMapping;
import dev.langchain4j.store.embedding.mongodb.MongoDbEmbeddingStore;
import dev.langchain4j.service.AiServices;
import org.bson.conversions.Bson;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
public class LangChainRagApp {
public static void main(String[] args) {
try {
// MongoDB setup
MongoClient mongoClient = MongoClients.create("CONNECTION_URI");
} catch (Exception e) {
e.printStackTrace();
}
}
}
将 "CONNECTION_URI" 替换为你实际的 MongoDB 连接字符串,其中应包含数据库凭证和集群信息。这个连接将用于与数据库交互,并执行如存储和检索嵌入等操作。
配置嵌入存储
嵌入存储(Embedding Store)是 RAG 应用的知识库,所有的向量嵌入及其相关元数据都会存储在这里。下面,我们来添加一个方法,并在主方法中调用它:
private static EmbeddingStore<TextSegment> createEmbeddingStore(MongoClient mongoClient) {
String databaseName = "rag_app";
String collectionName = "embeddings";
String indexName = "embedding";
Long maxResultRatio = 10L;
CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions();
Bson filter = null;
Set<String> metadataFields = new HashSet<>();
IndexMapping indexMapping = new IndexMapping(1536, metadataFields);
Boolean createIndex = true;
return new MongoDbEmbeddingStore(
mongoClient,
databaseName,
collectionName,
indexName,
maxResultRatio,
createCollectionOptions,
filter,
indexMapping,
createIndex
);
}
猜你喜欢
- 2025-07-03 JAVA面试|为什么Spring Boot的jar可以直接运行?
- 2025-07-03 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- 2025-07-03 JAVA入门教程-第2章 基本编程概念
- 2025-07-03 FTPC Pnuts语言(ftp mput put)
- 2025-07-03 这9个工具库让我的Java开发效率提升了80%
- 2025-07-03 VS2022配置x86/x64调用32位和64位汇编语言动态库环境
- 2025-07-03 别再裸写 parseFrom() 了!这才是 MQTT + Protobuf 消费的正确姿势
- 2025-07-03 aardio + Java + JavaScript 混合开发快速入门
你 发表评论:
欢迎- 最近发表
-
- JAVA面试|为什么Spring Boot的jar可以直接运行?
- 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- LangChain系列之如何使用LangChain4j构建RAG应用(1)
- JAVA入门教程-第2章 基本编程概念
- FTPC Pnuts语言(ftp mput put)
- 这9个工具库让我的Java开发效率提升了80%
- VS2022配置x86/x64调用32位和64位汇编语言动态库环境
- 别再裸写 parseFrom() 了!这才是 MQTT + Protobuf 消费的正确姿势
- aardio + Java + JavaScript 混合开发快速入门
- 铁打的程序,流水的语言,2018年JAVA编程还想坚挺500年?
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)