构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用

简介: 当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。

一、 引言:从调用API到构建智能体
单纯调用大模型API只能解决通用问题。真正的企业级AI应用需要模型能够理解和处理外部知识,如公司内部文档、数据库记录等。这就是AI智能体的用武之地——它能感知环境、使用工具(如数据库)、并执行复杂任务。

RAG是构建此类智能体的关键技术栈。其核心思想是:在向大模型提问前,先从私有知识库中检索出最相关的信息片段,并将其作为上下文与问题一同提交给模型,从而得到基于特定知识的精准回答。

本文将对比介绍两个Java领域的AI框架:Spring AI(Spring官方新项目,提供抽象层)和LangChain4j(灵感源于Python的LangChain,功能丰富),并分别展示如何用它们实现RAG流水线。

二、 技术选型与项目初始化

  1. 框架简介

Spring AI(选学):致力于为AI应用开发提供熟悉的Spring范式(如AIClient抽象、PromptTemplate)。目前仍在早期阶段,但背靠Spring生态,前景可观。

LangChain4j(主打):一个功能强大、设计优雅的Java库,提供了大量现成的组件(文档加载器、工具、链),用于构建AI应用,是目前Java生态中最接近Python LangChain成熟度的选择。

  1. 项目依赖

本例我们以LangChain4j为主进行构建。在pom.xml中引入以下依赖:

xml


0.29.0




org.springframework.boot
spring-boot-starter-web

<!-- LangChain4j 核心 -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>${langchain4j.version}</version>
</dependency>

<!-- LangChain4j 用于OpenAI集成 -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>${langchain4j.version}</version>
</dependency>

<!-- LangChain4j 本地向量库(暂存嵌入向量) -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
    <version>${langchain4j.version}</version>
</dependency>

<!-- 用于从文件系统加载文档 -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-document-parser-apache-poi</artifactId>
    <version>${langchain4j.version}</version>
</dependency>

  1. 配置信息(application.yml)

yaml
langchain4j:
openai:
chat-model:
api-key: ${OPENAI_API_KEY}
model-name: "gpt-3.5-turbo"
embedding-model:
api-key: ${OPENAI_API_KEY}
model-name: "text-embedding-ada-002"

知识库文档路径

app:
knowledge-base-path: "./knowledge-base"
三、 核心实现:四步构建RAG流水线
一个完整的RAG系统包含四个关键步骤:文档摄入、向量化与存储、检索和生成。

  1. 文档摄入与分块(Ingestion)

首先,我们需要将原始文档(如PDF、Word、TXT)加载进来,并切割成适合处理的小片段(chunks)。

java
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentParser;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.nio.file.Paths;
import java.util.List;

@Configuration
public class DocumentIngestionConfig {

@Bean
public EmbeddingStore<TextSegment> embeddingStore() {
    // 使用内存向量库作为示例。生产环境可换为ChromaDB、PgVector等持久化方案。
    return new InMemoryEmbeddingStore<>();
}

@Bean
public EmbeddingStoreIngestor embeddingStoreIngestor(EmbeddingStore<TextSegment> embeddingStore, EmbeddingModel embeddingModel) {
    // EmbeddingStoreIngestor 是一个工具类,封装了分块、向量化、存储的流水线
    return EmbeddingStoreIngestor.builder()
            .documentSplitter(DocumentSplitters.recursive(500, 100)) // 递归分块,最大500字符,重叠100字符
            .embeddingModel(embeddingModel)
            .embeddingStore(embeddingStore)
            .build();
}

// 应用启动时加载知识库的Bean
@Bean
public Boolean loadKnowledgeBase(EmbeddingStoreIngestor ingestor, @Value("${app.knowledge-base-path}") String path) {
    List<Document> documents = FileSystemDocumentLoader.loadDocuments(Paths.get(path), new TextDocumentParser());
    ingestor.ingest(documents);
    System.out.println("知识库文档加载完毕!");
    return true;
}

}

  1. 创建AI服务(智能体)

接下来,我们定义一个AI服务接口。LangChain4j会通过动态代理自动为我们实现它。

java
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;

