Spring AI 核心价值与统一设计理念
一、Spring AI 的核心价值1. 抽象与解耦Java生态的AI统一层Spring AI 最核心的价值在于其抽象层Abstraction设计这延续了Spring框架一贯的“简化开发”哲学。正如Spring通过JdbcTemplate和JPA抽象了不同数据库的差异Spring AI将这一理念复刻到了AI领域。核心价值体现价值维度说明降低学习成本开发者无需学习每个AI提供商的专属API和调用细节消除厂商锁定应用程序与特定AI模型实现解耦可自由切换底层模型提升可移植性从OpenAI迁移到Azure OpenAI或本地Ollama仅需修改配置企业级集成与Spring Boot、Spring Security、Spring Cloud等生态无缝融合类比理解Spring AI之于AI模型 ≈ JPA之于数据库 ≈ JDBC之于数据访问2. 企业级AI开发的一站式解决方案Spring AI不仅提供模型接入抽象更覆盖了AI应用开发的完整技术栈┌─────────────────────────────────────────────────────────┐ │ Spring AI 能力矩阵 │ ├─────────────────────────────────────────────────────────┤ │ 模型抽象层 │ ChatClient统一接口支持20模型 │ ├─────────────────────────────────────────────────────────┤ │ 提示词工程 │ PromptTemplate支持动态变量和模板渲染│ ├─────────────────────────────────────────────────────────┤ │ 结构化输出 │ 自动将LLM输出映射为Java POJO│ ├─────────────────────────────────────────────────────────┤ │ 检索增强RAG │ VectorStore抽象适配20向量数据库│ ├─────────────────────────────────────────────────────────┤ │ 函数调用 │ Tool注解声明工具让LLM调用Java方法│ ├─────────────────────────────────────────────────────────┤ │ 对话记忆 │ ChatMemory接口支持滑动窗口和向量检索│ ├─────────────────────────────────────────────────────────┤ │ 多智能体 │ 工作流编排Graph和自主代理Agentic两种模式│ ├─────────────────────────────────────────────────────────┤ │ 可观测性 │ Micrometer集成追踪延迟、Token使用、成本│ └─────────────────────────────────────────────────────────┘二、如何统一 OpenAI 与 Ollama1. 统一抽象的设计原理Spring AI通过分层架构实现对不同模型的统一┌─────────────────────────────────────────────────────────────┐ │ 应用层业务代码 │ │ ChatClient 统一API │ ├─────────────────────────────────────────────────────────────┤ │ Spring AI 抽象层 │ │ ChatModel / EmbeddingModel / VectorStore │ ├─────────────────────────────────────────────────────────────┤ │ 具体实现Starter │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │OpenAI Starter│ │Ollama Starter│ │Azure Starter│ ... │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 底层模型服务 │ │ OpenAI API │ Ollama本地模型 │ Azure OpenAI │ ... │ └─────────────────────────────────────────────────────────────┘2. 代码示例统一调用 OpenAI 和 Ollama2.1 依赖配置OpenAI 依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactId/dependencyOllama 依赖dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-ollama-spring-boot-starter/artifactId/dependency2.2 配置切换OpenAI 配置application.ymlspring:ai:openai:api-key:${OPENAI_API_KEY}model:gpt-4temperature:0.7Ollama 配置spring:ai:ollama:base-url:http://localhost:11434model:llama3 temperature:0.72.3 统一业务代码ServicepublicclassUnifiedChatService{privatefinalChatClientchatClient;// 注入统一的 ChatClient.Builder具体实现由配置决定publicUnifiedChatService(ChatClient.BuilderchatClientBuilder){this.chatClientchatClientBuilder.build();}// 业务代码完全不需要关心底层是OpenAI还是OllamapublicStringchat(Stringmessage){returnchatClient.prompt().user(message).call().content();}// 带系统指令的对话publicStringchatWithSystem(StringuserMessage,StringsystemMessage){returnchatClient.prompt().system(systemMessage).user(userMessage).call().content();}}切换底层模型只需修改配置文件中的模型相关配置业务代码零改动。三、ChatClient 接口的设计理念1. 设计定位AI世界的“JdbcClient”Spring AI官方文档将ChatClient类比为 JDBC 层面的JdbcClient而ChatModel则类比为 JDBC 核心库JDBC层次 Spring AI层次 ───────────────────────────────── JdbcClient → ChatClient (高级抽象方便使用) JDBC Core → ChatModel (底层核心协议适配)2. 核心设计原则2.1 流畅的APIFluent APIChatClient采用建造者模式提供链式调用体验StringresponsechatClient.prompt().system(You are a helpful assistant).user(What is Spring AI?).options(ChatOptions.builder().temperature(0.8).build()).call().content();2.2 多消息角色支持ChatClient完整支持OpenAI定义的消息角色体系角色用途示例System设定AI行为准则和风格“你是专业的Java开发助手”User用户输入的问题或指令“帮我写一个排序算法”AssistantAI的响应自动管理框架自动处理Tool工具调用的返回结果函数执行后的返回值2.3 可扩展的顾问链Advisor Chain这是ChatClient最强大的设计——责任链模式实现请求/响应的拦截增强┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ Request │ → │ Logger │ → │ Memory │ → │ RAG │ → │ LLM │ │ │ │ Advisor │ │ Advisor │ │ Advisor │ │ │ └──────────┘ └──────────┘ └──────────┘ └─────────┘ └────────┘ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ Response │ ← │ Logger │ ← │ Validation│ ← │ Parser │ ←───────┘ │ │ │ Advisor │ │ Advisor │ │ Advisor │ └──────────┘ └──────────┘ └──────────┘ └─────────┘内置Advisor示例// 1. 日志记录SimpleLoggerAdvisorloggerAdvisornewSimpleLoggerAdvisor();// 2. 对话记忆MessageChatMemoryAdvisormemoryAdvisornewMessageChatMemoryAdvisor(chatMemory);// 3. RAG检索增强QuestionAnswerAdvisorragAdvisornewQuestionAnswerAdvisor(vectorStore,searchRequest);// 4. 工具调用循环递归顾问ToolCallAdvisortoolAdvisorToolCallAdvisor.builder().toolCallingManager(toolCallingManager).build();// 组合使用ChatClientclientChatClient.builder(chatModel).defaultAdvisors(loggerAdvisor,memoryAdvisor,ragAdvisor,toolAdvisor).build();2.4 递归顾问Recursive Advisor- Spring AI 1.1.0新增从1.1.0-M4开始Spring AI引入了递归顾问支持多次循环执行顾问链实现迭代工作流publicclassMyRecursiveAdvisorimplementsCallAdvisor{OverridepublicChatClientResponseadviseCall(ChatClientRequestrequest,CallAdvisorChainchain){ChatClientResponseresponsechain.nextCall(request);// 递归条件验证输出质量不满足则重试while(!isValid(response)){// 根据失败原因修改请求ChatClientRequestmodifiedRequestmodifyWithFeedback(request,response);// 创建子链递归调用responsechain.copy(this).nextCall(modifiedRequest);}returnresponse;}}内置递归顾问ToolCallAdvisor工具调用循环支持多工具顺序执行StructuredOutputValidationAdvisor结构化输出验证失败时自动重试3. 提示词模板PromptTemplateChatClient 配合PromptTemplate实现提示词的可维护管理// 从资源文件加载模板Value(classpath:/prompts/system-message.st)privateResourcesystemPromptResource;publicStringchatWithTemplate(Stringname,Stringvoice,StringuserMessage){// 系统提示词模板SystemPromptTemplatesystemTemplatenewSystemPromptTemplate(systemPromptResource);MessagesystemMessagesystemTemplate.createMessage(Map.of(name,name,voice,voice));// 用户消息MessageuserMessageObjnewUserMessage(userMessage);// 组合PromptPromptpromptnewPrompt(List.of(systemMessage,userMessageObj));returnchatModel.call(prompt).getResult().getOutput().getContent();}4. 结构化输出ChatClient支持将LLM输出直接映射为Java对象// 定义输出类型publicrecordActorFilms(Stringactor,ListStringmovies){}// 直接获取结构化对象ActorFilmsresultchatClient.prompt().user(Generate the filmography for Tom Hanks).call().entity(ActorFilms.class);// 自动JSON解析类型转换四、总结ChatClient的设计哲学设计理念具体体现约定优于配置通过starter自动配置最小化样板代码抽象优于具体ChatClient接口统一底层模型可插拔组合优于继承Advisor责任链实现功能增强灵活组合流畅接口建造者模式提供直观的链式API可观测性优先内置日志、监控、追踪支持Spring AI通过ChatClient的统一抽象让Java开发者可以用一套API驾驭从云端OpenAI到本地Ollama的各种大模型真正实现了“Write Once, Run Any AI Model”的愿景。