当前位置:首页 > 技术 > 正文内容

基于SpringAI集成DeepSeek并实现动态模型切换的实践

访客 技术 2026年7月21日 1

构建可灵活切换模型的AI服务

本示例展示如何在Spring AI项目中集成DeepSeek API,并支持运行时动态选择不同模型,如 deepseek-chatdeepseek-coder 等,以满足多样化场景需求。

一、配置管理:声明可选模型列表

application.yml 中定义API密钥与默认模型,同时列出可用模型选项:

deepseek:
  api-key: sk-xxxxx
  base-url: https://api.deepseek.com/v1
  default-model: deepseek-chat
  supported-models:
    - deepseek-chat
    - deepseek-coder
    - deepseek-math

二、服务层:支持动态模型注入

通过依赖注入和WebClient构建请求,将模型名称作为参数传入,实现按需调用:

@Service
public class AiModelHandler {

    private final WebClient client;
    private final String fallbackModel;

    public AiModelHandler(WebClient.Builder builder, @Value("${deepseek.default-model}") String fallbackModel) {
        this.client = builder.baseUrl("${deepseek.base-url}").build();
        this.fallbackModel = fallbackModel;
    }

    public Mono<String> respond(String input, String modelChoice) {
        String targetModel = modelChoice != null && !modelChoice.isBlank() 
            ? modelChoice 
            : fallbackModel;

        return client.post()
                .uri("/chat/completions")
                .header("Authorization", "Bearer ${deepseek.api-key}")
                .bodyValue(Map.of(
                    "model", targetModel,
                    "messages", List.of(Map.of("role", "user", "content", input))
                ))
                .retrieve()
                .bodyToMono(Map.class)
                .map(resp -> ((Map<?, ?>) resp.get("choices")).get(0))
                .map(choiceObj -> ((Map<?, ?>) choiceObj).get("message"))
                .map(msgObj -> ((Map<?, ?>) msgObj).get("content"))
                .cast(String.class);
    }
}

三、接口层:支持显式或隐式模型指定

提供统一入口,根据请求参数决定使用哪个模型:

@RestController
@RequestMapping("/ai")
public class ModelController {

    private final AiModelHandler aiHandler;

    public ModelController(AiModelHandler aiHandler) {
        this.aiHandler = aiHandler;
    }

    @GetMapping("/ask")
    public Mono<String> ask(
            @RequestParam String query,
            @RequestParam(required = false) String model) {
        return aiHandler.respond(query, model);
    }
}

四、调用测试示例

  • 默认模型:GET /ai/ask?query=你好
  • 指定模型:GET /ai/ask?query=写一个Python函数&model=deepseek-coder

五、增强功能建议

  • 远程配置中心集成:将模型列表存于Nacos或Apollo,实现热更新。
  • 智能路由策略:根据输入内容语义自动匹配最佳模型(如检测代码关键词则启用 deepseek-coder)。
  • 容错降级机制:当目标模型返回错误时,自动回退至默认模型:
.onErrorResume(e -> aiHandler.respond(input, fallbackModel))

六、总结

通过将模型名称作为可变参数注入请求流程,实现了对DeepSeek多模型的灵活调用。结合配置管理与异常处理,系统具备良好的扩展性与稳定性,适用于需要按场景切换AI能力的生产环境。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。