AI项目博客
记录 AI 工程实践与大模型应用

Spring AI Alibaba 41|多智能体编排 · 交接(Handoffs):路由(LlmRoutingAgent)

在路由模式中,使用大语言模型(LLM)动态决定将请求路由到哪个子Agent。这种模式非常适合需要智能选择不同专家Agent的场景。

流程:

  1. 路由Agent接收用户输入
  2. LLM分析输入并决定最合适的子Agent
  3. 选中的子Agent处理请求
  4. 结果返回给用户

Spring AI Alibaba LlmRoutingAgent

实现

import com.alibaba.cloud.ai.graph.agent.flow.agent.LlmRoutingAgent;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;

// 创建专业化的子Agent
ReactAgent writerAgent = ReactAgent.builder()
  .name("writer_agent")
  .model(chatModel)
  .description("擅长创作各类文章,包括散文、诗歌等文学作品")
  .instruction("你是一个知名的作家,擅长写作和创作。请根据用户的提问进行回答。")
  .outputKey("writer_output")
  .build();

ReactAgent reviewerAgent = ReactAgent.builder()
  .name("reviewer_agent")
  .model(chatModel)
  .description("擅长对文章进行评论、修改和润色")
  .instruction("你是一个知名的评论家,擅长对文章进行评论和修改。" +
               "对于散文类文章,请确保文章中必须包含对于西湖风景的描述。")
  .outputKey("reviewer_output")
  .build();

ReactAgent translatorAgent = ReactAgent.builder()
  .name("translator_agent")
  .model(chatModel)
  .description("擅长将文章翻译成各种语言")
  .instruction("你是一个专业的翻译家,能够准确地将文章翻译成目标语言。")
  .outputKey("translator_output")
  .build();

// 创建路由Agent
LlmRoutingAgent routingAgent = LlmRoutingAgent.builder()
  .name("content_routing_agent")
  .description("根据用户需求智能路由到合适的专家Agent")
  .model(chatModel) 
  .subAgents(List.of(writerAgent, reviewerAgent, translatorAgent)) 
  .build();

// 使用 - LLM会自动选择最合适的Agent
Optional<OverAllState> result1 = routingAgent.invoke("帮我写一篇关于春天的散文");
// LLM会路由到 writerAgent

Optional<OverAllState> result2 = routingAgent.invoke("请帮我修改这篇文章:春天来了,花开了。");
// LLM会路由到 reviewerAgent

Optional<OverAllState> result3 = routingAgent.invoke("请将以下内容翻译成英文:春暖花开");
// LLM会路由到 translatorAgent

关键特性

  1. 智能路由:LLM根据输入内容和子Agent的描述自动选择最合适的Agent
  2. 灵活扩展:可以轻松添加新的专家Agent,LLM会自动识别并路由
  3. 描述驱动:子Agent的 description 非常重要,它告诉LLM何时应该选择该Agent
  4. 单次执行:每次请求只路由到一个Agent执行

优化路由准确性

为了提高路由的准确性,需要注意以下几点:

// 1. 提供清晰明确的Agent描述
ReactAgent codeAgent = ReactAgent.builder()
  .name("code_agent")
  .model(chatModel)
  .description("专门处理编程相关问题,包括代码编写、调试、重构和优化。" + 
               "擅长Java、Python、JavaScript等主流编程语言。") 
  .instruction("你是一个资深的软件工程师...")
  .build();

// 2. 明确Agent的职责边界
ReactAgent businessAgent = ReactAgent.builder()
  .name("business_agent")
  .model(chatModel)
  .description("专门处理商业分析、市场研究和战略规划问题。" + 
               "不处理技术实现细节。") 
  .instruction("你是一个资深的商业分析师...")
  .build();

// 3. 使用不同领域的Agent避免重叠
LlmRoutingAgent routingAgent = LlmRoutingAgent.builder()
  .name("multi_domain_router")
  .model(chatModel)
  .subAgents(List.of(codeAgent, businessAgent, writerAgent))
.build();

自定义系统提示和指令

LlmRoutingAgent 支持通过 systemPrompt 和 instruction 来自定义路由决策行为,提供更精确的路由控制。

使用 SystemPrompt

systemPrompt 用于设置路由决策的系统提示,会替换默认的系统提示。你可以通过它提供详细的决策规则和上下文:

