【AI Agent基础 | 第四篇】Spring AI 集成与多模型支持

【AI Agent基础 | 第四篇】Spring AI 集成与多模型支持

目录

Spring AI 在 Agent 系统中的作用

接入 Spring AI 的步骤

一个模型对应一个 ChatClient

ChatClientRegistry:模型调度的核心

Agent 如何绑定模型

模型成为系统基础设施



【AI Agent基础 | 第三篇】AI到底是怎么做事的?https://blog.ZEEKLOG.net/h52412224/article/details/158773114?spm=1001.2014.3001.5502

【AI Agent基础 | 第二篇】从被动问答到主动推进任务的智能体https://blog.ZEEKLOG.net/h52412224/article/details/158689521?spm=1001.2014.3001.5502【AI Agent基础 | 第一篇】AI模型的能力边界与分类https://blog.ZEEKLOG.net/h52412224/article/details/158500592?spm=1001.2014.3001.5502


前面几章,我们用手写大模型 API 的方式,把模型调用、上下文管理和工具调用的完整流程走了一遍。

现在我们正式进入工程化开发阶段,新的问题也随之而来:

当系统里有多个 Agent、多次模型调用,甚至接入了多个不同厂商的模型时,我们怎么把这些模型能力统一管理起来,让它们变成可配置、可切换、可扩展的基础设施?

这一章,就来解决这个问题。

Spring AI 在 Agent 系统中的作用

如果不借助任何框架,每接入一个新模型,我们都要自己处理一堆重复工作:

  • 构造 HTTP 请求
  • 处理鉴权和请求重试
  • 适配不同模型的参数差异
  • 兼容各厂商的工具调用协议

这些工作本身不难,但它们和 Agent 的核心逻辑无关,纯粹是和模型厂商打交道的细节。

Spring AI 的好处,就是把如何和模型打交道这件事,抽象成了一套统一接口。

这样我们就能把精力放在设计 Agent 的行为上,不用再纠结各个模型厂商的细节差异。

在 Agent 系统里,我们只需要一个能和模型对话的对象,这个对象就是 Spring AI 里的 ChatClient。

接入 Spring AI 的步骤

在 Spring Boot 项目里接入 Spring AI 非常简单,主要分三步。

首先,用 BOM 来统一管理版本,避免依赖冲突:

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

然后,根据要接入的模型厂商,引入对应的 starter 依赖。

比如接入深度求索和智谱 AI:

<dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-deepseek</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-zhipuai</artifactId> </dependency> </dependencies>

最后,在 application.yaml 里配置模型的 API Key 和默认参数:

spring: ai: deepseek: api-key: ${DEEPSEEK_API_KEY} chat: options: model: deepseek-chat zhipuai: api-key: ${ZHIPU_API_KEY} chat: options: model: glm-4.6

完成这三步后,Spring AI 就会自动把这些模型装配成 ChatModel Bean,接下来我们就可以在系统里直接使用了。

一个模型对应一个 ChatClient

在我们的 Agent 系统里,有一个约定:每一个可用的模型,都对应一个独立的 ChatClient 对象。

ChatClient 是对模型能力的封装,它把模型调用的细节都屏蔽了,只暴露一个统一的对话接口。

我们可以为每个模型创建一个独立的 ChatClient Bean:

@Configuration public class MultiChatClientConfig { @Bean("deepseek-chat") public ChatClient deepSeekChatClient(DeepSeekChatModel model) { return ChatClient.create(model); } @Bean("glm-4.6") public ChatClient zhiPuChatClient(ZhiPuAiChatModel model) { return ChatClient.create(model); } }

ChatClientRegistry:模型调度的核心

当系统里有多个 ChatClient 后,新的问题就来了:运行时怎么根据 Agent 的配置,自动选择对应的模型?

答案很简单,不要用 if/switch 硬编码,交给 Spring 来处理。

Spring 会自动把所有 ChatClient 类型的 Bean 收集到一个 Map 里,Bean 的名称就是 Map 的 Key,实例本身就是 Value。

我们只需要一个简单的注册表类,就能实现模型的动态调度:

@Component public class ChatClientRegistry { private final Map<String, ChatClient> registry; public ChatClientRegistry(Map<String, ChatClient> registry) { this.registry = registry; } public ChatClient get(String modelName) { return registry.get(modelName); } }

这段代码看似简单,却解决了一个关键的工程问题:

  • 新增模型时,不需要修改任何调度代码
  • 模型注册是声明式的,不用写复杂的控制流
  • 模型选择完全由配置数据驱动

这种注册表模式,是实现多模型支持的核心。

Agent 如何绑定模型

在之前设计的数据库表中,Agent 表有一个 model 字段,用来指定这个 Agent 默认使用的模型。

当系统创建 Agent 实例时,只需要一行代码就能拿到对应的模型:

ChatClient chatClient = chatClientRegistry.get(agent.getModel()); if (chatClient == null) { throw new IllegalStateException( "未找到对应的模型:" + agent.getModel() ); }

