Agents
Agents 将大语言模型与工具结合,创建具备任务推理、工具使用决策、工具调用的自动化系统,系统具备持续推理、工具调用的循环迭代能力,直至问题解决。
Spring AI Alibaba 提供了基于 ReactAgent 的生产级 Agent 实现。
一个 LLM Agent 在循环中通过运行工具来实现目标。Agent 会一直运行直到满足停止条件 —— 即当模型输出最终答案或达到迭代限制时。
ReactAgent 理论基础
什么是 ReAct
ReAct(Reasoning + Acting)是一种将推理和行动相结合的 Agent 范式。在这个范式中,Agent 会:
- 思考(Reasoning):分析当前情况,决定下一步该做什么
- 行动(Acting):执行工具调用或生成最终答案
- 观察(Observation):接收工具执行的结果
- 迭代:基于观察结果继续思考和行动,直到完成任务
这个循环使 Agent 能够:
- 将复杂问题分解为多个步骤
- 动态调整策略基于中间结果
- 处理需要多次工具调用的任务
- 在不确定的环境中做出决策
ReactAgent 的工作原理
Spring AI Alibaba 中的ReactAgent 基于 Graph 运行时构建。Graph 由节点(steps)和边(connections)组成,定义了 Agent 如何处理信息。Agent 在这个 Graph 中移动,执行如下节点:
- Model Node (模型节点):调用 LLM 进行推理和决策
- Tool Node (工具节点):执行工具调用
- Hook Nodes (钩子节点):在关键位置插入自定义逻辑
ReactAgent 的核心执行流程:
核心组件
Model(模型)
Model 是 Agent 的推理引擎。Spring AI Alibaba 支持多种配置方式。
基础模型配置
最直接的方式是使用 ChatModel 实例:
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
// 创建 DashScope API 实例
DashScopeApi dashScopeApi = DashScopeApi.builder()
.apiKey(System.getenv("AI_DASHSCOPE_API_KEY"))
.build();
// 创建 ChatModel
ChatModel chatModel = DashScopeChatModel.builder()
.dashScopeApi(dashScopeApi)
.build();
// 创建 Agent
ReactAgent agent = ReactAgent.builder()
.name("my_agent")
.model(chatModel)
.build();
高级模型配置
通过 ChatOptions 可以精细控制模型行为:
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
ChatModel chatModel = DashScopeChatModel.builder()
.dashScopeApi(dashScopeApi)
.defaultOptions(DashScopeChatOptions.builder()
.temperature(0.7) // 控制随机性
.maxTokens(2000) // 最大输出长度
.topP(0.9) // 核采样参数
.build())
.build();
常用参数说明:
temperature:控制输出的随机性(0.0-1.0),值越高越有创造性maxTokens:限制单次响应的最大 token 数topP:核采样,控制输出的多样性- 更多参数请参考 ChatModel 适配
Tools(工具)
工具赋予 Agent 执行操作的能力,支持顺序执行、并行调用、动态选择和错误处理。
定义和使用工具
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.function.FunctionToolCallback;
import java.util.function.BiFunction;
// 定义工具
public class SearchTool implements BiFunction<String, ToolContext, String> {
@Override
public String apply(
@ToolParam(description = "搜索关键词") String query,
ToolContext toolContext) {
return "搜索结果:" + query;
}
}
// 创建工具回调
ToolCallback searchTool = FunctionToolCallback
.builder("search", new SearchTool())
.description("搜索信息的工具")
.inputType(String.class)
.build();
// 使用多个工具
ReactAgent agent = ReactAgent.builder()
.name("my_agent")
.model(chatModel)
.tools(searchTool, weatherTool, calculatorTool)
.build();
工具错误处理
使用 ToolInterceptor 统一处理工具错误:
public class ToolErrorInterceptor extends ToolInterceptor {
@Override
public ToolCallResponse interceptToolCall(ToolCallRequest request, ToolCallHandler handler) {
try {
return handler.call(request);
} catch (Exception e) {
return ToolCallResponse.of(request.getToolCallId(), request.getToolName(),
"Tool failed: " + e.getMessage());
}
}
}
ReactAgent agent = ReactAgent.builder()
.interceptors(ToolErrorHandler.builder().build())
.build();
ReAct 循环示例