spring-ai-alibaba 第三 ReAct Agent
官网地址
官网地址[https://java2ai.com/]
ReAct Agent 核心实现
ReAct Agent 的核心是"推理(Reasoning)"与"行动(Acting)"的循环
demo地址
demo源码[https://gitee.com/kcnf_open/spring-ai-sample/tree/master/ali-ai/ali-ai-sample1]
1. 定义工具类 (Tools)
package com.kcnf.ai.tool;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.function.Function;
@Component
public class MenuRecommendTool implements Function<MenuRecommendRequest, String> {
@Override
public String apply(MenuRecommendRequest taste) {
if (taste == null || !StringUtils.hasLength(taste.getTaste())) {
return "请告诉我你的口味偏好,比如:辣、甜、酸。";
}
if (taste.getTaste().contains("辣")) {
return "🌶️ 推荐菜单:麻辣香锅、水煮牛肉、酸辣粉。";
} else if (taste.getTaste().contains("甜")) {
return "🍰 推荐菜单:糖醋排骨、拔丝地瓜、杨枝甘露。";
} else if (taste.getTaste().contains("清淡")) {
return "🥬 推荐菜单:白灼菜心、山药排骨汤、清蒸鲈鱼。";
} else {
return "🥢 推荐菜单:宫保鸡丁、番茄炒蛋、家常豆腐。";
}
}
}
2. 配置 ReactAgent
package com.kcnf.ai.config;
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
import com.kcnf.ai.tool.MenuRecommendRequest;
import com.kcnf.ai.tool.MenuRecommendTool;
import org.springframework.ai.support.ToolCallbacks;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.function.FunctionToolCallback;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AgentConfig {
@Value("${spring.ai.dashscope.api-key}")
private String apiKey;
@Bean
public DashScopeChatModel chatModel() {
DashScopeApi dashScopeApi = DashScopeApi.builder()
.apiKey(apiKey)
.build();
return DashScopeChatModel.builder()
.dashScopeApi(dashScopeApi)
.build();
}
@Bean
public ToolCallback menuRecommendToolCallback(MenuRecommendTool menuTool) {
return FunctionToolCallback.builder("recommend_menu", menuTool)
.description("根据用户的口味偏好推荐合适的菜品")
.inputType(MenuRecommendRequest.class)
.build();
}
@Bean
public ReactAgent reactAgent(DashScopeChatModel chatModel, ToolCallback menuRecommendToolCallback) {
return ReactAgent.builder()
.name("点餐助手")
.model(chatModel)
.tools(menuRecommendToolCallback)
.systemPrompt("你是一个友好的餐厅点餐助手。你有推荐菜品的工具。当用户询问吃什么时,你需要调用工具来推荐。如果用户没有说明口味,请主动询问。")
.saver(new MemorySaver())
.build();
}
}
3. 提供 HTTP 接口
package com.kcnf.ai.controller;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
@Autowired
private ReactAgent reactAgent;
@SneakyThrows
@GetMapping("/ai/chat")
public String chat(@RequestParam String message, @RequestParam(defaultValue = "default-user") String userId) {
// 通过 threadId 隔离不同用户的会话,实现连续对话
RunnableConfig config = RunnableConfig.builder()
.threadId(userId)
.build();
// 调用 Agent 并返回结果
return reactAgent.call(message, config).getText();
}
}
4. 测试
http://localhost:8081/ai/chat?message=%E6%88%91%E6%83%B3%E5%90%83%E7%82%B9%E8%BE%A3%E7%9A%84&userId=1001

