沿用阿里的智能体定义,我们将基于SpringAI ChatClient开发的AI应用叫做单智能体应用;对于更复杂的应用场景,比如需要多个工具辅助工作,存在工作流切换的场景(举一个例子:输入一段评价,判断是好评还是差评,如果是好评,则自动回复多谢好评;如果是差评,则提取关键信息,将评价信息转发给人工客服,进行后续的售后维护等)称为多智能体应用
对于多智能体应用,使用python开发的小伙伴,更常接触的是LangGraph;对于java的生态下,目前也有两个替代的选择项
接下来我们来体验一下如何使用LangGraph4J来进行多智能体的开发
一、项目创建
1. 创建一个SpringAI项目
创建一个SpringAI项目,基本流程同 创建一个SpringAI-Demo工程
2. 添加Langgraph4j依赖
我们这里以智普大模型作为底层的LLM,因此对应的依赖除了langgraph4j之外就是智普的starter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <properties> <langgraph4j.version>1.6.0-rc4</langgraph4j.version> </properties>
<dependencies> <dependency> <groupId>org.bsc.langgraph4j</groupId> <artifactId>langgraph4j-springai-agentexecutor</artifactId> <version>${langgraph4j.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-zhipuai</artifactId> </dependency> </dependencies>
|
3. 参数配置
在配置文件中 application.yml,设置大模型的访问密钥
1 2 3 4 5 6 7 8 9 10 11 12 13
| spring: ai: zhipuai: api-key: ${zhipuai-api-key} chat: options: model: GLM-4-Flash
logging: level: org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug
|
4. 创建工具
我们这里创建一个工具类,内部提供两个工具,分别获取当前的时间和天气
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
public class TimeWeatherTools { @Tool(description = "传入时区,返回对应时区的当前时间给用户") public String getTimeByZoneId(@ToolParam(description = "需要查询时间的时区,如Asia/Shanghai, Europe/Paris") ZoneId area) { ZonedDateTime time = ZonedDateTime.now(area);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String ans = time.format(formatter); System.out.println("传入的时区是:" + area + "-" + ans); return ans; }
@Tool(description = "传入地点,返回对应地点的当前天气给用户") public String getWeatherByZoneId(@ToolParam(description = "需要查询天气的地区,如北京、上海") String area) { List<String> weathers = List.of("晴", "阴", "雨", "雪", "雷", "雾"); String ans = weathers.get((int) (Math.random() * weathers.size())); System.out.println("传入的地点是:" + area + "-" + ans); return ans; } }
|
5. 创建智能体
我们直接沿用官方的demo示例,来创建一个采用langGraph4j实现的基于智普大模型的智能体

1 2 3 4 5 6 7 8 9 10 11 12
| @RestController public class ChatController { private final CompiledGraph<AgentExecutor.State> workflow;
public ChatController(ChatModel chatModel) throws GraphStateException { workflow = AgentExecutor.builder() .chatModel(chatModel) .toolsFromObject(new TimeWeatherTools()) .build() .compile(); } }
|
6. 测试验证
在上面的Controller中,定义一个访问端点,实现智能体的访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| @RestController public class ChatController {
@GetMapping("/chat") public Object chat(String msg) { AgentExecutor.State last = null; int i = 0; for (NodeOutput<AgentExecutor.State> item : workflow.stream(Map.of("messages", new UserMessage(msg)))) { System.out.println(item); last = item.state(); System.out.printf("%02d : %s%n", i++, toStr(last.messages())); }
return last.lastMessage().map(Content::getText).orElse("NoData"); }
public String toStr(Object obj) { ObjectMapper objectMapper = new ObjectMapper(); try { return objectMapper.writeValueAsString(obj); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } }
|

从上面的输出也可以看出,大模型有四次的工具调用,一次是获取北京当前时间,一次是获取北京当前天气,一次是获取伦敦当前时间,一次是获取伦敦当前天气
直接使用langGraph4j实现多轮对话,虽然效果是实现了,从直观感觉上和SpringAI的ChatClient好像没有太大的差别
对langGraph4j不太了解的小伙伴,可能会有很多疑问,工作流体现在什么地方呢,条件决策又该如何使用呢?这个框架是怎么工作的呢?又该如何使用它来开发Agent呢?
二、总结
LangGraph4j 是一个 Java 库,用于构建基于大型语言模型 (LLM) 的有状态多代理应用程序。它受 Python 库 LangGraph 的启发,旨在与 Langchain4j 和 Spring AI 等流行的 Java LLM 框架无缝协作。
LangGraph4j 的核心功能是定义循环图,使不同的组件(代理、工具或自定义逻辑)能够以有状态的方式进行交互
本文只能算是初步看了一眼LangGraph4j,演示了如何创建一个智能体开发的项目,接下来我们将逐渐深入探究一下这个框架的使用理念
文中所有涉及到的代码,可以到项目中获取 https://github.com/liuyueyi/spring-ai-demo
微信公众号: 一灰灰Blog
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

打赏
如果觉得我的文章对您有帮助,请随意打赏。
微信打赏
支付宝打赏