一、案例需求
在Java项目已经设置好Ai-Agent(包括mongodb记忆库、流式聊天模型qwenStreamingChatmodel、向量数据库Pincone、工具类tools)的基础上,实现对阿里百炼平台上自定义好的智能体的调用。

二、详细步骤
1. 在阿里云百炼平台https://bailian.console.aliyun.com/?tab=app#/app-center上创建应用。

2. 选择能够调用mcp的智能体应用

3.设置智能体的角色、任务、限制等规则。这里我想创建一个数字人生成智能体。

4. 在智能体技能处,添加mcp服务

5. mcp开通界面一般会配备好该平台的相关链接,申请完后在本界面中填入并开通。

6. 勾选mcp服务后,设置短期记忆,可在右侧文本对话中测试智能体的mcp调用能力。确认无误后右上角发布。

7. 发布后自动跳转到调用页面,我们查看API,了解如何在java项目中调用本智能体。

8. 根据使用指南,获取阿里百炼平台的API Key(建议存在系统环境变量中,命名为DASH_SCOPE_API_KEY)。并记录刚才创建好的智能体APP-ID。

9. 在java的pom.xml中添加java SDK依赖

10. 复制指南上的快速调用智能体方法,稍后我们在此基础上稍作改动,再加入java项目。

11. 在我们的tools目录里,新建bailianTool工具类。由于我们本项目已经有建立好的Ai-Agent,这里只想把百炼平台的智能体作为工具辅助已有Agent。
代码如下:
@Component
public class BailianTool {
@Tool("当用户需要生成数字人视频时,使用本工具调用阿里百炼智能体进行生成")
public String callBailianAgent(@P("用户传来的关于数字人生成需求的消息") String message) {
System.out.println("=== 百炼工具被调用 ===");
System.out.println("接收到的消息: " + message);
System.out.println("消息长度: " + message.length());
System.out.println("====================");
try {
ApplicationParam param = ApplicationParam.builder()
.apiKey(System.getenv("DASH_SCOPE_API_KEY"))
.appId("add5ccea74ee4c7bb29a6a821669fcd0")
.prompt(message)
.build();
Application application = new Application();
ApplicationResult result = application.call(param);
if (result != null && result.getOutput() != null) {
// 返回mcp调用的回复信息:
return result.getOutput().getText();
} else {
return "未收到有效响应";
}
} catch (Exception e) {
return "调用百炼智能体失败: " + e.getMessage();
}
}
}

12. 给我们已有的Ai-Agent(XiaozhiAgentMCP的tools中显示指定工具类bailianTool。

13. 在Controller层注入bailianTool工具,在XiaozhiAgentMCP的基础上使用构建者模式,新增百炼Tool。
完整代码如下:
@Tag(name = "硅谷小智MCP版V2")
@RestController
@RequestMapping("/xiaozhi-mcp2")
public class XiaozhiMCPV2Controller {
@Autowired
private QwenStreamingChatModel qwenStreamingChatModel;
@Autowired
private ChatMemoryProvider chatMemoryProviderXiaozhi;
@Autowired
private AppointmentTools appointmentTools;
@Autowired
private ContentRetriever contentRetrieverXiaozhiPincone;
@Autowired
private BailianTool bailianTool; // 注入百炼工具
@Operation(summary = "对话")
@PostMapping(value = "/chat2", produces = "text/stream;charset=utf-8")
public Flux<String> chat(@RequestBody ChatForm chatForm) {
// 创建集成了百炼工具的Agent
XiaozhiAgentMCP xiaozhiAgentMCP = createEnhancedAgent();
return xiaozhiAgentMCP.chat(chatForm.getMemoryId(), chatForm.getMessage());
}
private XiaozhiAgentMCP createEnhancedAgent() {
return AiServices.builder(XiaozhiAgentMCP.class)
.streamingChatLanguageModel(qwenStreamingChatModel)
.chatMemoryProvider(chatMemoryProviderXiaozhi)
.tools(appointmentTools, bailianTool) // 集成百炼工具
.contentRetriever(contentRetrieverXiaozhiPincone)
.build();
}
}

14. 在已有Ai-Agent的系统提示词zhaozhi-prompt-tamplate.txt中显示要求它实现智能体调用。

15. 启动springBoot,进入knife4j进行前后端联调。可以看得出来,我们的Ai-Agent保留了原有的设置。

16. 当提及“生成数字人视频”时,bailianTools被调用,可以从idea控制台看到mcp的调用情况。


17. 继续追问Ai,当mcp生成的视频完成(此处需要等待视频生成大约1min时间),会返回视频链接,发送给客户端。


三、知识点总结
1. public class bailianTool中@Tool后提示词的作用:大模型(比如我们的通义千问等模型)在处理用户请求时,会判断是否需要调用工具来辅助回答。@Tool 后的提示词,是告诉大模型 “什么时候应该调用这个工具” 以及 “这个工具能做什么”。提升工具调用的准确性。
2. @AiService中tools = {“appointmentTools","bailianTool"}的作用:明确指定当前 AI 服务可以使用的工具集合。只有被列入 tools 数组的工具,才会被大模型 “感知” 并可能被调用。未列入的工具,即使类中包含 @Tool 注解的方法,也不会被当前 AI 服务使用。
3. XiaozhiMCPV2Controller的机制:createEnhancedAgent() 方法中,AiServices.builder() 是 LangChain4j 提供的 “智能体组装器”,作用是把多个组件(大模型、记忆、工具、内容检索)“粘合” 成一个具备完整能力的 AI 服务(即 XiaozhiAgentMCP)。
前端调用 /xiaozhi-mcp2/chat2 接口时:@RequestBody ChatForm chatForm 接收前端传来的请求体ChatForm(包含 memoryId 和 message),当用户发送的消息触发 bailianTool 时,大模型(QwenStreamingChatModel)先 “理解” 用户消息,再结合 bailianTool 上 @Tool 的提示词(“当用户需要生成数字人视频时,使用本工具调用阿里百炼智能体进行生成”),判断需要调用 bailianTool。
bailianTool 获取 MCP 返回的结果后,会将结果回传给大模型。大模型生成的最终结果,通过 Flux<String> 逐段推送给前端,完成一次交互。
4. chat方法作用: 你只需要传入chatForm中的 “对话记忆 ID” 和 “用户消息”,它就会自动完成 “理解消息→调用工具(如百炼 MCP)→结合记忆→生成流式回复Flux<String>” 的全流程,无需手动处理中间环节。

302

被折叠的 条评论
为什么被折叠?



