feat: 新增 ChitChatAgent 闲聊兜底子 Agent 并接入 supervisor

简单任务无专业子 Agent 可用时由闲聊 Agent 兜底,避免 supervisor 空转返回空内容;通过 supervisorContext 约束仅在问候/闲聊场景路由到该 Agent。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ageerle@163.com
2026-07-20 16:08:48 +08:00
parent afc9d3d17d
commit 24bee53f9e
2 changed files with 38 additions and 2 deletions

View File

@@ -0,0 +1,28 @@
package org.ruoyi.agent;
import dev.langchain4j.agentic.Agent;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
/**
* 闲聊兜底 Agent
* 负责问候、日常闲聊和常识性问答,不挂任何工具。
* 作为 supervisor 的默认落脚点,避免简单任务无子 Agent 可用导致输出为空。
*
* @author ageerle@163.com
*/
public interface ChitChatAgent {
@SystemMessage("""
你是一个友好、自然的对话助手,负责问候、闲聊和常识性问答。
要求:
- 用与用户相同的语言回答,简洁自然
- 不要编造需要实时数据或专业工具才能得到的事实
- 如果用户的问题实际需要联网搜索、查数据库、执行技能或生成图表,直接说明这超出你的职责,
让用户重新描述需求
""")
@UserMessage("{{query}}")
@Agent("闲聊兜底助手:仅用于问候、日常闲聊和不需要联网搜索、数据库、技能或图表的通用问题")
String chat(@V("query") String query);
}

View File

@@ -34,6 +34,7 @@ import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.agent.ChartGenerationAgent;
import org.ruoyi.agent.ChitChatAgent;
import org.ruoyi.agent.EchartsAgent;
import org.ruoyi.agent.SkillsAgent;
import org.ruoyi.agent.SqlAgent;
@@ -267,11 +268,18 @@ public class ChatServiceFacade implements IChatService {
.listener(new MyAgentListener())
.build();
// 构建子 Agent 6: ChitChatAgent - 简单闲聊兜底,避免无子 Agent 可用时 supervisor 空转
ChitChatAgent chitChatAgent = AgenticServices.agentBuilder(ChitChatAgent.class)
.chatModel(plannerModel)
.build();
// 构建监督者 Agent - 管理多个子 Agent
var supervisorBuilder = AgenticServices.supervisorBuilder()
.chatModel(plannerModel)
.subAgents(skillsAgent, searchAgent, sqlAgent, chartGenerationAgent, echartsAgent)
.responseStrategy(SupervisorResponseStrategy.LAST);
.subAgents(skillsAgent, searchAgent, sqlAgent, chartGenerationAgent, echartsAgent, chitChatAgent)
.supervisorContext("仅当请求是问候或简单闲聊、不需要任何数据、搜索、技能或图表时,才使用 chitChatAgent;"
+ "其余情况必须使用对应的专业 Agent")
.responseStrategy(SupervisorResponseStrategy.SUMMARY);
SupervisorAgent supervisor = supervisorBuilder.build();
// 知识库增强:智能体绑定了知识库时,对 supervisor 输入做一次 RAG 增强