这样我们就实现了模型的动态切换:

  • Agent 只依赖 ChatClient 这个统一接口
  • Agent 完全不用关心模型来自哪个厂商
  • 切换模型时,不需要修改 Agent 的代码

模型已经从写死的依赖,变成了可以在运行时动态注入的能力。

模型成为系统基础设施

到这一步,我们完成了一个重要的转变:

  • 所有模型都被统一抽象成 ChatClient
  • 多个模型可以在系统中并存
  • Agent 可以在运行时自由选择模型
  • 模型接入和 Agent 行为彻底解耦

现在,模型不再是某个 API Key 对应的外部服务,而是系统里的一种基础能力组件。


上述内容也同步在我的飞书,欢迎访问

https://my.feishu.cn/wiki/QLauws6lWif1pnkhB8IcAvkhncc?from=from_copylink

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,你们的支持就是我坚持下去的动力!

Read more

Nginx蜘蛛请求智能分流:精准识别爬虫并转发SEO渲染服务

Nginx蜘蛛请求智能分流:精准识别爬虫并转发SEO渲染服务

🧑 博主简介:ZEEKLOG博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 技术合作请加本人wx(注明来自ZEEKLOG):foreast_sea Nginx蜘蛛请求智能分流:精准识别爬虫并转发SEO渲染服务 一、背景与需求 现代网站需要同时满足两类用户的需求: 1. 真实用户:通过浏览器访问,需快速加载静态资源 2. 搜索引擎蜘蛛:需要专门渲染的SEO优化内容 传统方案中,蜘蛛请求常被错误处理: * 无法识别新版蜘蛛UA(如百度渲染爬虫) * 静态资源无法满足SEO需求

By Ne0inhk
Flutter 组件 angel3_auth 适配鸿蒙 HarmonyOS 实战:多策略身份验证,构建全栈式安全鉴权与身份防腐架构

Flutter 组件 angel3_auth 适配鸿蒙 HarmonyOS 实战:多策略身份验证,构建全栈式安全鉴权与身份防腐架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 angel3_auth 适配鸿蒙 HarmonyOS 实战:多策略身份验证,构建全栈式安全鉴权与身份防腐架构 前言 在鸿蒙(OpenHarmony)生态迈向全栈式开发、涉及跨端统一登录、多因子安全验证(MFA)及高性能服务端 API 保护的背景下,如何构建一套坚固、可扩展且具备“多策略适配”能力的身份验证架构,已成为决定全栈系统安全等级与用户信任度的基石。在鸿蒙设备这类强调分布式安全域与跨端信任链的环境下,如果应用依然依赖硬编码的简单鉴权逻辑,由于由于身份上下文的复杂性,极易由于由于“鉴权粒度过粗”导致越权访问或遭受 CSRF/XSS 等复合型攻击。 我们需要一种能够解耦认证逻辑、支持多种插拔式策略(如 JWT、Local、OAuth2)且具备高度可定制性的鉴权中间件。 angel3_auth 为 Dart 全栈开发者引入了“

By Ne0inhk
基于 Rust 与 DeepSeek V3.2 构建高性能插件化 LLM 应用框架深度解析

基于 Rust 与 DeepSeek V3.2 构建高性能插件化 LLM 应用框架深度解析

前言 随着大语言模型(LLM)技术的飞速迭代,应用开发范式正经历从"单一脚本调用"向"复杂系统工程"的转变。在构建企业级 LLM 应用时,开发者面临的核心挑战在于如何平衡系统的稳定性与灵活性:既要适配快速更迭的模型接口(如 DeepSeek V3.2),又要满足多样化的业务场景(如代码审计、日志分析、运维自动化)。 本文将深入剖析如何利用 Rust 语言强大的类型系统与所有权机制,结合 DeepSeek V3.2 强大的推理能力,构建一个高内聚、低耦合的插件化 LLM 应用框架。该架构通过定义清晰的 Trait 边界,实现了核心逻辑与业务实现的物理隔离,确保了系统的可扩展性与类型安全。 一、 架构设计理念与分层模型 传统的大模型应用往往将 API 调用、提示词工程(Prompt

By Ne0inhk
Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

Android 蓝牙 BLE 扫描 Native 层架构与扫描流程剖析

博主简介 byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发,深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域。乐于技术分享与交流,欢迎关注互动! 📌 主页与联系方式ZEEKLOG:https://blog.ZEEKLOG.net/weixin_37800531知乎:https://www.zhihu.com/people/38-72-36-20-51微信公众号:嵌入式硬核研究所邮箱:[email protected](技术咨询或合作请备注需求) ⚠️ 版权声明 本文为原创内容,未经授权禁止转载。商业合作或内容授权请联系邮箱并备注来意。 本文基于 Android 蓝牙源码中 BLE 扫描相关的 Native 层代码,以scanInitializeNative为入口,系统梳理 BLE 扫描从 JNI

By Ne0inhk