责任链模式在Agent编排中的应用:让AI Agent学会“踢皮球”
本文介绍了责任链模式在AI Agent系统中的应用。该模式通过将请求沿处理链传递,直到找到能处理的节点,实现请求与处理者的解耦。文中以智能客服系统为例,展示了FAQ、技术文档和人工客服三类Agent如何通过责任链协作处理不同请求。代码示例演示了Java实现方式,并探讨了进阶应用如并行处理和动态权重分配。责任链模式天然适合Agent编排场景,具有扩展性强、耦合度低等优势,是构建灵活多Agent系统的
写在前面:
复杂的Agent系统往往需要多个专业Agent协作完成一个任务。但问题来了:当一个用户请求到达时,应该由哪个Agent来处理?是让一个“主管Agent”做路由分发,还是让Agent们自己决定谁能处理?后者正是责任链模式的核心思想——将请求沿着一条“链”传递,直到某个节点有能力处理它。
这种模式天然适合Agent编排场景:多个Agent各司其职,互不干扰,还能灵活扩展。今天这篇文章,我会用最通俗的例子讲清楚责任链模式,再结合Agent系统的实际代码,展示如何用它构建灵活、可扩展的多Agent协作框架。

一、什么是责任链模式?
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者链传递,直到有一个处理者能够处理该请求为止。每个处理者都有机会处理请求,也可以选择将请求传递给下一个处理者。
核心要点:
-
解耦请求发送者和接收者
-
多个对象都有机会处理请求
-
处理者可以动态组成链

二、生活中的例子
例子1:公司报销审批
员工提交报销单 → 组长审批(500元以内权限)→ 经理审批(500-5000元)→ 总监审批(5000元以上)。每一级都有处理权限,无法处理就往上“甩锅”。
例子2:客服工单流转
用户提交问题 → 机器人客服 → 人工客服 → 技术专家。机器人处理不了就转人工,人工处理不了就升级。
例子3:技术面试
应届生面试 → 技术面(基础)→ 项目面(深入)→ HR面(薪资)。每一轮都有不同的考察侧重点,上一轮通过才进入下一轮。
这些例子的共同点:请求沿着一条预先定义的路径传递,直到找到能处理它的对象。
三、在Agent系统中的应用
3.1 场景描述
假设我们构建一个智能客服Agent系统,需要处理三类用户请求:
-
基础问答:如“你们公司的地址在哪?” → 由FAQ Agent处理
-
技术问题:如“如何配置API密钥?” → 由技术文档Agent处理
-
投诉建议:如“我要投诉客服” → 由人工转接Agent处理
传统做法:写一个巨大的if-else路由,判断关键词后调用不同Agent。问题:新增一种请求类型就要改代码,Agent之间耦合严重。
责任链模式解法:将每个Agent封装成一个处理器,按优先级串联成链,请求依次经过每个Agent,直到某个Agent声明“我能处理”。
3.2 代码实现(Java版)
// 1. 定义处理器抽象类
public abstract class AgentHandler {
protected AgentHandler next;
public void setNext(AgentHandler next) {
this.next = next;
}
// 处理请求,如果不能处理则传递给下一个
public void handle(Request request) {
if (canHandle(request)) {
doHandle(request);
} else if (next != null) {
next.handle(request);
} else {
// 没有处理器能处理
System.out.println("没有Agent能处理该请求");
}
}
protected abstract boolean canHandle(Request request);
protected abstract void doHandle(Request request);
}
// 2. 具体处理器:FAQ Agent
public class FaqAgent extends AgentHandler {
@Override
protected boolean canHandle(Request request) {
return request.getCategory() == Category.FAQ
|| request.getQuestion().contains("地址")
|| request.getQuestion().contains("电话");
}
@Override
protected void doHandle(Request request) {
System.out.println("FAQ Agent 回答: " + answerFromKnowledgeBase(request));
}
}
// 3. 技术文档Agent
public class TechDocAgent extends AgentHandler {
@Override
protected boolean canHandle(Request request) {
return request.getQuestion().contains("API")
|| request.getQuestion().contains("配置");
}
@Override
protected void doHandle(Request request) {
// 调用RAG检索技术文档
String answer = ragService.search(request.getQuestion());
System.out.println("技术文档Agent 回答: " + answer);
}
}
// 4. 人工转接Agent
public class HumanAgent extends AgentHandler {
@Override
protected boolean canHandle(Request request) {
// 投诉类请求或前两个Agent都处理不了时,转到人工
return request.getCategory() == Category.COMPLAINT;
}
@Override
protected void doHandle(Request request) {
System.out.println("转接人工客服,工单已创建");
// 调用工单系统API
}
}
// 5. 构建责任链
public class AgentChain {
public static AgentHandler buildChain() {
FaqAgent faq = new FaqAgent();
TechDocAgent tech = new TechDocAgent();
HumanAgent human = new HumanAgent();
faq.setNext(tech);
tech.setNext(human);
return faq; // 返回链头
}
}
// 6. 使用
public class Client {
public static void main(String[] args) {
AgentHandler chain = AgentChain.buildChain();
Request req1 = new Request("你们公司在哪?", Category.FAQ);
chain.handle(req1); // FAQ Agent 回答
Request req2 = new Request("API怎么配置?", Category.TECH);
chain.handle(req2); // 技术文档Agent 回答
Request req3 = new Request("我要投诉!", Category.COMPLAINT);
chain.handle(req3); // 转接人工
}
}
3.3 责任链模式在Agent编排中的优势

3.4 进阶:支持并行+动态权重
实际Agent系统中,有时候需要多个Agent“投票”决定由谁处理,或者根据置信度分数选择最合适的节点。可以扩展责任链:
public class WeightedAgentHandler extends AgentHandler {
private double confidenceThreshold;
@Override
protected boolean canHandle(Request request) {
double score = calculateConfidence(request);
return score >= confidenceThreshold;
}
private double calculateConfidence(Request request) {
// 每个Agent根据自己的逻辑计算处理该请求的置信度
// FAQ Agent:关键词匹配度
// 技术Agent:向量相似度
return similarity;
}
}
// 链遍历时收集所有能处理的Agent,选置信度最高的执行
这种变体在多Agent协作框架(如AutoGen、CrewAI)中很常见:每个Agent声明自己的能力(Skills),调度器根据请求匹配最合适的Agent。
3.5 流程图:责任链驱动的Agent编排

四、总结
责任链模式在Agent编排中堪称“天然适配”——它将请求路由的职责分散到各个Agent节点,让每个Agent自己决定是否“接单”。相比中心化的路由分发,责任链模式带来了更好的扩展性、解耦性和动态性。
在Java生态中,Spring WebFlux的WebFilter、Servlet的FilterChain都是责任链模式的经典应用。而在AI Agent领域,无论是任务规划、工具调用、还是多Agent协作,责任链都能发挥巨大价值。
下次当你需要构建一个多Agent系统时,不妨先从责任链开始——它简单、可靠、易于理解,且足以应对大部分场景。
❓思考题:在你的多Agent系统中,如果多个Agent都声称“我能处理”同一个请求,你如何裁决?是给每个Agent打分选最高分,还是让第一个响应的优先?或者你用过其他编排模式(如黑板模式、发布-订阅)?欢迎分享你的实践。
更多推荐
所有评论(0)