Spring AI Alibaba ——智能体作为工具(Agent Tool)

💡 核心结论:一句话先记住

如果说多智能体(Multi-agent)是开了一家公司,那么 智能体作为工具(Agent Tool / Tool Calling 模式) 就是:老板(主 Agent)在前台接待客户,遇到具体脏活累活时,直接把小弟(子 Agent)当成“无情的干活机器(工具)”来调用。

记住最关键的一点:小弟(子 Agent)绝对不允许直接跟客户(用户)说话! 它们只能在后台默默干完活,把结果交还给老板,最后由老板向客户汇报。


🛑 一、 为什么要把 Agent 当工具?(解决什么痛点)

当你的系统越来越复杂时,如果只用一个 Agent,会遇到三大崩溃瞬间:

  1. 工具选择困难症: 给它塞了 50 个工具,它经常“拿错扳手”。
  2. 脑容量超载: 上下文和记忆越来越长,它根本抓不住重点。
  3. 缺乏专业性: 既要它写代码,又要它算高数,不如拆分成“程序员”和“数学家”。

🤔 模式大PK:工具调用(Tool Calling) vs 交接(Handoffs)

  • 工具调用(本篇重点): 集中式管理。老板控全场,小弟当黑盒工具,小弟不与用户对话。适合:结构化任务编排。
  • 交接(Handoffs): 去中心化管理。客服接单发现是技术问题,直接把客户“转交”给技术专员,新专员直接与用户对话。适合:跨领域客服转接。

📁 二、 怎么把 Agent 变成工具?(基础抄作业区)

大白话: 其实就是用 AgentTool.getFunctionToolCallback(子Agent) 把一个活生生的 Agent 包装成一把工具,塞给主 Agent!

💻 1. 极简基础版(主 Agent 调包子 Agent):

import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.agent.AgentTool;

// 1. 创建子Agent(打工人)
ReactAgent writerAgent = ReactAgent.builder()
        .name("writer_agent")
        .model(chatModel)
        .description("可以写文章") // ⭐ 老板全靠这句描述来决定用不用它!
        .instruction("你是一个知名的作家,擅长写作和创作。请根据用户的提问进行回答。")
        .build();

// 2. 创建主Agent(老板),把子Agent当工具挂载在身上
ReactAgent blogAgent = ReactAgent.builder()
        .name("blog_agent")
        .model(chatModel)
        .instruction("根据用户给定的主题写一篇文章。使用写作工具来完成任务。")
        .tools(AgentTool.getFunctionToolCallback(writerAgent)) // ⭐ 核心大法:活人变工具
        .build();

// 3. 用户只跟老板提需求
Optional<OverAllState> result = blogAgent.invoke("帮我写一个100字左右的散文");

🛠️ 三、 上下文工程:如何精准拿捏子 Agent 的输入与输出?

大白话: 老板派活,不能光说一句“你去写文章”,必须给明确的表格让它填!这就需要控制它的输入(Input)输出(Output)格式。

  1. 拿捏输入:让老板传结构化参数

官方提供了两种写法:写原生的 inputSchema (JSON 字符串),或者直接写 Java 类 inputType(框架自动转 JSON)。强烈推荐用 inputType,写代码最爽!

💻 输入控制(inputType)代码展示:

// 1. 定义一个 Java Record 作为输入表格
public record ArticleRequest(String topic, int wordCount, String style) {}

// 2. 子 Agent 强制要求按表格接活
ReactAgent writerAgent = ReactAgent.builder()
        .name("typed_writer_agent")
        .model(chatModel)
        .description("根据类型化输入写文章")
        .instruction("你是一个专业作家。请严格按照输入的 topic、wordCount 和 style 要求创作。")
        .inputType(ArticleRequest.class) // ⭐ 强制输入格式
        .build();

ReactAgent coordinatorAgent = ReactAgent.builder()
        .name("coordinator_agent")
        .model(chatModel)
        .instruction("你需要调用写作工具,并提供 JSON 格式的参数。")
        .tools(AgentTool.getFunctionToolCallback(writerAgent))
        .build();
  1. 拿捏输出:让小弟交规范的作业

同样支持 outputSchema (借助 BeanOutputConverter) 和 outputType。为了防小弟废话连篇,推荐直接上 outputType

💻 输出控制(outputType)代码展示:

// 1. 定义小弟必须交的作业格式
public class ArticleOutput {
    private String title;
    private String content;
    private int characterCount;
    // getters and setters 省略
}

// 2. 子 Agent 强制按格式交差
ReactAgent writerAgent = ReactAgent.builder()
        .name("writer_with_output_type")
        .model(chatModel)
        .description("写文章并返回类型化输出")
        .instruction("请创作文章并严格返回包含 title、content 和 characterCount 的结构化结果。")
        .outputType(ArticleOutput.class) // ⭐ 强制输出格式
        .build();

🚀 四、 终极完全体:多工具 + 全类型化(生产级必备)

大白话: 老板手下同时管着“写手”、“评审员”和“翻译”,老板会根据客户需求,自动把他们串起来用,并且所有交接全部使用严格的 Java 对象。

💻 生产级复合调度大招:

// 1. 定义输入输出(省略具体字段,参考前文)
public record ArticleRequest(String topic, int wordCount, String style) {}
public class ArticleOutput { /* title, content */ }
public class ReviewOutput { /* comment, approved, suggestions */ }

// 2. 打造极度规范的“写手”工具
ReactAgent writerAgent = ReactAgent.builder()
        .name("full_typed_writer")
        .model(chatModel)
        .description("负责根据主题创作文章,需要topic、wordCount等参数") // ⭐ 描述要准
        .instruction("根据结构化输入创作文章,并返回结构化输出。")
        .inputType(ArticleRequest.class)
        .outputType(ArticleOutput.class)
        .build();

// 3. 打造极度规范的“评审”工具
ReactAgent reviewerAgent = ReactAgent.builder()
        .name("typed_reviewer")
        .model(chatModel)
        .description("负责对文章进行评审润色")
        .instruction("对文章进行评审,返回评审意见。")
        .outputType(ReviewOutput.class)
        .build();

// 4. 老板(主 Agent)集结队伍!
ReactAgent orchestratorAgent = ReactAgent.builder()
        .name("orchestrator")
        .model(chatModel)
        .instruction("你可以访问多个专业工具。根据用户需求,先调用写作工具创作,有需要再调用评审工具。")
        .tools(
            AgentTool.getFunctionToolCallback(writerAgent), 
            AgentTool.getFunctionToolCallback(reviewerAgent)
        ) // ⭐ 挂上满身的神器
        .build();

// 5. 老板接客,内部疯狂流转
Optional<OverAllState> result = orchestratorAgent.invoke("请写一篇关于友谊的散文,约200字,写完记得评审一下");

🔥 避坑指南: 主 Agent 能不能准确叫对小弟,全看你子 Agent 的 description 写得好不好!描述不仅要写它“能干嘛”,最好顺带提一嘴“需要传什么”,千万别在这省字数。


🎯 终极秒记口诀

主从关系要搞清,老板接客小弟听;

活人化身无情具,ToolCallback 来绑定;

输入输出定格式,Type/Schema 控得精;

打工绝不理客户,交完结果闭上嘴;

描述说明写清楚,调度自如省心力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值