Java AI智能体开发实战指南:从零构建企业级智能代理案例

随着大语言模型(LLM)的普及,Java AI智能体开发已经不再是科幻小说中的概念,而是企业级应用中实实在在落地的技术方案。AI智能体(Agent)能够自主感知环境、制定计划、调用工具并执行任务,在客服、内容生成、无人共享服务等领域展现出了极强的实用价值。本文将从零开始,结合企业级技术栈(Spring Boot、MyBatis Plus、UniApp等),手把手带您构建一个具备记忆、工具调用和流程控制能力的智能代理案例。

为什么选择 Java 做 AI 智能体? 在大规模企业系统中,Java 生态的稳定性、丰富的第三方库(如 LangChain4j、Spring AI)以及成熟的微服务架构(Spring Cloud)使其成为构建生产级 AI 系统的语言。


一、AI智能体核心架构设计

一个典型的 AI 智能体包含以下几个核心模块:

  1. 感知模块:接收用户输入(文本、图片、语音等)。
  2. 思考与规划模块:核心是LLM推理,将复杂任务分解为子步骤。
  3. 记忆模块:短期记忆(当前会话)与长期记忆(持久化知识库)。
  4. 工具调用模块:封装外部API、数据库、文件系统等能力。
  5. 执行模块:协调各模块完成终任务。

在 Java 中,我们可以使用 LangChain4j 框架(或 Spring AI)快速搭建上述架构。LangChain4j 提供了对 OpenAI、通义千问等模型的统一抽象,同时内置了记忆管理和工具调用的支持。

技术选型建议(参考真实项目)

根据多个已落地的 AI 产品项目(如无人共享羽毛球、AI数字人平台)的经验,推荐以下技术组合:

技术栈
后端框架 Spring Boot 3.x + MyBatis Plus
数据库 MySQL 8.0
LLM 集成 LangChain4j + OpenAI / 本地 Ollama
消息队列 RabbitMQ(异步处理)
前端/小程序 UniApp(Vue语法,多端适配)
管理后台 Vue + Element UI

二、开发环境搭建与基础工程创建

2.1 初始化 Spring Boot 项目

使用 Spring Initializr 创建项目,关键依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
    <version>0.35.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
</dependency>
<!-- 数据库操作 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.7</version>
</dependency>

2.2 配置 LLM 连接

application.yml 中配置 API Key(以 OpenAI 为例,实际生产需加密存储):

langchain4j:
  open-ai:
    chat-model:
      api-key: ${OPENAI_API_KEY}
      model-name: gpt-4o-mini
      temperature: 0.7
    # 如需本地模型,可使用 Ollama 的 OpenAI 兼容接口
    # base-url: http://localhost:11434/v1

提示:若涉及敏感信息,建议通过 Vault 或环境变量注入,避免硬编码。


三、智能体核心逻辑实现

3.1 定义智能体实体与记忆持久化

参考知识库中“AI系统机器人”的架构,我们需要存储用户会话历史。创建一个 Conversation 实体:

@Data
@TableName("conversation")
public class Conversation {
    private Long id;
    private String userId;
    private String sessionId;
    private String messages;  // JSON 字符串,存储历史消息
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

使用 MyBatis Plus 的 BaseMapper 进行持久化操作,LangChain4j 提供了 ChatMemory 接口,我们可以编写一个基于 MySQL 的自定义实现:

@Component
public class DatabaseChatMemory implements ChatMemory {

    @Autowired
    private ConversationMapper mapper;

    @Override
    public List<ChatMessage> messages(Object memoryId) {
        // 根据 sessionId 查询并反序列化
    }

    @Override
    public void add(Object memoryId, ChatMessage message) {
        // 追加消息并更新数据库
    }

    @Override
    public void clear(Object memoryId) {
        // 删除该会话
    }
}

3.2 工具调用:让智能体“动手干活”

一个强大的智能体需要能够调用外部服务。参考“无人共享羽毛球”系统的订单处理流程,我们设计一个工具接口:

@Slf4j
@Component
@ToolAgent  // LangChain4j 注解,标记该类为工具提供者
public class VenueBookingTool {

    @Tool("根据用户ID查询可预订的场地类型")
    public List<String> getAvailableVenues(@P("userId") String userId) {
        // 调用场馆服务,返回如 ["羽毛球1号场", "羽毛球2号场"]
        return Arrays.asList("羽毛球1号场", "羽毛球2号场");
    }

    @Tool("生成预订订单并返回订单号")
    public String createOrder(@P("venueId") String venueId,
                              @P("startTime") String startTime,
                              @P("userId") String userId) {
        // 插入订单表,返回订单ID
        return "ORD" + System.currentTimeMillis();
    }
}

技术要点@Tool 注解中的描述是 LLM 理解工具功能的关键,一定要写清楚参数的类型和作用。描述越准确,智能体调用工具的准确率越高。

3.3 构建主流程:AI智能体循环

核心服务类如下,该代码整合了记忆、工具和 LLM 推理:

@Service
public class AgentService {

    @Autowired
    private ChatLanguageModel chatModel;
    @Autowired
    private ToolExecutor toolExecutor;
    @Autowired
    private DatabaseChatMemory memory;

