找回密码
 立即注册
首页 业界区 业界 炸裂!Spring AI 1.0 正式发布,让 Java 再次伟大! ...

炸裂!Spring AI 1.0 正式发布,让 Java 再次伟大!

赶塑坠 2025-6-3 00:20:26
炸裂,炸裂,炸裂!从第一次提交代码到现在,经过 2 年的沉淀,Spring AI 框架的第一个正式版本 1.0 终于发布了。
1.png

有了这玩意,开发 AI 应用就是洒洒水的事,Java 开发者们是不是又爽了,反正我是很兴奋啊,让 Java 再次伟大!
2.png

但可能很多同学还不知道 Spring AI 能干什么,凭什么这玩意就让 Java 伟大了?
正好我最近刚带编程导航的同学做完一套 AI 超级智能体实战项目,毫不夸张地说,我已经把 Spring AI 玩得 “手拿把掐” 了。
3.png

下面我来给大家快速分享一下 Spring AI 的核心能力和魔法。看完之后,我相信你会点赞收藏三连,并且说一句:“伟的太大了”。
 
Spring AI 核心特性

1、大模型调用能力

大模型调用能力是 AI 应用开发的基础,允许应用程序与各种 AI 大模型进行交互,发送提示词并获取模型的响应。Spring AI 提供了统一的接口来支持各种主流大模型,包括 OpenAI GPT 系列、Claude、通义千问等。
4.png

Spring AI 通过配置 + 抽象接口简化了大模型的调用过程,我可以直接在配置中声明多个大模型:
  1. spring:<br>ai:<br>   # 阿里大模型<br>  dashscope:<br>    chat:<br>      options:<br>        model: qwen-max<br>   # 本地大模型<br>  ollama:<br>    base-url: http://localhost:11434<br>    chat:<br>      model: gemma3:1b<br>   # 谷歌大模型<br>  vertex:<br>    ai:<br>      gemini:<br>        chat:<br>          options:<br>            model: gemini-1.5-pro-001
复制代码
然后使用支持链式调用的 ChatClient 灵活地调用各种不同的大模型:
  1. // 使用 Spring AI 调用大模型<br>@Bean<br>public ChatClient chatClient(ChatModel chatModel) {<br>   return ChatClient.builder(chatModel).build();<br>}<br>​<br>public String doChat(String message) {<br>   ChatResponse response = chatClient<br>          .prompt(message)<br>          .call()<br>          .chatResponse();<br>   return response.getResult().getOutput().getText();<br>}
复制代码
只用一行代码,就能支持 Stream 流式响应,实现打字机效果:
  1. chatClient<br>  .prompt(message)<br>  .stream()
复制代码
如果不使用 Spring AI,则需要为每个模型分别实现 API 调用,要自己编写请求、解析响应,很麻烦!
  1. // 不使用 Spring AI 调用大模型<br>public String chatWithOpenAI(String message) {<br>   // 配置 OpenAI API<br>   OkHttpClient client = new OkHttpClient();<br>   MediaType JSON = MediaType.get("application/json; charset=utf-8");<br>   <br>   // 构建请求体<br>   JSONObject requestBody = new JSONObject();<br>   requestBody.put("model", "gpt-3.5-turbo");<br>   JSONArray messages = new JSONArray();<br>   JSONObject userMessage = new JSONObject();<br>   userMessage.put("role", "user");<br>   userMessage.put("content", message);<br>   messages.put(userMessage);<br>   requestBody.put("messages", messages);<br>   <br>   // 发送请求<br>   RequestBody body = RequestBody.create(requestBody.toString(), JSON);<br>   Request request = new Request.Builder()<br>          .url("https://api.openai.com/v1/chat/completions")<br>          .header("Authorization", "Bearer " + OPENAI_API_KEY)<br>          .post(body)<br>          .build();<br>           <br>   try (Response response = client.newCall(request).execute()) {<br>       String responseBody = response.body().string();<br>       JSONObject jsonResponse = new JSONObject(responseBody);<br>       return jsonResponse.getJSONArray("choices")<br>              .getJSONObject(0)<br>              .getJSONObject("message")<br>              .getString("content");<br>  } catch (Exception e) {<br>       return "Error: " + e.getMessage();<br>  }<br>}
