用 Spring Boot、LangChain4j 和 Claude 搭智能虚拟助手:多代理协作篇

01

引言

picture.image

随着生成式 AI 的快速发展,构建智能应用已不再仅仅是接入大型语言模型(LLM)那么简单。真正的机遇在于设计领域特定智能体—— 这些智能体能够自主推理、决策并执行操作。

picture.image

本文将介绍一种基于 Spring Boot 和 Spring AI 构建多智能体 AI 系统的模块化方法,借助该方法你可以实现以下目标:

  • 构建面向特定任务(如旅行规划、购物推荐等)的自主智能体

  • 集成 OpenAI、Azure OpenAI 或 AWS Bedrock 等主流 LLM 服务

  • 在云原生系统中实现 AI 功能的规模化部署

无论你是开发工程师、架构师还是 CTO,本指南都将展示如何在企业级 Java 环境中合理应用生成式 AI(GenAI)技术,打造稳定可靠的 AI 应用。

02

架构概览

我们设计的多智能体架构支持即插即用型智能体,每个智能体对应一个业务领域。系统通过一个控制器(Controller)基于 HTTP 协议对所有智能体进行协调管理。

picture.image

每个智能体具备以下核心特性:

  • 拥有专属的领域特定提示词(Domain-Specific Prompt)

  • 支持借助外部工具进行推理计算

  • 使用 Spring AI 的 ChatClient 组件与 LLM 模型交互

03

技术栈与伪代码

3.1 基础智能体接口(Base Agent Interface)

该接口为所有智能体定义了简单的约定:每个智能体必须实现 handle 方法,用于处理用户输入。

  
public interface IAgent {  
    String handle(String input);  
}

3.2 旅行智能体示例(Travel Agent Example)

TravelAgent类专门处理旅行规划相关的提示词,并可调用外部工具(如天气查询、酒店推荐工具)辅助决策。

  
@Component("travelAgent")  
public class TravelAgent implements IAgent {  
    @Autowired private WeatherTool weatherTool;  
    @Autowired private HotelTool hotelTool;  
    @Autowired private ChatClient chatClient;  
    public String handle(String input) {  
        String prompt = """  
        你是一名旅行规划师。  
        输入内容:%s  
        可使用工具:getWeather(城市)、recommendHotel(城市)  
        """.formatted(input);  
        return chatClient.call(new Prompt(prompt)).getResult().getOutput().getContent();  
    }  
}

3.3 工具示例(Tool Example)

此类模拟智能体可调用的外部工具,实际应用中可在此处接入真实 API(如第三方天气服务 API)。

  
@Component  
public class WeatherTool {  
    public String getWeather(String city) {  
        // 此处可替换为真实API调用逻辑,或返回模拟数据  
    }  
}

3.4 智能体注册器(Agent Registry)

该组件负责扫描系统中所有智能体实现类,并按名称进行注册管理。

  
@Component  
public class AgentRegistry {  
    private final Map<String, IAgent> agents;  
    public AgentRegistry(List<IAgent> agentBeans) {  
        this.agents = agentBeans.stream()  
            .collect(Collectors.toMap(  
                agent -> agent.getClass().getSimpleName().toLowerCase(),  
                Function.identity()  
            ));  
    }  
    // 根据名称获取智能体(返回Optional,避免空指针)  
    public Optional<IAgent> getAgent(String name) {  
        return Optional.ofNullable(agents.get(name.toLowerCase()));  
    }  
    // 返回所有已注册智能体的名称集合  
    public Set<String> listAgents() {  
        return agents.keySet();  
    }  
}

3.5 统一 API 控制器(Unified API Controller)

该控制器提供 REST 接口,供外部系统与智能体进行交互。

  
@RestController  
@RequestMapping("/agents")  
public class AgentController {  
    @Autowired private AgentRegistry registry;  
    // 调用指定智能体处理输入(POST请求)  
    @PostMapping("/{agentName}")  
    public ResponseEntity<String> handle(@PathVariable String agentName, @RequestBody String input) {  
        return registry.getAgent(agentName)  
            .map(agent -> ResponseEntity.ok(agent.handle(input)))  
            .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).body("未找到指定智能体"));  
    }  
    // 列出所有已注册的智能体(GET请求)  
    @GetMapping  
    public Set<String> listAgents() {  
        return registry.listAgents();  
    }  
}

3.6 元智能体(协调层)(Meta Agent (Orchestration Layer))

元智能体是系统的 “调度中枢”,负责判断给定输入应由哪个领域智能体处理。

  
@Component("metaAgent")  
public class MetaAgent implements IAgent {  
    @Autowired private AgentRegistry registry;  
    @Autowired private ChatClient chatClient;  
    public String handle(String input) {  
        // 系统提示词:明确元智能体的决策职责  
        String systemPrompt = "判断输入应由哪个智能体(travelAgent、restaurantAgent、shoppingAgent)处理。";  
        // 调用LLM获取目标智能体名称  
        String agentName = chatClient.call(new Prompt(systemPrompt + " 输入内容:" + input))  
                                     .getResult().getOutput().getContent();  
        // 调用目标智能体处理输入,若无匹配则返回提示  
        return registry.getAgent(agentName.trim().toLowerCase())  
            .map(agent -> agent.handle(input))  
            .orElse("抱歉,未找到可处理该请求的智能体。");  
    }  
}

3.7 云 LLM 提供商配置(Cloud LLM Provider Configs)

借助 Spring AI,只需通过 YAML 配置即可轻松切换不同的 LLM 服务提供商。

Azure OpenAI 配置:

  
spring.ai.openai.api-key = ${AZURE_OPENAI_KEY}  
spring.ai.openai.endpoint = https://<你的资源名称>.openai.azure.com/  
spring.ai.openai.model = gpt-35-turbo

AWS Bedrock 配置:

  
spring.ai.bedrock.anthropic.api-key = ${AWS_ACCESS_KEY}  
spring.ai.bedrock.anthropic.region = us-east-1  
spring.ai.bedrock.anthropic.model = anthropic.claude-v2

OpenAI 配置:

  
spring.ai.openai.api-key = ${OPENAI_API_KEY}  
spring.ai.openai.model = gpt-4

04

后续规划(What’s Next?)

  • 集成 Redis 或本地内存上下文,为智能体添加会话记忆功能

  • 通过 Spring AI 知识库(KnowledgeBases)集成检索增强生成(RAG) 流程

  • 对接内部 API 工具(如工单查询、人力资源信息系统(HRIS)等)

  • 在 Kubernetes 中部署系统,并通过 OAuth/JWT 实现安全认证

  • 基于智能体链式调用(Agent Chaining)构建对话流程

  • 为智能体交互添加重试逻辑与可观测性监控(如日志、指标跟踪)

05

总结(Final Thoughts)

通过本文介绍的架构,你可以实现:

  • 将领域知识隔离到可复用的智能体中,降低模块间耦合

  • 将推理与执行任务委派给专用模块,提升系统专业性与效率

  • 通过 Spring AI 无缝集成任意 LLM 提供商,避免厂商锁定

企业级生成式 AI 无需依赖 Python 即可实现规模化 —— 它只需要稳健的 Java 设计。借助 Spring AI,只需极少的配置修改,就能轻松实现 LLM 模型的切换,为系统迭代提供极大灵活性。

0
0
0
0
评论
未登录
暂无评论