    public String processRequest(String sessionId, String userInput) {
        // 1. 加载历史记忆
        ChatMemory cm = ChatMemoryFactory.create(sessionId, memory);

        // 2. 创建包含工具的 LLM 客户端
        AiService aiService = AiServices.builder(MyAgent.class)
                .chatLanguageModel(chatModel)
                .tools(new VenueBookingTool(), new PaymentTool())
                .chatMemory(cm)
                .build();

        // 3. 执行并返回结果
        return aiService.chat(userInput);
    }
}

其中 MyAgent 是一个简单的接口,定义了对话方法:

public interface MyAgent {
    String chat(String userMessage);
}

四、记忆、信号与流程控制进阶

4.1 短期与长期记忆的分层设计

高质量的企业级智能体需要区分不同类型的记忆:

  • 短期记忆:存放近 N 轮对话,确保上下文不超限(LLM 上下文窗口有限)。可通过滑动窗口实现。
  • 长期记忆:关键事实、用户偏好、业务实体关系。参考知识库中提供的“AI原创数字人”系统,我们可以将用户画像持久化到 MongoDB 或 Redis。

使用 Spring 的 @Async 注解异步更新长期记忆,避免阻塞主流程。

4.2 信号处理与主动推送

参照“AI系统机器人7.0”中的轮训账号与热榜板块功能,智能体在某些场景下需要主动触发动作(如定时任务、订单状态变更通知)。实现方式:

  1. 消息队列:利用 RabbitMQ 的延迟队列,定时发送信号给智能体。
  2. WebSocket:建立长连接,服务端主动推送消息给智能体或客户端。

示例:当用户预订场地超时未支付,主动询问:

@Component
@Slf4j
public class OrderTimeoutListener {

    @RabbitListener(queues = "order.timeout")
    public void handleTimeout(String orderId) {
        // 从数据库获取用户ID
        String userId = orderService.getUserIdByOrder(orderId);
        // 调用智能体主动发送消息(通过 WebSocket 建立连接)
        agentWebSocket.sendMessage(userId, "您有一个订单即将超时,是否继续?");
    }
}

4.3 多平台适配方案

知识库中的多个项目都采用了 UniApp 多端适配(小程序、公众号、H5、安卓、iOS)。对于智能体的输出,后端应统一返回 Markdown 或 JSON 格式,前端根据平台渲染:

  • 安卓/iOS:使用 WebView 渲染。
  • 公众号:直接使用公众号接口的图文消息。

五、案例整合:构建一个智能客服代理

假设我们要为“无人共享羽毛球”系统开发一个智能客服:

场景:用户问“我预约的明天下午3点的场地,可以帮我改成4点吗?”

智能体处理流程

  1. LLM 识别意图:修改订单。
  2. 调用 QueryOrderTool 查询用户当前订单。
  3. 调用 ModifyOrderTool 修改时间,并返回新订单详情。
  4. 将结果通过记忆模块存入数据库。

代码片段(仅展示工具类新增部分):

@Tool("查询用户的近一条有效订单")
public String queryLastOrder(@P("userId") String userId) {
    // 使用 MyBatis Plus 查询
    LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(Order::getUserId, userId)
           .orderByDesc(Order::getCreateTime)
           .last("LIMIT 1");
    Order order = orderMapper.selectOne(wrapper);
    return order != null ? order.toJsonString() : "无有效订单";
}

注意:生产环境中,工具方法应包含完整的参数校验、异常处理以及日志记录。建议每个工具方法返回统一的结果封装类(如 Result<T>)。


问答区(FAQ)

Q1:Java AI智能体开发哪些框架推荐?

对于企业级 Java AI 智能体开发,目前成熟的框架是 LangChain4j,它提供了对多种 LLM(OpenAI、通义千问、本地模型)的统一抽象,且内置了记忆、工具调用、RAG 等模块。如果您的项目已在使用 Spring Boot,也可以考虑 Spring AI,它的集成更紧密,但工具生态相对较新。

Q2:没有 GPU 资源,如何部署智能体?

可以完全依赖云端大模型 API(如 OpenAI、阿里云通义千问)。本地只需运行 Spring Boot 应用,成本较低。如果数据安全要求高,可使用 Ollama 在本地部署轻量级模型(如 Qwen2.5-7B),并通过 OpenAI 兼容接口集成。

Q3:如何保证工具的调用准确率?

  • 工具描述的 @Tool 注解中写清功能、参数类型和输出格式
  • 对复杂的工具,添加 few-shot 示例(在 Prompt 中给 LLM 几个正确调用的例子)。
  • 引入 验证机制:LLM 返回工具调用后,先校验参数,不合格则让 LLM 重试。

Q4:智能体的会话记忆需要存储多久?

根据业务需求决定:

  • 临时客服:保存 30 天后自动清理。
  • 订阅服务:长期保存,但需控制单条记录体积(定期剪枝)。
    使用 MySQL 的 TINYINT 字段标记是否活跃,配合定时任务进行归档。

Q5:这篇文章中的代码可以直接用于生产吗?

本文提供的代码是开发原型示例,生产环境还需要补充:

  • 全面的异常处理(如 LLM 调用超时、数据库连接失败)。
  • 安全防护(防注入、API Key 加密)。
  • 单元测试与集成测试。
  • 分布式部署的幂等性设计。

通过以上实战,相信您已经掌握了如何使用 Java 生态构建一个具备记忆、工具调用和多平台适配能力的 AI 智能体。核心技术点复用自多个开源项目的经验(如共享服务、AI 内容平台),希望这份指南能为您在企业级 AI 落地的道路上提供切实的帮助。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