在构建基于大语言模型(LLM)的应用时,开发者经常面临一个困惑:我该如何控制模型的输入输出?又该如何管理智能体(Agent)的复杂执行流程?
在 Spring AI 生态系统中,你可能会遇到三个相似但截然不同的概念:
Spring AI Core 的
AdvisorsSpring AI Alibaba Agent 的
HooksSpring AI Alibaba Agent 的
Interceptors
很多开发者容易将它们混为一谈。本文将通过通俗易懂的比喻、架构对比和实战代码,彻底厘清这三者的区别、联系以及最佳使用场景。
1. 核心概念速览
为了直观理解,我们先给它们贴上简单的标签:
Advisors (顾问):专注于 “单次对话”。它是 LLM 调用层面的拦截器,负责优化 Prompt、管理记忆、解析输出。
Hooks (钩子):专注于 “Agent 生命周期”。它是事件监听器,在 Agent 开始、结束或状态变更时触发,用于监控和状态管理。
Interceptors (拦截器):专注于 “具体动作执行”。它是工具调用或模型请求的守门员,负责重试、熔断、权限校验等逻辑。
一句话总结:
Advisors 让模型聊得更好;Hooks/Interceptors 让 Agent 跑得更稳、更可控。
2. 形象比喻:餐厅运营体系
想象你正在经营一家高级餐厅:
LLM (大模型) 是 厨师。
Agent (智能体) 是 餐厅经理,他负责接单、指挥厨师、安排服务员、处理突发状况。
3. 深度技术对比
3.1 作用层级不同
3.2 设计哲学不同
Advisors 是“无状态”或“浅状态”的:
它的设计初衷是增强单一的 Chat 交互。例如,MessageChatMemoryAdvisor只是把历史记录塞进 Prompt 里,它并不关心这次对话之后 Agent 要去干什么。Hooks/Interceptors 是“强状态”和“流程导向”的:
Agent 是一个循环过程(观察 -> 思考 -> 行动)。Hooks 可以读取 Agent 当前的所有变量,决定下一步是否继续;Interceptors 可以拦截具体的 Tool 执行,决定是重试还是报错。
4. 实战代码对比
场景 A:使用 Advisors 优化单次对话
假设你只需要一个简单的聊天机器人,带有记忆功能。
// Spring AI Core 风格
@Autowired
private ChatClient chatClient;
public String chat(String userMessage) {
return chatClient.prompt()
// 1. 注入历史记忆
.advisors(new MessageChatMemoryAdvisor(chatMemory))
// 2. 失败自动重试
.advisors(new RetryAdvisor(3))
.user(userMessage)
.call()
.content();
}特点:简单直接,适用于非 Agent 场景或 Agent 内部的底层 LLM 调用优化。
场景 B:使用 Hooks/Interceptors 构建健壮 Agent
假设你要构建一个能调用外部 API、需要人工确认高风险操作、且具备容错能力的智能体。
// Spring AI Alibaba Agent 风格
ReactAgent agent = ReactAgent.builder()
.name("customer_service_agent")
.model(chatModel)
.tools(refundTool, queryOrderTool)
// --- Hooks: 控制流程与状态 ---
// 1. 长对话自动压缩,防止 Token 溢出
.hooks(SummarizationHook.builder().maxTokensBeforeSummary(4000).build())
// 2. 高风险操作前暂停,等待人工审批
.hooks(HumanInTheLoopHook.builder()
.approvalOn("refundTool", ToolConfig.builder().description("请确认退款").build())
.build())
// --- Interceptors: 控制执行可靠性 ---
// 3. 工具调用失败自动重试 2 次
.interceptors(ToolRetryInterceptor.builder().maxRetries(2).build())
// 4. 检测并脱敏用户输入中的手机号/邮箱
.interceptors(PIIDetectionInterceptor.builder().build())
.build();
// 执行 Agent
agent.call("帮我查询订单并申请退款");特点:控制了 Agent 的“大脑”如何思考、“手脚”如何行动,以及整个流程如何监控。
5. 常见误区与最佳实践
误区 1:“我用了 Advisor 做记忆,就不需要 Hook 了?”
纠正:Advisor 的记忆是面向 LLM 的(放入 Context Window),而 Hook 可以管理更复杂的业务状态(如存入数据库、Redis)。对于长运行时的 Agent,建议使用 SummarizationHook 来管理长期上下文,而用 MessageChatMemoryAdvisor 管理短期滑动窗口。
误区 2:“Interceptors 和 Advisors 都能做重试,选哪个?”
纠正:
如果是 LLM 本身 超时或报错,用
RetryAdvisor。如果是 调用的工具(如 API 接口)报错,用
ToolRetryInterceptor。最佳实践:两者可以共存。LLM 重试保证“大脑”在线,工具重试保证“手脚”灵活。
误区 3:“Hooks 可以修改 LLM 的输出吗?”
纠正:Hooks 主要修改的是 Agent 的状态(State) 或 消息列表(Messages),而不是直接修改 LLM 的原始文本输出。如果你想格式化 LLM 的输出为 JSON,应该在底层 ChatClient 中使用 BeanOutputAdvisor。
6. 架构融合:它们如何协同工作?
在一个生产级的 Spring AI Alibaba 应用中,这三者通常是分层协作的:
graph TD
User[用户请求] --> Agent[ReactAgent]
subgraph Agent Layer [Spring AI Alibaba Agent]
HookStart[Hook: beforeAgent<br/>记录开始时间/初始化状态]
Loop{Agent Loop}
HookEnd[Hook: afterAgent<br/>记录结束时间/清理资源]
Loop --> InterceptorTool[Interceptor: ToolExecution<br/>权限校验/重试/缓存]
InterceptorTool --> Tool[外部工具/API]
Loop --> LLMCall[LLM Call]
end
subgraph ChatClient Layer [Spring AI Core]
LLMCall --> AdvisorMem[Advisor: Memory<br/>注入历史消息]
AdvisorMem --> AdvisorPrompt[Advisor: Prompt Enhance<br/>优化提示词]
AdvisorPrompt --> Model[LLM Model]
end
Tool --> Loop
Model --> Loop
Loop --> HookEnd
HookStart --> Loop外层 (Agent):Hooks 监控整体流程,Interceptors 保障工具调用的稳定性。
内层 (ChatClient):Advisors 优化每一次与 LLM 的交互质量。
7. 总结:什么时候用什么?
结论:
不要将它们是互斥的。Advisors 是微观的对话优化器,Hooks/Interceptors 是宏观的流程控制器。 在构建复杂的 Agent 应用时,组合使用这三者,才能打造出既聪明又稳健的智能体。
评论区