跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第16章 ReAct 实战:会推理的 AI 助手

16.1 ReAct 原理

16.1.1 ReAct 循环

ReAct = Reasoning(推理)+ Acting(行动)

循环过程:
┌──────────────────────────────────────┐
│ Thought: 我需要先查询用户的订单状态 │ ← 推理
│ Action: queryOrder({"id": "ORD-123"})│ ← 行动
│ Observation: 订单已发货,快递单号 SF...│ ← 观察
│ Thought: 用户还想知道物流详情 │ ← 继续推理
│ Action: trackLogistics({"no": "SF..."})│
│ Observation: 包裹已到达北京分拣中心 │
│ Thought: 信息足够了,可以回答用户 │
│ Final Answer: 您的订单已发货... │ ← 结束
└──────────────────────────────────────┘

关键:每一步都有"思考",不是盲目调用工具

16.2 基于 Spring AI Alibaba 构建 ReAct Agent

16.2.1 ReactAgent 核心实现

/**
* ReactAgent 核心逻辑(简化版)
*/
public class ReactAgent extends BaseAgent {

@Override
protected String doRun(String input) {
List<Message> messages = new ArrayList<>();
messages.add(new SystemMessage(buildSystemPrompt()));
messages.add(new UserMessage(input));

for (int i = 0; i < maxIterations; i++) {
// 1. 调用 LLM,让它思考下一步
ChatResponse response = chatModel.call(new Prompt(messages,
DashScopeChatOptions.builder()
.functionCallbacks(toFunctionCallbacks(tools))
.build()
));

AssistantMessage assistant = response.getResult().getOutput();
messages.add(assistant);

// 2. 检查是否有工具调用
if (CollectionUtils.isEmpty(assistant.getToolCalls())) {
// 没有工具调用 → LLM 认为任务完成,返回最终回答
return assistant.getText();
}

// 3. 执行工具调用
for (ToolCall toolCall : assistant.getToolCalls()) {
String result = executeTool(toolCall);
// 4. 将工具结果作为 Observation 加入消息
messages.add(new ToolResponseMessage(toolCall.id(), result));
}
// 继续循环,让 LLM 基于 Observation 继续思考
}
return "达到最大迭代次数,任务未完成";
}

private String buildSystemPrompt() {
StringBuilder sb = new StringBuilder(systemPrompt);
sb.append("\n\n你可以使用以下工具:\n");
for (AgentTool tool : tools) {
sb.append("- ").append(tool.getName()).append(": ").append(tool.getDescription()).append("\n");
}
sb.append("\n每一步请先思考(Thought),再决定行动(Action)。");
return sb.toString();
}
}

16.2.2 完整实战:客服 Agent

/**
* 智能客服 Agent —— 能查订单、查物流、处理退款
*/
@Service
public class CustomerServiceAgent {

@Autowired
private ChatModel chatModel;
@Autowired
private OrderService orderService;
@Autowired
private LogisticsService logisticsService;
@Autowired
private RefundService refundService;

public String handle(String userMessage) {
ReactAgent agent = ReactAgent.builder()


🔒 解锁完整内容

本章剩余内容需要解锁后查看

以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 26 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

16.3 Agent 记忆管理

16.3.1 短期记忆(对话内)

16.3.2 长期记忆(跨对话)

16.4 Agent 执行链路追踪