构建基于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天前
|
人工智能 自然语言处理 JavaScript
Playwright MCP在UI回归测试中的实战:构建AI自主测试智能体
Playwright MCP结合AI智能体,革新UI回归测试:通过自然语言驱动浏览器操作,降低脚本编写门槛,提升测试效率与覆盖范围。借助快照解析、智能定位与Jira等工具集成,实现从需求描述到自动化执行的闭环,推动测试迈向智能化、民主化新阶段。
|
6天前
|
Web App开发 人工智能 自然语言处理
利用Playwright MCP与LLM构建复杂的工作流与AI智能体
本文介绍如何通过Playwright MCP与大语言模型(LLM)结合,构建智能AI代理与自动化工作流。Playwright MCP基于Model Context Protocol,打通LLM与浏览器自动化的能力,实现自然语言驱动的网页操作。涵盖环境配置、核心组件、智能任务规划、自适应执行及电商采集、自动化测试等实战应用,助力高效构建鲁棒性强、可扩展的AI自动化系统。
|
6天前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
|
7天前
|
人工智能 定位技术 数据库
工具设计+动态检索:上下文工程如何让AI智能体像人类一样思考?
本文深入解析AI Agent时代的上下文工程,阐述其从提示工程的演进逻辑,剖析系统提示、工具设计与示例策划三大核心,并探讨长时程任务应对策略,揭示高效信息流管理对构建可靠Agent的关键作用。建议收藏细读。
79 0
|
9天前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
135 4
|
10天前
|
人工智能 定位技术 API
智能体(Agent):AI不再只是聊天,而是能替你干活
智能体(Agent):AI不再只是聊天,而是能替你干活
386 99
|
11天前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
|
17天前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
475 8
|
17天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
592 133
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
17天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
本文介绍如何在Spring AI中自定义Advisor实现日志记录、结构化输出、对话记忆持久化及多模态开发,结合阿里云灵积模型Qwen-Plus,提升AI应用的可维护性与功能性。
407 125
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发

热门文章

最新文章