使用Spring AI Alibaba构建智能体Agent

简介: 本文详解使用Spring AI Alibaba框架,结合DashScope和React Agent,通过两个实战案例(基础测试+生产级应用),教你快速构建Java AI智能体

前言

随着大语言模型(LLM)技术的快速发展,构建智能Agent应用变得越来越简单。本文将通过两个实际的代码示例,展示如何使用Spring AI Alibaba框架构建功能丰富的天气查询Agent,从基础的测试实现到生产级的完整应用。

技术栈概述

  • Spring AI Alibaba: 阿里巴巴开源的AI应用开发框架
  • DashScope: 阿里云的AI模型服务平台
  • React Agent: 基于ReAct(Reasoning and Acting)范式的智能代理

示例一:SimpleTest - 快速入门

添加核心依赖

<dependencies>
      <!-- Spring AI Alibaba Agent Framework -->
      <dependency>
          <groupId>com.alibaba.cloud.ai</groupId>
          <artifactId>spring-ai-alibaba-agent-framework</artifactId>
          <version>1.1.2.0</version>
      </dependency>

      <!-- DashScope ChatModel 支持(如果使用其他模型,请跳转 Spring AI 文档选择对应的 starter) -->
      <dependency>
          <groupId>com.alibaba.cloud.ai</groupId>
          <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
          <version>1.1.2.0</version>
      </dependency>
</dependencies>

代码结构分析

@Test
void agentTest() throws GraphRunnerException {
   
    // 1. 初始化 DashScope API
    DashScopeApi dashScopeApi = DashScopeApi.builder()
            .apiKey(System.getenv("AliQwen_API"))
            .build();

    // 2. 创建 ChatModel
    ChatModel chatModel = DashScopeChatModel.builder()
            .dashScopeApi(dashScopeApi)
            .build();

    // 3. 定义天气工具
    ToolCallback weatherTool = FunctionToolCallback.builder("get_weather", new WeatherTool())
            .description("获取某个城市的天气")
            .inputType(String.class)
            .build();

    // 4. 构建React Agent
    ReactAgent agent = ReactAgent.builder()
            .name("weather_agent")
            .model(chatModel)
            .tools(weatherTool)
            .systemPrompt("你是一个非常有帮助的助手")
            .saver(new MemorySaver())
            .build();

    // 5. 调用Agent
    AssistantMessage response = agent.call("上海今天天气怎么样?");
    System.out.println(response.getText());
}

核心特性

  1. 简洁的配置: 通过Builder模式快速构建Agent
  2. 工具集成: 使用FunctionToolCallback将自定义函数包装为Agent可调用的工具
  3. 内存存储: 使用MemorySaver保存对话历史
  4. 中文支持: 完整的中文提示词和工具描述

自定义工具实现

class WeatherTool implements BiFunction<String, ToolContext, String> {
   
    @Override
    public String apply(String city, ToolContext toolContext) {
   
        return city + "今天天气非常好!";
    }
}

这个简单的工具类展示了如何将业务逻辑封装为Agent可调用的函数。

示例二:RealAgent - 真实的智能体

高级特性概览

相比SimpleTest,RealAgent展示了更多生产级特性:

  1. 精细的模型配置
  2. 多工具协同
  3. 结构化输出
  4. 对话上下文管理

核心代码解析

1. 系统提示词设计

String SYSTEM_PROMPT = """
        你是一位擅长说**天气冷笑话/谐音梗**的专业天气预报员。

        你可以使用两个工具:

        - **get_weather_for_location**:用于获取指定地点的天气
        - **get_user_location**:用于获取用户当前所在位置

        如果用户询问天气,**必须先确认地点**。
        如果从问题中能判断出他们指的是**自己所在的地方**,
        就使用 **get_user_location** 工具获取他们的位置。
        """;

这个提示词体现了几个重要设计原则:

  • 角色定位: 明确Agent的身份和特色
  • 工具说明: 清晰描述可用工具的功能
  • 行为约束: 规定了工具使用的逻辑顺序

2. 模型参数优化

ChatModel chatModel = DashScopeChatModel.builder()
        .dashScopeApi(dashScopeApi)
        .defaultOptions(DashScopeChatOptions.builder()
                .model(DashScopeChatModel.DEFAULT_MODEL_NAME)
                .temperature(0.5)      // 平衡创造性和准确性
                .maxToken(1000)        // 控制响应长度
                .build())
        .build();

3. 多工具协同

// 天气查询工具
ToolCallback getWeatherTool = FunctionToolCallback
        .builder("getWeatherForLocation", new WeatherForLocationTool())
        .description("获取一个给定城市的天气")
        .inputType(String.class)
        .build();