复制代码
Spring AI 不仅提供了统一接口支持多种大模型,让我们可以轻松切换模型而无需修改业务代码。它还支持多模态大模型调用,使 AI 能够同时处理文本、图像、音频等多种输入类型。
我们只需要将图片等资源添加到消息对象中,一起发送给 AI 就可以了,使用 Spring AI 几行代码就能实现:
  1. // 调用多模态模型<br>String response = ChatClient.create(chatModel).prompt()<br>  .user(u -> u.text("描述这张图片中的内容")<br>              .media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/yupi.png")))<br>  .call()<br>  .content();
复制代码
如果不使用 Spring AI,多模态处理将变得复杂得多:
  1. // 不使用 Spring AI 的多模态实现<br>public String analyzeImage(String textPrompt, File imageFile) {<br>   // 读取图像文件并编码为 Base64<br>   String base64Image = "";<br>   try {<br>       byte[] fileContent = Files.readAllBytes(imageFile.toPath());<br>       base64Image = Base64.getEncoder().encodeToString(fileContent);<br>  } catch (IOException e) {<br>       return "Error reading image file: " + e.getMessage();<br>  }<br>   <br>   // 构建请求体,不同模型的格式差异很大<br>   JSONObject requestBody = new JSONObject();<br>   requestBody.put("model", "gpt-4-vision-preview");<br>   <br>   JSONArray messages = new JSONArray();<br>   JSONObject userMessage = new JSONObject();<br>   userMessage.put("role", "user");<br>   <br>   // 构建复杂的内容数组<br>   JSONArray contentArray = new JSONArray();<br>   <br>   // 添加文本部分<br>   JSONObject textContent = new JSONObject();<br>   textContent.put("type", "text");<br>   textContent.put("text", textPrompt);<br>   contentArray.put(textContent);<br>   <br>   // 添加图像部分<br>   JSONObject imageContent = new JSONObject();<br>   imageContent.put("type", "image_url");<br>   JSONObject imageUrl = new JSONObject();<br>   imageUrl.put("url", "data:image/png;base64," + base64Image);<br>   imageContent.put("image_url", imageUrl);<br>   contentArray.put(imageContent);<br>   <br>   userMessage.put("content", contentArray);<br>   messages.put(userMessage);<br>   requestBody.put("messages", messages);<br>   <br>   // 发送请求并解析响应...<br>   // 代码略<br>}
复制代码
此外,Spring AI 提供了强大的 Advisors 机制,有点类似面向切面编程,可以在模型调用前后添加额外的逻辑,增强 AI 的能力。
举个例子,使用 Spring AI 内置的日志 Advisor,一行代码就能在调用 AI 前后记录日志:
  1. // 使用 Advisors 增强 ChatClient<br>public String doChatWithAdvisors(String message, String chatId) {<br>   ChatResponse response = chatClient<br>          .prompt()<br>          .user(message)<br>           // 添加日志 Advisor<br>          .advisors(new LoggingAdvisor())<br>          .call()<br>          .chatResponse();<br>   return response.getResult().getOutput().getText();<br>}
复制代码
Advisor 的应用场景还有很多,比如调用 AI 前检查提示词是否安全、得到 AI 响应后保存到数据库中等等。
2、提示工程

提示工程(Prompt Engineering)是一门复杂的学问,指通过精心设计提示词,让 AI 更准确地理解用户意图,生成更符合预期的回答,减少幻觉(生成虚假信息)的概率,同时优化 AI 模型的性能表现并节省成本。
Spring AI 通过 Prompt 和 PromptTemplate 类实现提示工程。
Prompt 类可以统一封装多种不同类型的提示词,便于发送给大模型:
  1. // 用户提示词<br>Message userMessage = new UserMessage(userText);<br>// 系统提示词<br>Message systemMessage = new SystemMessage(systemText);<br>Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
