ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring AI 实战:用 DeepSeek 和 Langchain4j 构建 Java RAG 应用

Spring AI 实战:用 DeepSeek 和 Langchain4j 构建 Java RAG 应用 入行 Java AI 开发的朋友或多或少都会遇到同一个困惑Spring AI 的版本迭代太快了今天照着教程写完代码明天升级一个小版本就换 APIDeepSeek 的调用方式刚熟悉又冒出 Langchain4j、Spring AI Alibaba 一堆组件不知道它们到底什么关系。这篇教程就来一次性理清这条链路从 Spring Boot 项目搭建开始逐步接入 DeepSeek、整合 Spring AI Alibaba再通过 Langchain4j 把 Milvus 向量检索接进来组成一套完整的 Java RAG 应用。零基础的同学可以跟着流程跑通有经验的同学可以直接跳到第 4 章看多模型切换和结构化输出也可以到第 6 章对照排查高频报错。1. Spring AI 2.0 中的几个关键概念1.1 Spring AI 到底解决什么问题在没有 Spring AI 之前Java 项目接入大模型的方式比较原始用 HTTP 客户端手动调用各家模型的 REST API自己封装请求参数、解析流式返回、管理对话历史。模型一多代码就开始重复而且每个厂商的协议细节都不一样维护成本很高。Spring AI 做的事情就是把这层公共能力抽象出来类似 Spring 生态里 JdbcTemplate 对数据库操作做的事情。它提供了统一的 ChatClient、ChatModel、EmbeddingModel 等接口让开发者用同一套代码风格去对接 OpenAI、DeepSeek、通义千问、Ollama 等多种模型。进入 2.x 时代之后它的重心从“能不能调通模型”转向了“如何工程化落地”比如结构化输出、工具调用、向量存储抽象、Agent 编排等能力逐渐成为核心。这里要提醒一点Spring AI 的版本号变化很快文中示例基于当前主流的 2.x 写法但不同小版本之间仍然可能调整方法名或包名。遇到编译报错时优先检查当前依赖的版本对应文档这才是最稳妥的方式。1.2 Langchain4j 和 Spring AI 不是竞争关系经常有同学问既然 Spring AI 能做 AI 应用开发为什么还要学 Langchain4jLangchain4j 是 Java 社区早期就开始做的 LLM 编排框架思路和 Python 的 LangChain 类似提供文档加载、文本切分、向量存储、提示词模板、输出解析等一整套能力。它在模型接入、向量检索、Agent 等领域起步很早尤其是对 Milvus、Redis、ES 这些向量存储的适配非常成熟。在实际项目中Spring AI 和 Langchain4j 并不是非此即彼的关系。你可以让 Spring AI 负责 ChatModel 的统一接入和 Web 层集成让 Langchain4j 负责文档处理和检索增强RAG链路两者各取所长。本文第 5 章的检索案例就是这种组合方式。1.3 DeepSeek 和 Spring AI Alibaba 的定位DeepSeek 是国产大模型中的热门选择它的 API 协议兼容 OpenAI 风格因此接入 Spring AI 非常方便既可以走 OpenAI 兼容端点也可以通过 Spring AI Alibaba 的适配模块接入。它适合对成本敏感、需要中英文对话、代码生成和逻辑推理能力的场景。Spring AI Alibaba 是阿里开源的一套 Spring AI 增强方案核心价值在于一方面把通义千问DashScope模型和阿里云百炼平台的能力接入 Spring AI另一方面提供了更多企业级组件比如 Graph 编排、AI Agent 相关扩展。它的一个明显优势是“开箱即用”的依赖管理和多模型路由能力。所以在同一个 Spring Boot 项目里你可以同时配置 DeepSeek 和通义千问按业务场景切换模型这就是多模型架构的雏形。1.4 适用场景速览理解了上面几个概念后这套技术栈适合哪些场景就很清楚了企业内部知识库问答文档导入、向量化、检索增强生成。代码辅助工具根据上下文生成代码、解释报错、生成单元测试。智能客服接入对话模型结合业务数据库做自动回答。多模型调度平台把不同模型的成本、速度、能力做成可配置的策略。学习 Spring AI 生态熟悉框架演进方向为后续 Agent 开发打基础。一句话概括这套组合适合想用 Java 技术栈把大模型能力真正落地到业务系统里的开发者。2. 环境准备与版本说明2.1 开发环境清单本文示例以本地开发环境为准建议提前准备好以下工具JDK17 或更高版本。Spring Boot 3.x 和 Spring AI 2.x 都要求 JDK 17 起建议直接使用 JDK 21避免部分新语法不兼容。Maven3.8 以上或者使用 Gradle。IDEIntelliJ IDEA 或其他你习惯的 Java IDE。Docker后续使用 Milvus 向量数据库时会用到。API KeyDeepSeek 开放平台的 Key如果需要体验 Spring AI Alibaba再准备一个阿里云百炼DashScope的 Key。这些工具都没必要追求最新版稳定即可。重点是保证 JDK 和 Spring Boot 的版本匹配否则项目可能直接启动失败。2.2 Spring Boot 与 Spring AI 版本搭配Spring AI 对 Spring Boot 版本有依赖要求。通常你在 Spring Boot 3.2 的项目中引入 Spring AI 2.x 的 Starter 就能工作。更规范的做法是使用 Spring Initializrstart.spring.io生成项目时在依赖里搜索 Spring AI让官方帮我们生成版本兼容的坐标。如果你是在已有项目中手动引入建议统一使用 Spring BOM 管理版本避免多个 AI 相关依赖版本不一致dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagementSpring AI Alibaba 也有自己的 BOM建议同时引入dependencyManagement dependencies dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-bom/artifactId version${spring-ai-alibaba.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement这里不写死具体版本号因为这两个项目的版本迭代速度非常快。建议到对应的官方发布页面确认最新稳定版本。记住一条原则BOM 版本统一管理不要手工修改内部传递依赖的版本。2.3 准备 DeepSeek API KeyDeepSeek 开放平台申请 Key 的流程不复杂注册账号后进入控制台创建一个 API Key然后给账户充值少量额度即可开始测试。DeepSeek 的 API 兼容 OpenAI 协议所以你在网络上看到的很多 OpenAI 客户端工具也可以配置为 DeepSeek 端点。常用模型名有两个模型名模型类型适用场景deepseek-chat通用对话模型日常对话、代码生成、文本处理deepseek-reasoner深度思考模型复杂推理、数学题、逻辑分析调用 deepseek-reasoner 时模型会返回额外的 reasoning_content 字段这个字段在多轮对话里需要特别处理。第 6 章会专门讲这个坑。2.4 准备通义千问 DashScope API Key可选如果你想体验 Spring AI Alibaba 的完整能力可以到阿里云百炼控制台开通模型服务创建 DashScope API Key。不需要把 Key 直接写到代码里放在环境变量或本地配置文件中启动时注入即可。如果暂时没有阿里云账号也可以只使用 DeepSeek 完成本文前 3 章的内容第 4 章再决定是否补充。3. 用 Spring AI 调用 DeepSeek 的最小案例3.1 引入基础依赖使用 Spring Initializr 创建 Spring Boot 项目选择 JDK 17 或 21。为了通过 OpenAI 兼容方式调用 DeepSeek我们需要引入 spring-ai 的 OpenAI Starter。创建一个空的 Spring Boot Web 项目后在 pom.xml 中添加dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency这个 Starter 会引入 Spring AI 的 ChatModel 抽象和 OpenAI 客户端相关类。我们不用它连接 OpenAI 官方而是把 Base URL 指向 DeepSeek。3.2 配置 DeepSeek 端点在src/main/resources/application.yml中配置spring: application: name: spring-ai-demo ai: openai: base-url: https://api.deepseek.com api-key: ${DEEPSEEK_API_KEY} chat: options: model: deepseek-chat temperature: 0.7这里重点说明几个配置项base-url模型的 HTTP 接入地址DeepSeek 官方地址是https://api.deepseek.com同时兼容/v1路径一般不用额外拼接。api-key通过${DEEPSEEK_API_KEY}读取环境变量不要把真实 Key 写在仓库里。chat.options.model指定默认模型名这里用 deepseek-chat。temperature控制随机性值越低越稳定代码生成场景建议 0.2 到 0.5。如果你的 Spring AI 版本较新也可以使用更细分的配置项比如单独设置 Base URL、聊天补全路径等。原则是“按你当前依赖的版本文档来”。3.3 编写 ChatClient 测试接口Spring AI 中最常用的入口是 ChatClient它设计为流式风格的链式调用。我们直接注入 ChatClient把它封装成一个 REST API// 文件路径src/main/java/com/example/springaidemo/controller/ChatController.java RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam String message) { return chatClient.prompt(message).call().content(); } GetMapping(/chat/stream) public FluxString chatStream(RequestParam String message) { return chatClient.prompt(message).stream().content(); } }这个类做了三件事通过构造器注入 ChatClient.Builder这是 Spring AI 推荐的使用方式。定义/chat接口同步返回模型的完整回复。定义/chat/stream接口使用 Flux 流式返回适合打字机效果。启动项目后在浏览器或命令行里访问curl http://localhost:8080/chat?message你好用一句话介绍你自己正常情况下接口会返回 DeepSeek 模型的回复。如果你看到报错先检查 API Key 是否正确、账户是否余额充足。3.4 增加系统提示词多数业务场景需要给模型指定身份或约束Spring AI 里推荐使用 system prompt。修改上面的 ControllerGetMapping(/chat/assistant) public String chatWithSystem(RequestParam String message) { return chatClient.prompt() .system(你是一位Java技术专家回答问题时保持简洁必要时给出代码示例。) .user(message) .call() .content(); }在 ChatGPT 时代我们常说的 System Reminder本质上就是这里的system()方法设置的系统提示词。它可以固定模型行为减少被用户提示词带偏的概率。生产环境建议把系统提示词放在配置中心或独立的提示词模板文件里方便业务调整。4. Spring AI Alibaba 集成与多模型切换4.1 Spring AI Alibaba 的实际价值使用 DeepSeek 跑通基础对话后下一步自然是考虑 Spring AI Alibaba。它带来的几个能力是单独使用 OpenAI Starter 不具备的通义千问系列模型的一站式接入。阿里云百炼平台的模型服务、知识库、Agent 等企业能力整合。更完善的 Spring AI 扩展组件比如 Graph 编排、多模型路由。把 DeepSeek 和 Spring AI Alibaba 放一起你就可以在同一个项目中根据业务切换模型日常客服用成本低的模型复杂推理走深度思考模型向量化任务交给 Embedding 模型。4.2 引入 Spring AI Alibaba 依赖在 pom.xml 中添加 DashScope 的 Starter。具体 artifactId 在不同版本中可能调整为spring-ai-starter-alibaba-dashscope或spring-ai-alibaba-starter-dashscope请以官方文档为准dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-starter-alibaba-dashscope/artifactId /dependency同时保留第 3 章的 OpenAI Starter这样项目里会出现两个 ChatModel 实现。4.3 配置双模型在application.yml中增加 DashScope 的配置spring: ai: openai: base-url: https://api.deepseek.com api-key: ${DEEPSEEK_API_KEY} chat: options: model: deepseek-chat dashscope: api-key: ${DASHSCOPE_API_KEY} chat: options: model: qwen-plus这里再次强调配置项命名在不同版本里可能有区别。如果启动时遇到参数解析失败检查一下 Spring AI Alibaba 对应版本的具体配置前缀。4.4 通过 Qualifier 切换模型当 Spring 容器中有多个 ChatModel 时我们需要显式指定使用哪一个。最直接的方式是用QualifierRestController public class MultiModelController { private final ChatModel deepSeekChatModel; private final ChatModel qwenChatModel; public MultiModelController( Qualifier(openAiChatModel) ChatModel deepSeekChatModel, Qualifier(dashScopeChatModel) ChatModel qwenChatModel) { this.deepSeekChatModel deepSeekChatModel; this.qwenChatModel qwenChatModel; } GetMapping(/chat/deepseek) public String chatDeepSeek(RequestParam String message) { return deepSeekChatModel.call(message); } GetMapping(/chat/qwen) public String chatQwen(RequestParam String message) { return qwenChatModel.call(message); } }Bean 的名称也就是那个Qualifier占位符可能会因版本不同而不同。如果你不确定实际 Bean 名称可以在启动日志中查看 Spring 输出的 Bean 列表或者参考对应 Starter 的自动配置类。更优雅的做法是定义一个枚举和配置映射把“业务场景 - 模型”做成可配置的 Map从而避免在业务代码里硬编码模型名。4.5 结构化输出让 AI 返回实体类接入模型之后开发者很快会遇到第二个问题模型返回的是字符串怎么转成 Java 对象供业务使用Spring AI 提供了结构化输出能力。比如我们想让模型返回一篇技术文章的信息可以这样定义实体// 文件路径src/main/java/com/example/springaidemo/model/Article.java public record Article( String title, String summary, ListString tags, String author ) {}然后在 Controller 中使用entity()方法RestController public class StructureController { private final ChatClient chatClient; public StructureController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/article) public Article generateArticle(RequestParam String topic) { return chatClient.prompt() .system(你是一个技术文章编辑请输出 JSON。) .user(为这个话题生成一篇短文章信息 topic) .call() .entity(Article.class); } }Spring AI 底层会自动生成 JSON Schema 拼进提示词并解析模型返回的 JSON 到Article对象。这里的关键点是实体类的字段名需要和模型返回的 JSON 字段含义一致必要时用中文提示词约束。如果解析失败优先检查返回内容是否被 Markdown 代码块包裹或者字段类型是否匹配。结构化输出是把 AI 能力接入业务系统的关键一步强烈建议单独花时间研究。5. Langchain4j Milvus 搭建 Java RAG 检索链路5.1 RAG 流程拆解RAGRetrieval-Augmented Generation是目前企业落地 AI 应用最成熟的方案核心思路是“先检索再生成”。以企业内部文档问答为例流程可以拆成两条链路离线索引链路加载文档。按规则切分成文本块。调用 Embedding 模型将文本块向量化。将向量和原始文本存入向量数据库。在线问答链路用户提问。将问题向量化。在向量数据库中检索相似文本。把检索结果拼接到提示词中交给大模型生成答案。在这条链路中Langchain4j 提供了文档处理、切分、向量化入库的工具类Milvus 充当向量数据库而 Spring AI 负责最终的大模型对话。5.2 引入 Langchain4j 依赖在 pom.xml 中引入 Langchain4j 的相关模块。以 Milvus 向量存储为例大致需要这几个模块dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-milvus/artifactId /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId /dependency这里langchain4j-open-ai用于对接 OpenAI 兼容的 Embedding 服务我们同样可以把它指向 DeepSeek 或其他兼容服务。具体坐标以 Maven 仓库和 Langchain4j 官方文档为准。5.3 启动 MilvusMilvus 是开源的高性能向量数据库本地开发推荐使用 Docker 启动docker run -d --name milvus \ -p 19530:19530 \ -p 9091:9091 \ milvusdb/milvus:latest启动完毕后Milvus 默认监听19530端口。生产环境不建议直接使用 latest 标签应该固定版本。5.4 文档切分与入库示例下面是 Langchain4j 完成文档切分和向量化入库的示例思路。// 文件路径src/main/java/com/example/springaidemo/rag/DocumentIndexService.java Service public class DocumentIndexService { private final EmbeddingModel embeddingModel; private final EmbeddingStoreTextSegment embeddingStore; public DocumentIndexService() { // 示例使用 OpenAI 兼容的 Embedding 服务 // 具体构造方法以 Langchain4j 实际版本为准 this.embeddingModel OpenAiEmbeddingModel.builder() .baseUrl(https://api.deepseek.com) .apiKey(System.getenv(DEEPSEEK_API_KEY)) .modelName(text-embedding-ada-002) .build(); this.embeddingStore MilvusEmbeddingStore.builder() .host(localhost) .port(19530) .collectionName(java_docs) .dimension(1536) .build(); } public void indexText(String text) { Document document Document.from(text); DocumentSplitter splitter DocumentSplitters.recursive(300, 50); ListTextSegment segments splitter.split(document); embeddingStore.addAll( embeddingModel.embedAll(segments).stream() .map(Embedding::vector) .toList(), segments ); } }这段代码展示了核心流程但有几个点需要特别注意Embedding 模型的选择要和向量维度匹配。如果你使用通义千问的text-embedding-v3维度通常是 1024如果使用 OpenAI 兼容接口维度取决于具体模型。MilvusEmbeddingStore 构造参数在不同版本可能有变化建议直接阅读对应版本的 API 文档。切分参数300 字一块、50 字重叠需要根据业务文档类型调整代码类文档和技术文档的切分策略都应该做实验。5.5 混合检索和重排生产环境中纯向量检索在某些关键词精确匹配场景下并不够用更推荐“混合检索 重排”的方案。混合检索指同时使用向量相似度和全文关键词匹配Langchain4j 的 Milvus 模块可以配置标量过滤也可以配合 Elasticsearch 等实现双重召回。重排是指对召回结果做精细排序把最相关的片段排到前面。简单的做法是在代码中按分数重新排序更好的做法是接入一个专门的 Rerank 模型。Langchain4j 生态中已经有 rerank 相关的抽象结合 Spring AI Alibaba 时也可以使用百炼的重排服务。// 混合检索示例思路 retriever EmbeddingStoreRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(5) .minScore(0.6) .build();这里的maxResults就是你要传给大模型的检索片段数量上限也是控制上下文长度的关键参数。问题越复杂通常需要适当增加maxResults但过大会导致提示词膨胀增加模型开销。5.6 基于检索结果的问答Langchain4j 提供了RetrievalAugmentor和AiServices来把检索和对话串起来// 文件路径src/main/java/com/example/springaidemo/rag/RagService.java public interface Assistant { String answer(String question); } Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatLanguageModel) .retriever(retriever) .build();当调用assistant.answer(question)时Langchain4j 会自动完成问题向量化 - 向量检索 - 将检索结果加入提示词 - 调用大模型生成答案。这大大简化了 RAG 应用的开发成本。如果不使用 AiServices也可以手动拼接先检索出文本片段再把“参考内容 用户问题”一起传给 ChatClient 的 prompt。两种方式各有优劣手动拼接更直观AiServices 更自动化和规范。6. 常见问题与排查思路问题现象常见原因解决思路调用 DeepSeek 返回 HTTP 400深度思考模型的 reasoning_content 未正确传回多轮对话保留 reasoning_content或切换到 deepseek-chat调用模型时连接中断/超时网络超时、API 网关响应慢、未配置重试配置连接超时和重试机制区分临时故障与配置错误向量文档重复入库每次执行索引逻辑都新增文档缺少幂等控制使用文档 ID 做 upsert入库前检查是否已存在模型返回 JSON 无法解析未开启结构化输出或返回被 Markdown 包裹使用 entity() 方法并明确要求输出纯 JSON上下文过长Token 超限检索片段过多或历史消息未裁剪限制 maxResults、历史消息轮数使用 token 截断策略启动报错 Bean 不存在Spring AI 版本与 Spring Boot 不兼容统一使用 BOM 管理版本检查官方兼容表6.1 DeepSeek 深度思考模型的 reasoning_content 报错这是 DeepSeek 接入时比较典型的坑。使用 deepseek-reasoner 时模型返回的内容里包含推理过程和正式回答两部分其中推理内容就是 reasoning_content。如果你在多轮对话或代理转发时没有把这个字段处理正确再次调用 API 时可能收到 400 错误错误信息通常提示 reasoning_content 必须回传给 API。解决思路有几种如果业务不需要深度思考直接使用 deepseek-chat避免 reasoning_content 的存在。如果需要深度思考多轮对话时要把上轮返回的 reasoning_content 原样携带。如果使用 Spring AI 封装时遇到处理困难考虑先通过原始 HTTP 调用调试确认返回结构再做框架适配。6.2 链接中断和重连Spring AI 调用大模型本质是 HTTP 调用网络抖动和长时间生成都可能造成连接中断。建议在配置层面开启超时和重试设置合理的连接超时时间一般在 10 到 60 秒之间。对网络层瞬时错误做指数退避重试但要避免对业务性错误重复重试。在日志中记录完整的请求 ID 和错误响应体方便定位。6.3 ES 向量文档重复添加问题如果使用 Elasticsearch 做向量存储反复执行入库任务时每次都会新增文档导致知识库越来越冗余。解决思路是使用稳定的文档 ID 执行 upsert。Langchain4j 的 Elasticsearch 模块通常支持指定文档 ID你可以在入库前计算文本块的哈希值作为 ID 写入。如果索引中已经存在该 ID新的写入会覆盖旧内容。6.4 控制上下文关联数量“如何指定关联的上下文的数量限制”是 RAG 应用中的高频问题。你需要从几个层面控制向量检索时限制返回片段数量比如只取 top 3 到 top 5。控制每个检索片段的字符长度避免过长文本块挤占上下文。控制多轮对话的历史窗口只保留最近若干轮。在提示词中要求模型只根据给定上下文回答超出部分明确拒绝。7. 最佳实践与工程建议7.1 版本和配置管理AI 领域的依赖版本变化比其他 Java 组件更快。建议在项目中使用 BOM 统一管理 Spring AI 和 Spring AI Alibaba 版本不要多个模块各自引入不同版本。每次升级版本后跑一遍全链路测试确认结构化输出、检索、流式响应没有回归。API Key 绝不能出现在代码仓库中。本地开发使用环境变量测试和生产环境使用密钥管理服务比如阿里云 KMS、Vault 等。密钥轮换时要保证应用可以动态读取新配置避免重启。7.2 超时、重试与降级大模型接口的延迟波动很大不能像调用内部数据库一样假设它总是快速响应。建议对聊天接口设置独立超时时间。对瞬时网络异常做有限次重试使用指数退避。在关键业务链路中增加降级策略比如模型不可用时返回人性化错误提示而不是让用户看到异常堆栈。流式输出时处理客户端断开场景及时释放连接资源。7.3 成本控制多模型架构的一个优势是成本可控。你可以把简单任务路由到便宜的小模型把复杂任务路由到强模型。同时限制用户输入长度、控制检索数量、缓存高频提问的回答这些都能明显降低模型调用成本。7.4 日志与可观测性每次模型调用都应该记录请求内容、模型名称、Token 消耗、耗时、返回状态。有条件的话把日志接入链路追踪系统。这样当用户反馈“答案质量差”时你可以回溯到当时的输入上下文和检索结果而不是靠猜。7.5 安全与合规边界大模型应用涉及的内容安全、数据隐私等问题不能忽略。在生产环境接入模型前建议对用户输入做敏感信息过滤。对模型输出做合规校验避免未经审核的内容直接展示给用户。企业内部数据如果不适合出外网优先使用私有化模型或合规的企业级平台。对用户提交的提示词注入攻击保持警惕不要在 system prompt 中拼接不可信内容。7.6 测试策略AI 应用的测试和传统应用不一样模型输出存在随机性不能直接断言“等于某个字符串”。建议使用固定的 temperature比如 0保证测试可重复。对结构化输出做 JSON Schema 校验。对 RAG 效果准备一组标准问题人工评估答案质量。使用 Mock 模型做单元测试避免每次测试都消耗 API 额度。8. 总结与学习路线到这里整套流程已经走通你用 Spring Boot 搭建了项目通过 Spring AI 的 OpenAI 兼容端点接入了 DeepSeek引入了 Spring AI Alibaba 实现多模型切换和结构化输出又用 Langchain4j 和 Milvus 搭建了文档检索与问答链路。这个组合基本覆盖了 Java 后端 AI 应用开发的主要模块。接下来可以按这条路线继续深入先深入 Spring AI 的 ChatClient 和工具调用Function Calling让模型具备调用业务 API 的能力。再研究 Spring AI Alibaba 的 Graph 和 Agent 相关组件理解多步骤任务编排。接着优化 RAG 链路尝试不同 Embedding 模型、重排模型、混合检索参数。最后把应用容器化接入配置中心、日志系统、监控体系做成真正的生产系统。这套技术栈还在高速演进隔几个月就会有新版本、新组件。建议在学习时多关注官方文档和 Release Notes遇到 API 变化不要慌核心抽象其实一直很稳定。你掌握的 ChatModel、VectorStore、Structured Output 这些概念换到任何模型或框架都通用。如果这篇教程对你有帮助可以收藏备用也欢迎在评论区聊聊你遇到的版本适配问题。
返回列表