// 定义智能体的“大脑”
public interface KnowledgeBaseAssistant {

@SystemMessage("""
    你是一个专业的客服助手,专门回答关于公司产品和服务的问题。
    请严格根据提供的信息来源进行回答。如果信息来源中没有相关答案,请明确告知"根据现有资料,我暂时无法回答这个问题。"
    请保持回答友好、简洁且准确。
    """)
String answerQuestion(@UserMessage @V("question") String question);

}

  1. 装配智能体(将检索与生成连接)

这是最核心的一步,我们将检索器(Retriever)和聊天模型(ChatModel)组装成一个具备RAG能力的AI服务。

java
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AIConfig {

@Bean
public KnowledgeBaseAssistant knowledgeBaseAssistant(
        ChatLanguageModel chatLanguageModel,
        EmbeddingStore<TextSegment> embeddingStore,
        EmbeddingModel embeddingModel) {

    // 1. 创建内容检索器
    EmbeddingStoreContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
            .embeddingStore(embeddingStore)
            .embeddingModel(embeddingModel)
            .maxResults(2) // 每次检索最相关的2个片段
            .build();

    // 2. 使用AiServices将检索器与AI模型绑定到接口上
    return AiServices.builder(KnowledgeBaseAssistant.class)
            .chatLanguageModel(chatLanguageModel)
            .contentRetriever(retriever) // 关键:注入RAG能力!
            .build();
}

}

  1. 提供REST API

最后,我们创建一个简单的控制器来暴露服务。

java
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/assistant")
public class AssistantController {

private final KnowledgeBaseAssistant assistant;

public AssistantController(KnowledgeBaseAssistant assistant) {
    this.assistant = assistant;
}

@PostMapping("/ask")
public String askQuestion(@RequestBody QuestionRequest request) {
    return assistant.answerQuestion(request.question());
}

public record QuestionRequest(String question) {}

}
四、 测试与进阶探讨
测试:

在./knowledge-base目录下放入你的公司手册、API文档等文本文件。

启动应用后,提问:“我们公司的主要产品是什么?” 智能体会自动检索知识库中的相关内容并生成回答。

进阶探讨:

向量数据库升级:内存向量库重启后数据丢失。生产环境应集成PostgreSQL(pgvector扩展)、RedisStack或ChromaDB等专业向量数据库。

更复杂的智能体:LangChain4j支持让AI智能体“使用工具”。例如,可以定义一个工具方法@Tool("查询用户订单信息"),让智能体在回答关于订单的问题时,自动调用后端服务查询真实数据。

与Spring AI的对比:Spring AI提供了类似的抽象,例如VectorStore接口和AiClient。其开发体验更“Spring化”,但当前版本(如1.0.0-M5)的文档和社区生态尚不如LangChain4j成熟。长期来看,两者都值得关注。

五、 总结
通过LangChain4j框架,Java开发者能够以声明式、模块化的方式高效构建功能强大的AI智能体。本文演示的RAG应用只是一个起点。通过组合不同的工具、模型和记忆机制,我们可以创造出能够理解复杂指令、与外部系统交互并完成闭环任务的下一代Java应用。随着Spring AI等官方项目的持续发力,Java在AI应用工程领域的地位必将愈发巩固,为开发者提供坚实可靠的智能底层架构。

目录
相关文章
|
6月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4570 90
|
6月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
6878 90
|
6月前
|
缓存 监控 Java
《深入理解Spring》性能监控与优化——构建高性能应用的艺术
本文系统介绍了Spring生态下的性能监控与优化实践,涵盖监控体系构建、数据库调优、缓存策略、线程池配置及性能测试等内容,强调通过数据驱动、分层优化和持续迭代提升应用性能。
|
6月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
6月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
6月前
|
存储 人工智能 前端开发
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
本文介绍如何利用Qoder、阿里云ADB Supabase和通义千问图像编辑模型,快速搭建AI手办生图Flutter应用。无需传统后端,实现从前端生成到数据存储、AI服务集成的全链路敏捷开发,展现Vibe Coding的高效实践。
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
|
6月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
6月前
|
自然语言处理 数据挖掘 关系型数据库
ADB AI指标分析在广告营销场景的方案及应用
ADB Analytic Agent助力广告营销智能化,融合异动与归因分析,支持自然语言输入、多源数据对接及场景模板化,实现从数据获取到洞察报告的自动化生成,提升分析效率与精度,推动数据驱动决策。
|
6月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
2557 79
|
6月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
420 3

热门文章

最新文章