复制代码
利用 PromptTemplate 可以创建支持替换变量的提示词模板,便于提示词的维护和复用:
  1. // 使用 Spring AI 的提示模板<br>PromptTemplate promptTemplate = new PromptTemplate("你好,我是{name},我擅长{skill}");<br>Prompt prompt = promptTemplate.create(Map.of(<br>   "name", "鱼皮", <br>   "skill", "编程"<br>));<br>ChatResponse response = chatClient.call(prompt);
复制代码
如果不使用 Spring AI,你就需要手动 / 或者利用工具类来拼接提示词字符串,会更麻烦:
  1. // 不使用 Spring AI 需要手动字符串拼接<br>String name = "AI 恋爱顾问";<br>String skill = "解决恋爱问题";<br>String promptText = "你好,我是" + name + ",我擅长" + skill;<br>// 还需自行实现条件逻辑、变量转义等<br>if(hasCondition) {<br>   promptText += ",我注意到你可能遇到了" + conditionType + "问题";<br>}<br>// 调用 API 需自行封装请求<br>Response response = apiClient.sendPrompt(promptText);
复制代码
 
3、会话记忆

会话记忆(Chat Memory)使 AI 能够保存多轮对话历史,理解上下文,实现连贯对话体验,防止 AI 断片儿。
利用 Spring AI 的 Advisor 机制,一行代码就能轻松开启对话记忆:
  1. // 使用 Spring AI 的会话记忆<br>public String doChatWithMemory(String message, String chatId) {<br>   ChatResponse response = chatClient<br>          .prompt()<br>          .user(message)<br>          .advisors(<br>               // 将对话记忆保存到内存中<br>               new MessageChatMemoryAdvisor(new InMemoryChatMemory())<br>          )<br>          .call()<br>          .chatResponse();<br>   return response.getResult().getOutput().getText();<br>}
复制代码
还可以设置会话 id 实现隔离、设置上下文大小限制等参数:
  1. // 使用 Spring AI 的会话记忆<br>public String doChatWithMemory(String message, String chatId) {<br>   ChatResponse response = chatClient<br>          .prompt()<br>          .user(message)<br>          .advisors(<br>               // 将对话记忆保存到内存中<br>               new MessageChatMemoryAdvisor(new InMemoryChatMemory())<br>          )<br>          .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)<br>                  .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))<br>          .call()<br>          .chatResponse();<br>   return response.getResult().getOutput().getText();<br>}
复制代码
Spring AI 会自动处理上下文窗口大小限制,避免超出模型最大 token 限制。
如果不使用 Spring AI,需要手动管理对话历史,代码量一下子就上来了:
  1. // 不使用 Spring AI 的会话记忆实现<br>Map<String, List<Message>> conversationHistory = new HashMap<>();<br>​<br>public String chat(String message, String userId) {<br>   // 获取用户历史记录<br>   List<Message> history = conversationHistory.getOrDefault(userId, new ArrayList<>());<br>   <br>   // 添加用户新消息<br>   Message userMessage = new Message("user", message);<br>   history.add(userMessage);<br>   <br>   // 构建完整历史上下文<br>   StringBuilder contextBuilder = new StringBuilder();<br>   for (Message msg : history) {<br>       contextBuilder.append(msg.getRole()).append(": ").append(msg.getContent()).append("\n");<br>  }<br>   <br>   // 调用 AI API<br>   String response = callAiApi(contextBuilder.toString());<br>   <br>   // 保存 AI 回复到历史<br>   Message aiMessage = new Message("assistant", response);<br>   history.add(aiMessage);<br>   conversationHistory.put(userId, history);<br>   <br>   return response;<br>}
复制代码
Spring AI 的实现非常优秀,将会话存储和保存机制分离,我们可以自己定义 ChatMemory,将对话历史保存到数据库等持久存储中。
 
4、RAG 检索增强生成

