专业的JAVA编程教程与资源

网站首页 > java教程 正文

LangChain系列之如何使用LangChain4j构建RAG应用(1)

temp10 2025-07-03 00:25:04 java教程 4 ℃ 0 评论

检索增强生成(RAG)技术为大型语言模型(LLM)注入了强大的能力。这类应用既能回答关于特定知识库的提问,又能保持传统LLM的表达与复杂推理优势。

本教程将完整演示如何构建基于RAG的智能问答机器人,该应用具备以下功能:

LangChain系列之如何使用LangChain4j构建RAG应用(1)

  • 从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
    );
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表