final String ROUTING_SYSTEM_PROMPT = """
你是一个智能的内容路由Agent,负责根据用户需求将任务路由到最合适的专家Agent。

## 你的职责
1. 仔细分析用户输入的意图和需求
2. 根据任务特性,选择最合适的专家Agent
3. 确保路由决策准确、高效

## 可用的子Agent及其职责

### writer_agent
- **功能**: 擅长创作各类文章,包括散文、诗歌等文学作品
- **适用场景**: 
* 用户需要创作新文章、散文、诗歌等原创内容
* 简单的写作任务
- **输出**: writer_output

### reviewer_agent
- **功能**: 擅长对文章进行评论、修改和润色
- **适用场景**: 
* 用户需要修改、评审或优化现有文章
* 需要提高文章质量
- **输出**: reviewer_output

### translator_agent
- **功能**: 擅长将文章翻译成各种语言
- **适用场景**: 
* 用户需要将内容翻译成其他语言
* 多语言转换需求
- **输出**: translator_output

## 决策规则

1. **写作任务**: 如果用户需要创作新内容,选择 writer_agent
2. **修改任务**: 如果用户需要修改或优化现有内容,选择 reviewer_agent
3. **翻译任务**: 如果用户需要翻译内容,选择 translator_agent

## 响应格式
只返回Agent名称(writer_agent、reviewer_agent、translator_agent),不要包含其他解释。
""";

LlmRoutingAgent routingAgent = LlmRoutingAgent.builder()
  .name("content_routing_agent")
  .description("根据用户需求智能路由到合适的专家Agent")
  .model(chatModel)
  .systemPrompt(ROUTING_SYSTEM_PROMPT) 
  .subAgents(List.of(writerAgent, reviewerAgent, translatorAgent))
  .build();
使用 Instruction

instruction 用于设置路由决策的用户指令,会作为 UserMessage 添加到消息列表中。你可以通过它提供额外的上下文信息或特定的路由指导:

// 使用 instruction 提供额外的路由指导
final String ROUTING_INSTRUCTION = """
请根据用户的需求,选择最合适的Agent来处理任务。

特别注意:
- 如果用户明确提到"写"、"创作"、"生成"等词汇,优先选择 writer_agent
- 如果用户提到"修改"、"优化"、"评审"等词汇,选择 reviewer_agent
- 如果用户提到"翻译"、"转换语言"等词汇,选择 translator_agent
""";

LlmRoutingAgent routingAgent = LlmRoutingAgent.builder()
  .name("content_routing_agent")
  .description("根据用户需求智能路由到合适的专家Agent")
  .model(chatModel)
  .instruction(ROUTING_INSTRUCTION) 
  .subAgents(List.of(writerAgent, reviewerAgent, translatorAgent))
  .build();
同时使用 SystemPrompt 和 Instruction

你可以同时使用 systemPrompt 和 instruction 来提供更完整的路由决策上下文:

final String ROUTING_SYSTEM_PROMPT = """
你是一个智能的内容路由Agent,负责根据用户需求将任务路由到最合适的专家Agent。

## 可用的子Agent及其职责

### writer_agent
- **功能**: 擅长创作各类文章
- **输出**: writer_output

### reviewer_agent
- **功能**: 擅长对文章进行评论、修改和润色
- **输出**: reviewer_output

### translator_agent
- **功能**: 擅长将文章翻译成各种语言
- **输出**: translator_output

## 响应格式
只返回Agent名称,不要包含其他解释。
""";

final String ROUTING_INSTRUCTION = """
请仔细分析用户输入,根据以下规则选择最合适的Agent:
1. 创作新内容 -> writer_agent
2. 修改现有内容 -> reviewer_agent
3. 翻译内容 -> translator_agent
""";

LlmRoutingAgent routingAgent = LlmRoutingAgent.builder()
  .name("content_routing_agent")
  .description("根据用户需求智能路由到合适的专家Agent")
  .model(chatModel)
  .systemPrompt(ROUTING_SYSTEM_PROMPT) 
  .instruction(ROUTING_INSTRUCTION) 
  .subAgents(List.of(writerAgent, reviewerAgent, translatorAgent))
  .build();
SystemPrompt 和 Instruction 的区别
特性 SystemPrompt Instruction
作用位置 系统消息(SystemMessage) 用户消息(UserMessage)
用途 定义路由Agent的角色、职责和决策规则 提供具体的路由指导或额外上下文
优先级 更高,影响整体路由行为 作为补充信息
使用场景 需要详细定义路由规则和Agent职责时 需要提供特定场景的路由指导时

💡 提示:

使用 systemPrompt 来定义路由Agent的整体行为和决策框架
使用 instruction 来提供特定场景的路由指导或额外上下文
两者可以配合使用,提供更精确的路由控制

本文整理自 Spring AI Alibaba 官方文档《多智能体编排》:https://java2ai.com/docs/frameworks/agent-framework/advanced/multi-agent

赞(0)
未经允许不得转载:AI项目博客 » Spring AI Alibaba 41|多智能体编排 · 交接(Handoffs):路由(LlmRoutingAgent)

评论 抢沙发

AI项目博客

专注 AI 工程化落地 —— 覆盖智能体、大模型、Java AI 与 Python 的学习笔记,以及 AI 平台的项目实战记录。

关于本站文章归档

登录

找回密码

注册