RAG(Retrieval-Augmented Generation)是指利用外部知识来增强 AI 生成结果的技术。通过从知识库检索相关信息并注入到提示词中,让 AI 能够利用这些信息生成更准确的回答。
比如我带大家做了一个 AI 恋爱大师应用,给 AI 准备了一套专注于恋爱问答的知识库文档:
5.png

利用 RAG 技术,AI 就能从我自己定义的知识库中获取到特定领域的、最新的信息,不仅能减少大模型的幻觉(防止瞎编内容),还能趁机推荐一波自己的课程,岂不美哉?
所以 AI 的回复也不能完全相信哦~
6.png

RAG 的完整工作流程包括文档收集和切割、向量转换和存储、文档过滤和检索、查询增强和关联 4 大步骤。
7.png

Spring AI 给 RAG 全流程的实现都提供了支持:
1)文档读取。直接利用 Spring AI 提供的文档加载器,各种类型的文档都能轻松读取:
  1. public List<Document> loadDocuments() {<br>   List<Document> documents = new ArrayList<>();<br>   // 加载 Markdown 文档<br>   Resource resource = resourceLoader.getResource("classpath:documents/knowledge.md");<br>   MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder()<br>          .withHorizontalRuleCreateDocument(true)<br>          .withIncludeCodeBlock(true)<br>          .withAdditionalMetadata("source", "knowledge-base")<br>          .build();<br>   MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config);<br>   documents.addAll(reader.get());<br>   return documents;<br>}
复制代码
2)向量存储。利用 Spring AI 提供的 VectorStore 轻松将文档转换为向量并保存到向量数据库中:
  1. // 创建简单向量存储<br>SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel)<br>      .build();<br>// 加载文档并存储<br>List<Document> documents = documentLoader.loadDocuments();<br>vectorStore.add(documents);
复制代码
3)文档过滤检索 + 查询增强关联。直接使用 QuestionAnswerAdvisor,一行代码就可以让 Spring AI 自动从知识库中检索文档,并将检索到的文档提供给 AI 来增强输出结果。
  1. ChatResponse response = chatClient.prompt()<br>  .user(question)<br>  .advisors(new QuestionAnswerAdvisor(vectorStore))<br>  .call()<br>  .chatResponse();
复制代码
如果不使用 Spring AI,上述过程的实现可就太复杂了,要自己检索文档、构建提示词等等:
  1. // 不使用 Spring AI 的 RAG 实现<br>public String generateAnswerWithKnowledge(String query) {<br>   // 1. 将查询转换为向量<br>   float[] queryVector = embeddingService.embedText(query);<br>   <br>   // 2. 在向量数据库中搜索相似内容<br>   List<Document> relevantDocs = new ArrayList<>();<br>   for (Document doc : vectorDatabase.getAllDocuments()) {<br>       float similarity = calculateCosineSimilarity(queryVector, doc.getVector());<br>       if (similarity > 0.5) {<br>           relevantDocs.add(doc);<br>      }<br>  }<br>   relevantDocs.sort((a, b) -> Float.compare(<br>       calculateCosineSimilarity(queryVector, b.getVector()),<br>       calculateCosineSimilarity(queryVector, a.getVector())<br>  ));<br>   <br>   // 3. 截取前三个最相关文档<br>   relevantDocs = relevantDocs.subList(0, Math.min(3, relevantDocs.size()));<br>   <br>   // 4. 构建提示词,包含检索到的知识<br>   StringBuilder prompt = new StringBuilder();<br>   prompt.append("使用以下信息回答问题:\n\n");<br>   for (Document doc : relevantDocs) {<br>       prompt.append("---\n").append(doc.getContent()).append("\n---\n\n");<br>  }<br>   prompt.append("问题: ").append(query);<br>   <br>   // 5. 调用 AI 生成回答<br>   return aiService.generateResponse(prompt.toString());<br>}
复制代码
除了实现基础的 RAG 能力外,Spring AI 还提供了更多高级能力来优化 RAG 的效果。比如提供了完整的 ETL流程的支持,能够快速抽取文档、切分处理文档、并加载到向量存储中。
8.png

