缠丝猫 发表于 5 天前

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

炸裂,炸裂,炸裂!从第一次提交代码到如今,颠末 2 年的沉淀,Spring AI 框架的第一个正式版本 1.0 终于发布了。
https://pic.yupi.icu/1/1747881171718-91ac3eb5-049b-4510-8012-6736c40c9c95.png
有了这玩意,开辟 AI 应用就是洒洒水的事,Java 开辟者们是不是又爽了,反正我是很兴奋啊,让 Java 再次伟大!
https://pic.yupi.icu/1/1747881641460-856dbbed-0d9d-480c-ad16-8e8dfcccbeb5.png
但大概许多同砚还不知道 Spring AI 能干什么,凭什么这玩意就让 Java 伟大了?
恰好我最近刚带编程导航的同砚做完一套 AI 超级智能体实战项目,绝不夸张地说,我已经把 Spring AI 玩得 “手拿把掐” 了。
https://pic.yupi.icu/1/1747881819511-84f8a2c7-994a-4c1f-b785-584cf3572732.png
下面我来给大家快速分享一下 Spring AI 的焦点本领和魔法。看完之后,我相信你会点赞收藏三连,并且说一句:“伟的太大了”。
 
Spring AI 焦点特性

1、大模型调用本领

大模型调用本领是 AI 应用开辟的基础,答应应用步伐与各种 AI 大模型进行交互,发送提示词并获取模型的响应。Spring AI 提供了统一的接口来支持各种主流大模型,包括 OpenAI GPT 系列、Claude、通义千问等。
https://pic.yupi.icu/1/1747881987603-4021fe3f-ee20-4330-8586-32e46beba8c8.png
Spring AI 通过配置 + 抽象接口简化了大模型的调用过程,我可以直接在配置中声明多个大模型:
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 机动地调用各种差别的大模型:
// 使用 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 流式响应,实现打字机效果:
chatClient<br>  .prompt(message)<br>  .stream()如果不使用 Spring AI,则需要为每个模型分别实现 API 调用,要本身编写请求、解析响应,很麻烦!
// 不使用 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 几行代码就能实现:
// 调用多模态模型<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,多模态处理将变得复杂得多:
// 不使用 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 前后记录日记:
// 使用 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 类可以统一封装多种差别类型的提示词,便于发送给大模型:
// 用户提示词<br>Message userMessage = new UserMessage(userText);<br>// 系统提示词<br>Message systemMessage = new SystemMessage(systemText);<br>Prompt prompt = new Prompt(List.of(userMessage, systemMessage));利用 PromptTemplate 可以创建支持替换变量的提示词模板,便于提示词的维护和复用:
// 使用 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,你就需要手动 / 或者利用工具类来拼接提示词字符串,会更麻烦:
// 不使用 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 机制,一行代码就能轻松开启对话记忆:
// 使用 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 实现隔离、设置上下文大小限制等参数:
// 使用 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,需要手动管理对话历史,代码量一下子就上来了:
// 不使用 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 预备了一套专注于爱情问答的知识库文档:
https://pic.yupi.icu/1/1747884552579-4d8d5873-cbac-4e30-85b4-dc12bd8edbdd.png
利用 RAG 技术,AI 就能从我本身界说的知识库中获取到特定范畴的、最新的信息,不仅能减少大模型的幻觉(防止瞎编内容),还能趁机推荐一波本身的课程,岂不美哉?
以是 AI 的回复也不能完全相信哦~
https://pic.yupi.icu/1/1747885198412-cf86e734-d482-490a-925b-896401ce0a3a.png
RAG 的完整工作流程包括文档收集和切割、向量转换和存储、文档过滤和检索、查询加强和关联 4 大步调。
https://pic.yupi.icu/1/1747884491944-04de44f3-e024-434a-b79b-de61c8e603cd.png
Spring AI 给 RAG 全流程的实现都提供了支持:
1)文档读取。直接利用 Spring AI 提供的文档加载器,各种类型的文档都能轻松读取:
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 轻松将文档转换为向量并保存到向量数据库中:
// 创建简单向量存储<br>SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel)<br>      .build();<br>// 加载文档并存储<br>List<Document> documents = documentLoader.loadDocuments();<br>vectorStore.add(documents);3)文档过滤检索 + 查询加强关联。直接使用 QuestionAnswerAdvisor,一行代码就可以让 Spring AI 自动从知识库中检索文档,并将检索到的文档提供给 AI 来加强输出效果。
ChatResponse response = chatClient.prompt()<br>  .user(question)<br>  .advisors(new QuestionAnswerAdvisor(vectorStore))<br>  .call()<br>  .chatResponse();如果不使用 Spring AI,上述过程的实现可就太复杂了,要本身检索文档、构建提示词等等:
// 不使用 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流程的支持,能够快速抽取文档、切分处理文档、并加载到向量存储中。
https://pic.yupi.icu/1/1747886114680-591a26a3-6674-475b-9eab-e62c52b04b7c.png
提供了多查询扩展器,可以为原始提示词天生多个查询变体,进步召回文档的几率:
MultiQueryExpander queryExpander = MultiQueryExpander.builder()<br>  .chatClientBuilder(chatClientBuilder)<br>  .numberOfQueries(3)<br>  .build();<br>List<Query> queries = queryExpander.expand(new Query("谁是程序员鱼皮?"));提供了查询重写器,可以把原始提示词变得更精确和专业:
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>}效果如图:
https://pic.yupi.icu/1/1747886020980-0b6e4da9-f59d-4bf5-aabd-fb03d3a3e795.png
还支持自界说文档检索器,能够更机动地界说查询规则,比如按照文档的元信息精确查询、只查询相似度最高的 N 条数据等:
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 进行后续输出。
https://pic.yupi.icu/1/1747893550889-cf67c903-5461-43bb-bdf1-d3a497f3e36f.png
利用 Spring AI,只需要通过注解就能快速界说工具:
// 使用 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 会控制步伐和大模型进行交互并自动调用工具,非常方便:
ChatResponse response = chatClient<br>  .prompt()<br>  .user(message)<br>  .tools(new WebSearchTool())<br>  .call()<br>  .chatResponse();如果不使用 Spring AI,可就太复杂了!
// 不使用 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 服务生态。
https://pic.yupi.icu/1/1747893881601-d78714c3-812d-4945-8b3f-c5be3b2b0d46.png
利用 Spring AI,我们可以快速接入别人的 MCP 服务,只需要界说 MCP 服务配置,然后直接通过 Bean 注入 MCP 服务提供的工具即可:
// 使用 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 服务中:
// 定义工具<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 进行开辟,或者自主实现,太麻烦了!
// 不使用 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 智能体,欢迎大家来 编程导航 学习。
https://pic.yupi.icu/1/1747894887694-cd5e7c53-f777-49ad-ae5a-89252a1ac10d.png
在我们的 步伐员面试刷题神器 - 面试鸭 中也新出了 AI 大模型相关的面试题,每道题目都能让你学到许多知识~
https://pic.yupi.icu/1/1747894904199-e795908c-638e-4d29-afd5-c8127db010f3.png
还有 鱼皮开源的 AI 知识库,内里有许多值得学习的 AI 干货,持续更新~
获取知识库:https://github.com/liyupi/ai-guide
https://pic.yupi.icu/1/1747796993472-c3d3dd64-2ccd-407e-b427-0a7992fec7d0.png
我们下期见咯!
 
更多编程学习资源


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 炸裂!Spring AI 1.0 正式发布,让 Java 再次伟大!