// 用户定位工具
ToolCallback getUserLocationTool = FunctionToolCallback
        .builder("getUserLocation", new UserLocationTool())
        .description("根据User Id获取用户位置")
        .inputType(String.class)
        .build();

4. 结构化输出配置

ReactAgent agent = ReactAgent.builder()
        // ... 其他配置
        .outputType(ResponseFormat.class)  // 指定输出格式
        .hooks(humanInTheLoopHook)
        .build();

5. 对话上下文管理

RunnableConfig runnableConfig = RunnableConfig.builder()
        .threadId(Thread.currentThread().getId() + "")
        .build();

// 第一次调用
AssistantMessage response1 = agent.call("上海今天天气怎么样", runnableConfig);

// 第二次调用(保持上下文)
AssistantMessage response2 = agent.call("明天天气怎么样", runnableConfig);

通过RunnableConfigthreadId实现多轮对话的上下文保持。

总结

通过这两个示例,我们可以看到Spring AI Alibaba框架在构建智能Agent应用方面的强大能力:

  • SimpleTest展示了快速原型开发的能力,适合概念验证和学习
  • RealAgent则创建了一个基础的 ReactAgent,接下来可以:
    • 探索更多的工具集成
    • 学习如何使用不同的 Checkpoint 实现对话持久化
    • 了解如何使用 Hooks 扩展 agent 功能
    • 学习如何创建多 agent 系统

参考资料

目录
相关文章
|
19天前
|
存储 人工智能 Java
吃透 Spring AI Alibaba 多智能体|四大协同模式+完整代码
本文详细讲解 Spring AI Alibaba Multi-Agent 多智能体架构,包含顺序执行、并行执行、LLM 路由、监督者四大协同模式,搭配可运行代码示例与真实业务场景,从零带你上手多智能体开发。
696 3
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
1452 4
|
19天前
|
人工智能 前端开发 Java
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
本文围绕 Spring AI 中的流式输出与响应式编程展开,重点解释了传统一次性响应与流式返回的差异,以及 Flux 在异步数据流中的核心作用。文章结合 ChatModel.stream() 与 ChatClient 的多种代码示例,说明如何实现 AI 内容的边生成边返回,并帮助读者理解流式调用在用户体验、性能和长文本场景中的实际价值。
405 4
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
|
2月前
|
人工智能 Java 决策智能
用Spring AI Alibaba把MultiAgent实现从5天压到5小时
本文详解Spring AI Alibaba新版本的Multi-agent能力,涵盖React/Planning核心模式、手写框架与成熟框架差异,并通过Plan-Execute实战示例,展示如何基于Graph工作流快速构建可扩展、易维护的智能体系统,助力Java开发者高效落地AI应用。
用Spring AI Alibaba把MultiAgent实现从5天压到5小时
|
22天前
|
人工智能 自然语言处理 Java
大模型应用开发5-SpringAIalibaba实战
本文介绍了SpringAIAlibaba开源项目,该项目基于SpringAI构建,为阿里云通义系列模型提供Java开发实践。主要内容包括: 基础使用:配置模型API、依赖引入、调用示例,支持同步和流式调用; 多种集成方式:对接本地Ollama模型、ChatClient高级API、SSE流式输出; 核心功能实现:提示词模板、结构化输出、持久化内存、文本生成图片/语音; 高级能力:向量数据库、RAG增强检索、工具调用(Tool Calling); MCP协议:标准化工具调用方案,实现服务端工具共享;
|
6月前
|
人工智能 监控 Java
构建定时 Agent,基于 Spring AI Alibaba 实现自主运行的人机协同智能 Agent
借助 Spring AI Alibaba 框架,开发者可快速实现定制化自动定时运行的 Agent,构建数据采集、智能分析到人工参与决策的全流程AI业务应用。
2153 95
|
15天前
|
NoSQL Java 数据库
【SpringAIAlibaba新手村系列】(11)Embedding 向量化与向量数据库
本文围绕 Embedding 与向量数据库展开,讲解了文本向量化、相似度检索和 VectorStore 的基本用法,并结合 SimpleVectorStore 示例说明了 Spring 中自动装配与手动注册 Bean 的区别,为后续学习 RAG 打下基础。
239 4
【SpringAIAlibaba新手村系列】(11)Embedding 向量化与向量数据库
|
存储 人工智能 Java
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比
本章深度解析 Spring AI 中 `ChatModel`(底层接口)与 `ChatClient`(高级封装)的本质区别:前者如“手动挡”,精准控制但需写大量样板代码;后者似“智能点餐机”,链式调用、支持系统提示、模板、工具调用等,开发高效。初学者推荐优先使用 `ChatClient`。
294 0
【SpringAIAlibaba新手村系列】(3)ChatModel 与 ChatClient 的深度对比

热门文章

最新文章

下一篇
开通oss服务