提供了多查询扩展器,可以为原始提示词生成多个查询变体,提高召回文档的几率:
  1. MultiQueryExpander queryExpander = MultiQueryExpander.builder()<br>  .chatClientBuilder(chatClientBuilder)<br>  .numberOfQueries(3)<br>  .build();<br>List<Query> queries = queryExpander.expand(new Query("谁是程序员鱼皮?"));
复制代码
提供了查询重写器,可以把原始提示词变得更精确和专业:
  1. public String doQueryRewrite(String prompt) {<br>   QueryTransformer queryTransformer = RewriteQueryTransformer.builder()<br>          .chatClientBuilder(builder)<br>          .build();<br>   Query query = new Query(prompt);<br>   // 执行查询重写<br>   Query transformedQuery = queryTransformer.transform(query);<br>   // 输出重写后的查询<br>   return transformedQuery.text();<br>}
复制代码
效果如图:
9.png

还支持自定义文档检索器,能够更灵活地定义查询规则,比如按照文档的元信息精确查询、只查询相似度最高的 N 条数据等:
  1. DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()<br>  .vectorStore(vectorStore)<br>  .similarityThreshold(0.73)<br>  .topK(5)<br>  .filterExpression(new FilterExpressionBuilder()<br>      .eq("name", "鱼皮")<br>      .build())<br>  .build();
复制代码
 
5、工具调用

工具调用(Tool Calling)允许 AI 借助外部工具完成自身无法直接完成的任务,比如网络搜索、文件操作、数据查询等。它扩展了 AI 的能力范围,使 AI 能够获取实时信息、执行实际操作。
工具调用实现的本质是拼接提示词,让 AI 选择要调用哪些工具,然后由程序调用工具并将返回结果交给 AI 进行后续输出。
10.png

利用 Spring AI,只需要通过注解就能快速定义工具:
  1. // 使用 Spring AI 定义工具<br>public class WebSearchTool {<br>   @Tool(description = "Search for information from Baidu Search Engine")<br>   public String searchWeb(<br>           @ToolParam(description = "Search query keyword") String query) {<br>       // 网络搜索实现<br>       return "搜索结果: " + query + " 的相关信息...";<br>  }<br>}
复制代码
然后一行代码就能使用工具,Spring AI 会控制程序和大模型进行交互并自动调用工具,非常方便:
  1. ChatResponse response = chatClient<br>  .prompt()<br>  .user(message)<br>  .tools(new WebSearchTool())<br>  .call()<br>  .chatResponse();
复制代码
如果不使用 Spring AI,可就太复杂了!
  1. // 不使用 Spring AI 的工具调用实现<br>public String handleUserRequest(String userMessage) {<br>   // 1. 构建含工具定义的提示词<br>   String toolDefinition = """<br>      {<br>           "tools": [<br>              {<br>                   "name": "searchWeb",<br>                   "description": "Search for information from Baidu Search Engine",<br>                   "parameters": {<br>                       "type": "object",<br>                       "properties": {<br>                           "query": {<br>                               "type": "string",<br>                               "description": "Search query keyword"<br>                          }<br>                      },<br>                       "required": ["query"]<br>                  }<br>              }<br>          ]<br>      }<br>       """;<br>   <br>   // 2. 调用 AI 判断是否需要工具<br>   JsonObject aiResponse = callAiWithTools(userMessage, toolDefinition);<br>   <br>   // 3. 解析 AI 响应判断是否需调用工具<br>   if (aiResponse.has("tool_calls")) {<br>       JsonArray toolCalls = aiResponse.getAsJsonArray("tool_calls");<br>       <br>       // 4. 依次执行每个工具<br>       List<String> toolResults = new ArrayList<>();<br>       for (JsonElement toolCall : toolCalls) {<br>           String toolName = toolCall.getAsJsonObject().get("name").getAsString();<br>           JsonObject args = toolCall.getAsJsonObject().get("arguments").getAsJsonObject();<br>           <br>           // 5. 根据工具名执行对应工具<br>           if ("searchWeb".equals(toolName)) {<br>               String query = args.get("query").getAsString();<br>               String result = searchWeb(query); // 实际执行搜索<br>               toolResults.add(result);<br>          }<br>      }<br>       <br>       // 6. 将工具结果发回给 AI 生成最终回答<br>       return callAiWithToolResults(userMessage, toolCalls, toolResults);<br>  }<br>   <br>   return aiResponse.get("content").getAsString();<br>}
复制代码
此外,Spring AI 提供了工具上下文 ToolContext,可以让程序给工具传递额外参数,实现用户身份认证等功能。还支持直接返回模式(returnDirect),可以绕过大模型直接返回工具结果。
 
6、MCP 模型上下文协议

MCP(Model Context Protocol 模型上下文协议)是一种开放标准,目的是增强 AI 与外部系统的交互能力。MCP 为 AI 提供了与外部工具、资源和服务交互的标准化方式,让 AI 能够访问最新数据、执行复杂操作,并与现有系统集成。
可以将 MCP 想象成 AI 应用的 USB 接口,就像 USB 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方法。从而轻松增强 AI 的能力,有效降低开发者的理解成本,并且打造出 MCP 服务生态。
11.png

利用 Spring AI,我们可以快速接入别人的 MCP 服务,只需要定义 MCP 服务配置,然后直接通过 Bean 注入 MCP 服务提供的工具即可:
  1. // 使用 Spring AI 的 MCP 客户端<br>// 1. 在配置文件中定义 MCP 服务<br>// mcp-servers.json<br>{<br> "mcpServers": {<br>   "amap-maps": {<br>     "command": "npx",<br>     "args": ["-y", "@amap/amap-maps-mcp-server"],<br>     "env": {"AMAP_MAPS_API_KEY": "你的API密钥"}<br>  }<br>}<br>}<br>​<br>// 2. 在应用程序中使用 MCP 服务<br>@Resource<br>private ToolCallbackProvider toolCallbackProvider;<br>​<br>public String doChatWithMcp(String message) {<br>   ChatResponse response = chatClient<br>          .prompt()<br>          .user(message)<br>          .tools(toolCallbackProvider) // MCP 服务提供的所有工具<br>          .call()<br>          .chatResponse();<br>   return response.getResult().getOutput().getText();<br>}
复制代码
当然,开发 MCP 服务也很简单。先利用注解定义工具,然后将工具注册到 MCP 服务中:
  1. // 定义工具<br>public class ImageSearchTool {<br>   @Tool(description = "search image from web")<br>   public String searchImage(@ToolParam(description = "Search query keyword") String query) {<br>       // 搜索图片,返回结果<br>       return "https://www.codefather.cn";<br>  }<br>}<br>​<br>// 注册 MCP 服务<br>@Bean<br>public ToolCallbackProvider imageSearchTools() {<br>   return MethodToolCallbackProvider.builder()<br>          .toolObjects(new ImageSearchTool())<br>          .build();<br>}
复制代码
如果不使用 Spring AI,你就需要引入 MCP 官方的 SDK 进行开发,或者自主实现,太麻烦了!
  1. // 不使用 Spring AI 的 MCP 实现<br>public String chatWithExternalTools(String userMessage) {<br>   // 1. 启动外部 MCP 服务进程<br>   Process mcpProcess = startMcpProcess("npx", "-y", "@amap/amap-maps-mcp-server");<br>   <br>   // 2. 建立与 MCP 服务的通信通道<br>   InputStream inputStream = mcpProcess.getInputStream();<br>   OutputStream outputStream = mcpProcess.getOutputStream();<br>   <br>   // 3. 发送初始化握手消息<br>   JsonObject initMessage = new JsonObject();<br>   initMessage.addProperty("jsonrpc", "2.0");<br>   initMessage.addProperty("method", "initialize");<br>   // ... 添加更多初始化参数<br>   sendMessage(outputStream, initMessage);<br>   <br>   // 4. 接收并解析服务提供的工具定义<br>   JsonObject response = readResponse(inputStream);<br>   JsonArray toolDefinitions = extractToolDefinitions(response);<br>   <br>   // 5. 调用 AI 模型,将工具定义传递给模型<br>   JsonObject aiResponse = callAiWithTools(userMessage, toolDefinitions);<br>   <br>   // 6. 解析 AI 响应,如果需要调用工具则发送给 MCP 服务<br>   if (aiResponse.has("tool_calls")) {<br>       JsonArray toolCalls = aiResponse.getAsJsonArray("tool_calls");<br>       List<String> toolResults = new ArrayList<>();<br>       <br>       for (JsonElement toolCall : toolCalls) {<br>           // 7. 将工具调用请求发送给 MCP 服务<br>           JsonObject toolRequest = new JsonObject();<br>           toolRequest.addProperty("jsonrpc", "2.0");<br>           toolRequest.addProperty("method", "executeFunction");<br>           // ... 添加工具调用参数<br>           sendMessage(outputStream, toolRequest);<br>           <br>           // 8. 接收 MCP 服务的执行结果<br>           JsonObject toolResponse = readResponse(inputStream);<br>           toolResults.add(toolResponse.toString());<br>      }<br>       <br>       // 9. 将工具结果发回给 AI 生成最终回答<br>       return callAiWithToolResults(userMessage, toolCalls, toolResults);<br>  }<br>   <br>   // 10. 最后关闭 MCP 服务<br>   mcpProcess.destroy();<br>   <br>   return aiResponse.get("content").getAsString();<br>}
复制代码
 
结尾

以上就是 Spring AI 的核心特性解析,相信大家也感受到使用 Spring AI 开发 AI 应用有多爽了吧!
除了前面提到的之外,Spring AI 还提供了大模型评估测试能力,比如评估 AI 回答与用户输入和上下文的相关性;还提供了全面的可观测性功能,帮助开发者监控 AI 应用的运行状态。
不过目前这些特性还不够成熟,Spring AI 也还有很长一段路要走,后续应该也会推出智能体工作流编排框架吧~
就先分享到这里,我全程直播带大家做的 AI 超级智能体新项目今天就完结了,教程中给大家讲解了 Spring AI 几乎所有的特性和高级用法,甚至带大家阅读开源 Manus 项目的源码并且实现了拥有自主规划能力的 AI 智能体,欢迎大家来 编程导航 学习。
12.png

在我们的 程序员面试刷题神器 - 面试鸭 中也新出了 AI 大模型相关的面试题,每道题目都能让你学到很多知识~
13.png

还有 鱼皮开源的 AI 知识库,里面有很多值得学习的 AI 干货,持续更新~
获取知识库:https://github.com/liyupi/ai-guide
14.png

我们下期见咯!
 
更多编程学习资源


  • Java前端程序员必做项目实战教程+毕设网站
  • 程序员免费编程学习交流社区(自学必备)
  • 程序员保姆级求职写简历指南(找工作必备)
  • 程序员免费面试刷题网站工具(找工作必备)
  • 最新Java零基础入门学习路线 + Java教程
  • 最新Python零基础入门学习路线 + Python教程
  • 最新前端零基础入门学习路线 + 前端教程
  • 最新数据结构和算法零基础入门学习路线 + 算法教程
  • 最新C++零基础入门学习路线、C++教程
  • 最新数据库零基础入门学习路线 + 数据库教程
  • 最新Redis零基础入门学习路线 + Redis教程
  • 最新计算机基础入门学习路线 + 计算机基础教程
  • 最新小程序入门学习路线 + 小程序开发教程
  • 最新SQL零基础入门学习路线 + SQL教程
  • 最新Linux零基础入门学习路线 + Linux教程
  • 最新Git/GitHub零基础入门学习路线 + Git教程
  • 最新操作系统零基础入门学习路线 + 操作系统教程
  • 最新计算机网络零基础入门学习路线 + 计算机网络教程
  • 最新设计模式零基础入门学习路线 + 设计模式教程
  • 最新软件工程零基础入门学习路线 + 软件工程教程

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册