
各位做后端和移动端开发的朋友最近有一条科技圈新闻值得留意Apple 面向中国市场训练自己的 AI 模型并且在这个过程中获得了阿里巴巴的帮助。初看这只是一条行业合作消息但它背后牵出来的是一条完整的工程链路大模型如何落地到真实用户场景、端侧模型与云端模型如何分工、开发者怎么面对“一键出活”的 AI 能力。本文打算借着这条新闻把相关的大模型应用选型、Spring AI Alibaba 集成、NL2SQL 实践和工程安全经验串联起来帮助你把这些思路用在自己的项目里。这篇文章的内容跨度稍大但主线很明确先把新闻背后的技术原因拆清楚再落到可以运行的代码上。适合刚接触大模型应用开发的后端工程师也适合想了解 Spring AI Alibaba 如何接入通义千问的 Java 开发者。看完你可以掌握完整的模型接入流程、Prompt 调优思路以及带数据库查询场景的 AI 应用最小实现。1. Apple 与 Alibaba 合作背后藏着什么样的开发信号1.1 新闻报道里到底说了什么根据多家科技媒体的报道Apple 正在为中国市场准备一套本地化的 AI 方案并选择阿里巴巴作为重要合作伙伴。合作的重点并不只是让 iPhone 能调用某个现成的聊天机器人而是涉及模型训练、云端推理、产品功能适配等一系列工作。简单理解就是Apple 并不是简单把海外那套 Apple Intelligence 搬到中国而是针对中文场景、本地 App 生态和合规要求准备了一套更“本土化”的模型服务。这个新闻里有两个关键词容易被忽略。第一个是“训练 Own AI Model”第二个是“帮助 Help from Alibaba”。其中“训练”不等于从零开始做大模型预训练它更可能包含继续预训练、指令微调、模型蒸馏、场景适配等工作。阿里巴巴在这个过程中扮演的角色既包括提供基础大模型能力和算力资源也包括把模型变成可以稳定对外服务的产品。换句话说这本质上是“国际硬件厂商 中国 AI 基础设施”的组合。业界对这件事有各种解读但从工程视角看它给国内开发者释放的信号非常一致AI 能力会越来越多地嵌入到手机操作系统、App 和云端服务中而不是停留在网页对话框里。未来你写的每个后端接口都可能要对接一个或多个大模型服务。1.2 苹果为什么需要一家中国 AI 合作伙伴消费电子产品面向不同市场时AI 能力并不是“全球同一套模型”就能解决的。海外版本的 Apple Intelligence 背后有 Apple 自研模型、OpenAI 的 ChatGPT 等能力但这些服务在进入中国市场时会遇到几个现实问题。第一是服务可访问性。海外通用聊天机器人并没有在中国大陆市场开展面向用户的常规服务Apple 不能直接把这些能力原样内置到国行设备中。第二是语言和文化特殊性。中文表达、中文知识、本地生活服务、地域性信息都需要模型具备更强的中文语料覆盖。第三是合规要求。训练和部署面向国内用户的生成式 AI需要满足国内关于数据安全、个人信息保护、内容安全等方面的规定最好由熟悉当地环境的云厂商承接。苹果公司一贯强调隐私但隐私合规不意味着所有数据都能出境。对国内用户来说AI 请求在国内云端处理是更稳妥的方案。阿里云在国内的算力、基础设施和合规经验都比较成熟自然成为合适的合作方。这个逻辑值得开发者记住大模型落地不只是模型效果问题更是数据链路、服务链路和合规链路的问题。1.3 这个合作对普通开发者的迁移价值如果你是做 Java、Spring Boot 或移动端后端服务的可能第一反应是“苹果的大模型和我有什么关系”。其实关系很大。Apple 与阿里巴巴合作这件事本质上是在示范一种常见落地路径基础大模型不一定自研但要通过云服务、API、私有化部署的方式整合进自己的产品。国内开发者最容易落地的路径恰恰是使用阿里云通义千问系列模型通过 DashScope 模型服务调用然后在应用层封装成业务能力。而在 Java 生态里Spring AI Alibaba 已经成为接入这套能力的主流方式。它把大模型对话、结构化输出、向量检索、Agent 工具调用等能力抽象成了 Spring 风格的组件。也就是说苹果的模型是“别人的产品”但通义千问的 API 是“开发者可以直接用的工具”。与其纠结苹果到底怎么训练模型不如先掌握模型服务和应用代码之间的集成方法。后面几章我会用一个可运行的实战链路来说明。2. 先理清“训练模型”与“使用模型”的边界2.1 预训练、微调和蒸馏到底是什么关系新闻中“训练自己的 AI 模型”是一个容易被误解的词。从技术上讲开发一个大模型通常有几个阶段预训练阶段需要海量文本和巨大算力模型在这一阶段学到语言规律和世界知识。这个阶段成本极高基础模型厂商通过积累数据和算力优势完成。微调阶段是在已经预训练好的模型基础上用一批高质量业务数据继续训练让模型学会特定任务或领域知识。常见技术包括 SFT 监督微调、LoRA 低成本微调、DPO/RLHF 偏好对齐等。蒸馏阶段则是把一个大模型的知识迁移到一个小模型用小模型在端侧设备上运行。Apple 的端侧模型就非常依赖蒸馏技术因为手机内存和功耗有限。新闻报道里 Apple 训练面向中国市场的专属模型大概率不是从零开始预训练而是在自身模型或合作基础模型之上做深度适配。基础能力由阿里这样的大模型厂商提供Apple 负责产品定义、交互设计、端侧部署以及部分数据策略。对开发者的启示是你要解决业务问题通常不需要从预训练开始而是直接使用模型 API再通过 Prompt、RAG、Function Calling 和微调来达到效果。2.2 端侧推理与云端模型服务怎么分工在 Apple 的 AI 方案中很多简单任务希望在设备端完成这样可以保护隐私并降低网络依赖。端侧模型往往在 1B 到 7B 参数规模经过量化后可以装进手机。举一个场景你在输入法里输入一段中文系统希望预测下一个词或者把语音转成文本这种低延迟任务可以让端侧模型完成。但如果你问一个涉及最新知识、复杂逻辑推理的问题端侧模型能力不足系统会把请求转发到云端私有服务器由更大模型处理。这种“端云协同”思路对所有 App 都有参考价值。你并不需要把每个 AI 功能都放到云端可以先评估任务复杂度、隐私级别和时延要求。涉及隐私的内容尽量端侧处理涉及高质量生成的内容走云端大模型。阿里云 DashScope 也提供不同规模的模型例如偏向速度和性价比的 qwen-turbo也有能力更强的 qwen-plus 和 qwen-max你可以结合业务灵活选择而不必只依赖某一个模型。2.3 通义千问生态是怎么服务开发者的阿里巴巴在 AI 方向的布局可以分成几层底层是算力与基础设施例如阿里云和百炼平台模型层是通义千问系列从开源模型到企业级千亿参数模型都有覆盖应用层是 Spring AI Alibaba 这样的 Java 集成框架以及大量云服务。对 Java 开发者来说最关心的往往就是 API 能不能快速接上文档能不能看懂以及有没有生产案例。DashScope 是阿里云对外提供模型服务的网关开发者在 DashScope 控制台申请 API-KEY 后就可以通过 HTTP 或 SDK 调用多种模型。Spring AI Alibaba 则是把 DashScope、阿里云向量数据库等能力封装成 Spring Boot Starter让熟悉 Spring 的开发者不用关心底层 HTTP 细节。接下来我就用它做一套最小可运行的应用。3. 为什么 Spring AI Alibaba 值得后端开发者优先尝试3.1 从大模型 API 到 Spring 生态的适配问题如果直接调用 DashScope 的 HTTP API你需要处理鉴权、消息历史、JSON 解析、流式响应、异常重试等一系列问题。单个接口还好一旦把模型接入到用户服务、订单助手、报表系统等场景中这些重复劳动会急剧增加。于是 Spring AI Alibaba 这类框架的价值就体现出来了它把与大模型交互的“管道工作”抽成模板让你只关注业务层代码。Spring AI Alibaba 1.x 系列已经在 Java 社区里积累了不少使用者。它提供 ChatClient 这样的高层 API代码写起来类似于把一段 Prompt 组装好然后调用调用获得模型输出。它还支持流式返回、结构化输出、多轮对话、Function Calling、向量数据库集成等功能。举个最简单的对比如果没有框架你需要自己拼 JSON 请求体有了框架大多数时候只需要写一个接口方法传入用户问题即可。3.2 它是如何连接阿里模型与 Spring Boot 的Spring AI Alibaba 的本质是一系列 Starter 依赖和自动配置类。在 Spring Boot 项目中引入依赖后框架会根据application.yaml中的配置自动创建模型客户端相关的 Bean再把 Bean 注入你的 Service 或 Controller。这意味着你可以用ChatClient这样的统一接口调用不同模型切换模型时只改配置不重写业务代码。这种“统一抽象”也和 Apple 的思路类似。苹果不希望自己的 iOS 应用只能绑定某一家 AI 服务商而是希望在不同市场使用不同的模型提供商。开发者也应该养成一种习惯在业务代码中依赖抽象接口把模型厂商、模型名称放到配置中心将来才能灵活切换和灰度。4. 实战一基于 Spring Boot DashScope 快速接入通义千问4.1 环境准备与版本说明下面用一个最简单的“AI 问答接口”演示完整流程。运行环境建议如下依赖项建议版本说明JDK17 以上Spring Boot 3 要求 JDK 17Spring Boot3.x以你项目实际版本为准Spring AI Alibaba1.x版本号请以官方仓库最新版本为准数据库可选后面的 NL2SQL 案例需要使用 MySQLIDEIntelliJ IDEA二选一即可重点提醒Spring AI Alibaba 的版本迭代比较快不同版本之间某些配置项可能略有差异。本文的代码演示核心思路如果你使用的版本不同依赖坐标和配置键以官方文档为准。4.2 创建项目并引入依赖创建一个 Spring Boot 项目后在pom.xml中引入spring-ai-alibaba-starter-dashscope。下面这段依赖以实际官方版本为例dependencies !-- Spring Boot Web 支持 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring AI Alibaba DashScope Starter -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter-dashscope/artifactId version1.0.0/version /dependency /dependencies需要注意不同版本的 groupId 和 artifactId 有可能调整。如果你的 Spring AI Alibaba 版本是 1.x 系列则依赖名称通常是spring-ai-alibaba-starter-dashscope如果版本更早可能还需要额外引入 BOM。总之先参考官方文档再把版本号换成你实际可用的版本。4.3 配置 application.yaml在src/main/resources/application.yaml中加入 DashScope 配置server: port: 8080 spring: application: name: ai-demo ai: dashscope: api-key: ${DASHSCOPE_API_KEY} chat: options: model: qwen-plus temperature: 0.8这里的api-key建议不要明文写在代码里而是从环境变量读取。你可以在 DashScope 控制台申请 API-KEY然后在 IDE 环境变量或部署环境中配置DASHSCOPE_API_KEY。model使用qwen-plus是一个综合能力不错的默认选择如果对延迟更敏感可以换成qwen-turbo如果要求更强推理可以换成qwen-max。4.4 编写对话接口下面在controller包下新建ChatControllerpackage com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ai) public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam(defaultValue 请介绍一下杭州) String prompt) { return chatClient.prompt() .user(prompt) .call() .content(); } }ChatClient是 Spring AI 提供的高层客户端接口通过构造器注入的ChatClient.Builder由 Spring AI Alibaba 自动配置。chatClient.prompt()创建一个新的提示请求.user(prompt)传入用户输入.call().content()表示阻塞等待模型返回内容。4.5 启动与验证运行 Spring Boot 主类后通过浏览器或 curl 访问接口curl http://localhost:8080/ai/chat?prompt杭州有哪些适合开发者参加的技术活动正常情况下会得到一段通义千问生成的中文回答。如果你访问时报 401 或 403通常是 API-KEY 配置问题如果返回超时则需要注意本地网络到 DashScope 服务是否畅通。这里只要把链路跑通后面加业务逻辑就有基础了。4.6 流式输出改造真实产品中用户问完问题后如果等待十几秒才看到完整回答体验会比较差。因此生产级接口通常使用流式输出。Spring AI Alibaba 同样支持这种方式。下面给一个简单示例package com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; RestController RequestMapping(/ai) public class StreamChatController { private final ChatClient chatClient; public StreamChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat/stream) public FluxString chatStream(RequestParam(defaultValue 用一句古诗形容西湖) String prompt) { return chatClient.prompt() .user(prompt) .stream() .content(); } }前端或客户端接收 SSE 流式响应后可以逐字展示模型输出。这种交互方式更适合聊天机器人场景也是未来 App 内 AI 功能的标配。5. 实战二给 AI 增加中文业务人格和本地化约束5.1 为什么要单独设计 System Prompt只把用户问题原样丢给模型得到的回答往往不够稳定。Apple 在自己的 AI 模型上做大量微调和适配目的之一就是让回答符合场景预期。对普通开发者来说调整不了基础大模型但可以通过 System Prompt 引导模型行为。System Prompt 定义了 AI 的角色、语言风格、输出格式和知识边界。举个实际场景如果你的 App 为国内中老年用户提供生活助手你需要让模型少用网络词汇、多用短句、不要编造医疗建议。这些约束在 Prompt 里写清楚比在代码里做一堆后置判断更高效。大模型对角色扮演指令比较敏感只要系统提示清晰输出质量会有明显提升。5.2 在代码中使用 System Prompt 与多轮历史下面我们把一个通用的“中文生活小助手”写进系统提示package com.example.ai.service; import org.springframework.ai.chat.client.ChatClient; import org.springframework.stereotype.Service; Service public class AssistantService { private final ChatClient chatClient; public AssistantService(ChatClient.Builder builder) { this.chatClient builder.build(); } public String askAssistant(String question) { String systemPrompt 你是一个面向中国用户的贴心生活助理。 回答时请遵守以下规则 1. 使用简体中文语言简洁、友好不用过度书面化。 2. 如果用户问到健康、投资、法律等专业问题不要给出绝对结论 提醒用户咨询专业人士。 3. 如果用户要求你帮忙写广告、洗稿或编造事实请礼貌拒绝。 4. 回答最终需要落地为“用户可以执行的动作”不要只讲理论。 ; return chatClient.prompt() .system(systemPrompt) .user(question) .call() .content(); } }这段示例展示了.system()和.user()的配合。系统指令负责约束角色用户消息承载当次提问。你还可以把用户的历史消息作为上下文传到 prompt 中让模型在多轮对话中保持记忆。5.3 让模型输出结构化 JSON纯聊天不能满足所有业务需求。如果你的接口需要把 AI 回答结果直接展示到 App 表单里最好让模型返回固定 JSON。Spring AI 支持结构化输出常用方式是在调用时指定一个 Java 类让框架自动把模型输出解析为对象。这里给出一个小的演示思路核心类是BeanOutputConverter或ChatClient的.entity()方法。public record WeatherRequest(String city, String time) { }然后在方法中String prompt 提取下面这句话中的城市和时间 明天下午杭州适合去西湖散步吗 输出格式严格为 {city:城市,time:时间} ;模型返回的文本会被解析成WeatherRequest。这种把自由文本转为固定结构的能力非常适合做表单自动填充、意图识别、信息抽取等后端服务。Apple 的 Siri 和智能助手背后也大量使用类似的意图解析技术只是它们在系统层面完成开发者则通过 Spring AI 的 API 实现。6. NL2SQL 实战让用户用自然语言查数据库6.1 什么是 NL2SQL为什么工程上有价值NL2SQL 指的是“自然语言转 SQL”用户用一句中文提问AI 生成一条 SQL 查询然后由后端执行并返回结果。这个能力在企业后台、报表系统、运营分析工具中非常实用。普通业务人员不需要掌握 SQL 语法只要说“这个月销售额前五的城市有哪些”系统就能生成并执行查询。但 NL2SQL 也是安全风险比较高的场景。大模型一旦可以生成 SQL就存在生成危险语句的可能比如DELETE FROM orders、UPDATE users SET ...或者因为对表结构理解错误而出错。Apple 和阿里巴巴在模型训练时都会关注对齐和安全开发者在使用模型生成 SQL 时也必须加上保护层不能盲目信任模型输出。6.2 完整的自然语言查询接口下面用一个完整案例演示。假设系统有两个表用户表users和订单表orders。先创建一个查询控制器它接收用户问题把表结构发给模型模型返回 SQL我们校验安全后再执行。package com.example.ai.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.jdbc.core.simple.JdbcClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; RestController RequestMapping(/ai/query) public class NL2SQLController { private final ChatClient chatClient; private final JdbcClient jdbcClient; public NL2SQLController(ChatClient.Builder builder, JdbcClient jdbcClient) { this.chatClient builder.build(); this.jdbcClient jdbcClient; } GetMapping(/nlsql) public ListMapString, Object query(RequestParam String question) { String schema 表 usersid, name, city, created_at 表 ordersid, user_id, amount, status, created_at ; String systemPrompt 你是数据库查询助手。根据表结构和用户问题生成一条 MySQL SELECT 查询语句。 只允许输出 SQL不要输出解释。 查询条件中如果涉及时间优先使用近 30 天。 ; String raw chatClient.prompt() .system(systemPrompt) .user(schema \n用户问题 question) .call() .content(); String sql SqlGuard.extractSelect(raw); System.out.println(生成的 SQL sql); return jdbcClient.sql(sql).query().listOfRows(); } }这段代码有一个自定义类SqlGuard它负责两个事情从大模型返回中提取 SQL 文本同时判断 SQL 是否安全只读。接下来我们单独看这两个逻辑。6.3 安全校验类拦截非查询语句大模型输出中经常带有 Markdown 代码块标记例如sql ... 。不能直接把这种内容交给 JdbcClient 执行需要先清理。同时必须禁止DELETE、UPDATE、INSERT、DROP、ALTER这些写操作。下面是一个降级方案示例package com.example.ai.controller; public class SqlGuard { public static String extractSelect(String modelOutput) { if (modelOutput null || modelOutput.isBlank()) { throw new IllegalArgumentException(模型输出为空); } String sql modelOutput .replace(sql, ) .replace(, ) .trim(); String upperSql sql.toUpperCase(); String[] dangerousKeywords { INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, GRANT, REVOKE, CREATE }; for (String keyword : dangerousKeywords) { if (upperSql.startsWith(keyword) || upperSql.contains( keyword )) { throw new IllegalArgumentException(检测到非查询语句已拦截 keyword); } } if (!upperSql.startsWith(SELECT)) { throw new IllegalArgumentException(模型未生成 SELECT 查询已拦截); } return sql; } }这个类并不复杂但它是数据库安全的第一道防线。真正生产环境还应该配合数据库账号权限比如让 AI 查询服务使用一个“只读账号”该账号只具备SELECT权限这样即使模型或代码有漏洞也无法执行修改操作。6.4 运行验证与边界情况启动服务后访问curl http://localhost:8080/ai/query/nlsql?question杭州用户最近30天的订单总金额模型收到问题后会生成类似下面的 SQLSELECT SUM(o.amount) AS total_amount FROM orders o JOIN users u ON o.user_id u.id WHERE u.city 杭州 AND o.created_at DATE_SUB(NOW(), INTERVAL 30 DAY);安全校验通过后接口会返回查询结果。如果模型生成了UPDATE orders SET amount 0SqlGuard会直接抛出异常保护数据不会被修改。这里还有一个容易被忽略的细节不要允许模型在一条 SQL 里用分号拼接多条语句也不要使用支持执行多语句的 JDBC 参数。当前 Spring JDBC 默认不允许多语句执行这是符合安全预期的。7. 常见问题与排查思路在集成 Spring AI Alibaba 和 DashScope 的过程中开发者容易踩到下面几类问题。这里整理成表格方便你快速定位问题现象常见原因解决思路启动报找不到 ChatClient Bean没有引入 Spring AI Alibaba Starter或版本不匹配检查依赖坐标和版本确认自动配置生效请求返回 401 InvalidApiKeyDASHSCOPE_API_KEY 配置错误去 DashScope 控制台重新生成 key 并核对环境变量模型返回超时网络到云端服务不稳定或者模型繁忙错误提示可设置超时和重试或换低延迟模型返回内容被截断超出模型上下文窗口限制精简提示词控制多轮历史长度流式接口不返回数据未正确使用 SSE 或前端 EventSource确认 Controller 返回 Flux并用支持 SSE 客户端访问NL2SQL 返回非 SQL 文本模型没有严格遵循输出格式增强 System Prompt并让安全类做二次校验上下文太多导致费用偏高每次都把所有历史传给模型做会话裁剪、摘要压缩只保留关键消息排查这些问题时建议先打印 Prompt 和模型返回的原始文本确认问题是出在输入、输出还是执行阶段。Spring AI Alibaba 本身带有日志能力如果你看不到详细请求参数可以打开 Spring 的 debug 日志观察调用情况和异常堆栈。8. 工程落地与安全合规建议8.1 密钥、配置与模型选择无论接入哪个大模型都不要在代码仓库中管理 API-KEY。推荐的做法是把DASHSCOPE_API_KEY、模型名称、超时时间等放入环境变量或配置中心。如果你的项目已经使用 Nacos、Apollo 等配置中心可以把这些参数收归统一管理方便灰度发布和回滚。示例配置中从${DASHSCOPE_API_KEY}读取 key就是相对安全的第一层保护。模型选择上生产环境可以同时配置多个 key 或多个模型。主模型承载大部分流量备选模型用于主模型限流或故障时降级。由于 Spring AI Alibaba 面向接口编程你不需要为每个模型写单独的 Controller只要在配置层做好隔离再配合微服务的服务发现能力就可以平滑切换。这一点很像 Apple 在不同市场选择不同模型服务商产品不变底层模型动态适配。8.2 日志、监控与隐私保护大模型接口通常会记录用户的提问和模型返回结果。很多团队为了排查问题会把所有内容打印到日志中这会产生个人信息泄露风险。正确的做法是设置日志脱敏策略例如手机号、身份证号、地址等字段在进入日志前统一打码。同时在把用户数据发送给模型前要判断是否是必要信息。以 NL2SQL 为例如果用户只想知道“订单金额趋势”后端只需要传表结构和聚合问句不应该把用户明细传到日志或模型上下文里。监控方面需要关注每次调用的时延、Token 消耗、错误率和成本。AI 接口和传统 SQL 一样存在突发流量、接口超时和依赖故障的可能性。建议为每个上游模型调用设置超时时间并增加熔断降级机制。如果 DashScope 服务不稳定系统应快速切换到备用模型或在高峰期关闭非核心 AI 功能避免拖垮整个后端。8.3 数据库安全与最小权限在 NL2SQL 这类场景中后端经常要替模型执行 SQL。这里要遵循一个核心原则模型能操作的数据范围永远不应该超过它所需的权限。生产环境不要给 AI 服务账号配置 DELETE、UPDATE、DROP 权限哪怕你已经在代码里写了关键字拦截也要把数据库底层权限收口。数据库账号只开放只读权限这是最后一道闸门。另外由模型生成的 SQL 需要校验是否满足你预设的业务边界。举例来说假设业务只允许查询某一段时间的数据那么 SQL 解析时就要强制附加时间条件防止用户通过恶意提问绕过原有的租户隔离。多租户系统尤其要注意AI 只是生成 SQL 的工具租户 ID 过滤条件必须由后端代码拼接不能让模型自由决定。这样的设计即使模型被误导也不会把 A 租户的数据泄露给 B 租户。8.4 将 AI 能力分层融入现有系统从 Apple 与阿里的合作可以看出AI 产品化离不开展示层、服务层和数据层之间的协作。Apple 管理用户界面、意图和端侧能力阿里提供模型服务和云计算能力。类比到你的 App前端负责对话交互后端负责业务编排和权限控制模型层只负责语言理解和生成。这样做的好处是模型可以替换业务逻辑保持稳定。在你自己的项目里建议把 AI 功能放在一个独立的模块中例如assistant-service。它对外提供几个业务接口内部再根据场景路由到不同的模型或工作流。不要在业务代码里到处直接调用ChatClient否则后面你想统一加日志、权限、脱敏、成本控制时会非常痛苦。9. 总结与后续学习建议Apple 与 Alibaba 合作训练面向中国市场的 AI 模型对普通开发者最大的启发不是“苹果选了哪家厂商”而是“AI 能力进入真实产品时系统化工程能力比模型本身更关键”。大模型的价值需要通过业务场景定义、上下文管理、工具调用、权限校验和服务降级来释放。这篇文章里我们通过 Spring AI Alibaba 连接了 DashScope实现了文本对话、System Prompt 约束、结构化输出和 NL2SQL 查询。这些能力已经覆盖了大多数后端 AI 应用的骨架。如果你希望继续深入有几个方向值得关注一是 RAG 检索增强生成把企业私域知识文档切成向量后让模型在回答时参考这些资料可以解决模型知识过时和缺少公司内部数据的问题二是 Agent 与 Function Calling让模型根据用户意图自动调用多个外部工具完成更复杂的工作流三是模型微调与蒸馏当 Prompt 已经无法满足效果要求时通过对开源模型或云上模型进行微调来提升专项能力。AI 技术现在迭代非常快今天接通的 API 明天可能就有新版本。保持“抽象层隔离 快速试点 灰度切换”的工程习惯会比追逐某一个模型更持久。如果这篇文章对你有帮助可以先收藏备用后面在真实项目中接入通义千问或 Spring AI Alibaba 时再按步骤实操一遍遇到问题也欢迎在评论区交流。