Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7)

Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7),下个月就是 RC1,紧接着就是 GA!,对于我们 Java 开发者来说,这绝对是个值得关注的好消息!

但是对于 Java 学习者来说,内心难免吐槽一句:又有新东西要学啦!

像我最近在写 AI 相关的项目教程,基于的是 M6 版本,结果突然就来 M7 了,当时还不知道有没有什么破坏性变更,让我不由得心头一紧 “刚写完的教程又得更新了?”

考虑到很多读者还不知道 Spring AI 是什么,这里先简单介绍一下。

Spring AI 介绍

简单来说,Spring AI 就是 Spring 家族为我们 Java 开发者量身打造的、用来简化 AI 应用开发的框架。

Spring AI 提供了构建常见 AI 应用的能力,例如:基于文档的问答、与文档交互的聊天。它的目标就是将数据和 API 无缝连接到 AI 模型中。

这是 Spring AI 官方对其的描述:

The Spring AI project aims to streamline the development of applications that incorporate artificial intelligence functionality without unnecessary complexity.

Spring AI 项目旨在简化集成人工智能功能的应用程序开发,避免不必要的复杂性。

Spring AI 核心想解决这几个问题:

  1. 提供抽象,屏蔽底层差异: 不管你用的是 OpenAI 的 GPT,还是谷歌的 Gemini,或者是 Anthropic 的 Claude,甚至是 Hugging Face 上的开源模型,Spring AI 都想提供一套统一的、可移植的 API 让你去调用。同样,对于向量数据库(像 Milvus、Pinecone、Redis、PGVector 等),它也提供了统一的 API 和查询方式。这意味着你的代码可以更容易地在不同的 AI 服务和数据库之间切换,不用被某个厂商锁死。

  2. 简化 AI 应用开发: 构建一个稍微复杂点的 AI 应用,比如 RAG(检索增强生成),涉及到数据加载、切分、向量化、存储、检索、调用 LLM 等一系列步骤。Spring AI 提供了像 ETL 框架、ChatClient、VectorStore 等组件和抽象,大大简化了这些流程的实现。

  3. 模型与向量数据库支持广泛: 它对接了市面上几乎所有主流的大模型提供商(聊天、文生图模型都支持)和向量数据库。选择非常丰富。

  4. 深度集成 Spring 生态: 这可是 Spring 的看家本领!提供了各种 Spring Boot Starter,让 AI 模型、向量数据库的配置和集成变得超级简单,遵循“约定大于配置”的原则,开箱即用。

项目地址:https://github.com/spring-projects/spring-ai/tags 

Spring AI 1.0.0 M7 改进

Spring AI 1.0.0 M7 号称是最后一个里程碑版本,值得关注一波,下个月就是 RC1,紧接着就是 GA!

这意味着框架的结构和核心 API 趋于稳定了。不过,也正因为如此,M7 带来了一些重要的(破坏性的)变更,主要是为了让整个框架结构更合理、更模块化。大家升级的时候需要注意一下!

下面我会对这个版本的改动做详细的解读,官方解读在这里:https://spring.io/blog/2025/04/10/spring-ai-1-0-0-m7-released 。

1、包名和类路径大调整 (Breaking Change):

  • Starter 的 Artifact ID 变了! 命名规则更加规范了,比如模型相关的 Starter 从 spring-ai-{model}-spring-boot-starter 变成了 spring-ai-starter-model-{model},向量数据库的也类似。升级时 pom.xml 或 build.gradle 文件里的依赖需要修改。

  • 一些类的包路径也挪了地方,比如 Content、Media 相关类挪到了 org.springframework.ai.content 包下。不过别担心,这些重构你的 IDE(比如 IDEA)应该能自动帮你搞定。

2、核心架构大升级:从“大一统”到“模块化” (Core Architecture Improvements):

这是 M7 最核心的变化!之前的 spring-ai-core 被拆分成了多个更专注的领域模块,比如:

    • spring-ai-commons: 最基础的,包含文档(Document)、文本分割器(TextSplitter)等核心模型和工具,不依赖其他 Spring AI 模块。

    • spring-ai-model: 负责 AI 能力的抽象,像 ChatModelEmbeddingModelImageModel 这些接口都在这。

    • spring-ai-vector-store: 统一的向量数据库抽象层。

    • spring-ai-client-chat: 更高层的对话式 AI API,像 ChatClient、对话记忆 (ChatMemory) 都在这里。

    • spring-ai-rag: 专门为 RAG 设计的框架。

    • spring-ai-model-chat-memory-*:持久化实现,Cassandra、Neo4j 和 JDBC 实现。

    • ......

  • 好处是啥?

    • 按需引入,应用更轻量: 你只需要引入你真正用到的模块,应用的依赖更少,部署包更小。

    • 减少依赖冲突: 模块化后,传递性依赖更少,跟其他第三方库冲突的概率也小了。

    • 关注点分离更清晰: 每个模块职责更明确。

  • 升级影响: 如果你之前用的是 Spring AI 的 Starter,那这个变化对你来说应该是透明的,因为 Starter 会自动帮你引入新的模块化依赖。但如果你是直接依赖旧的 spring-ai-core,那这次升级就需要手动调整依赖了。

  • 自动配置也模块化了: 配合核心架构的调整,自动配置类也拆分到各个模块对应的 autoconfigure 包里了,同样是为了减少不必要的依赖。

Spring AI 依赖项

Spring AI 依赖项

3、升级到 MCP 0.9.0 (Breaking Change):

  • Spring AI 集成了最新的 Multimodal Client Protocol (MCP) 参考实现 0.9.0 版本。MCP 是 Spring AI 用于处理多模态交互(比如文本+图像)的一种协议。新版本带来了基于 Session 和 Exchange 的架构改进,更健壮、更符合规范。

  • 如果你用到了 MCP 相关的功能,升级时需要参考官方 MCP 升级说明进行代码调整,地址:https://docs.spring.io/spring-ai/reference/upgrade-notes.html#upgrading-to-1-0-0-m7 。

4、模型集成更新与增强 (New and Enhanced Model Integrations):

  • Anthropic Claude: 支持了最新的 Claude 3.7 Sonnet 模型并设为默认,增加了 "thinking" 能力,API 命名向 "tool" 靠拢。

  • Mistral AI: 增加了内容审核模型、自定义 JSON 输出能力。

  • Ollama: 增加了更多模型参数和对新模型的支持(如 LLAMA3_2_3B)。

  • Azure OpenAI / OpenAI: 也有一些选项增强和问题修复。

5、重量级新特性:支持 Docker Desktop 的 Model Runner!

  • Docker Desktop 4.40 版本引入了 Model Runner 功能,可以在本地运行 AI 模型,并提供了一个与 OpenAI API 兼容的本地接口。

  • Spring AI M7 现在原生支持了这个功能!这意味着:

    • 你可以在本地(比如 M 系列芯片的 Mac)直接运行像 Gemma 这样的模型,而不需要把数据发送到云端。

    • 配置非常简单,只需要在 Spring AI 的 OpenAI 配置里把 base-url 指向本地 Model Runner 的地址(如 http://localhost:12434/engines)就行了,API Key 都可以忽略。

    • 所有 Spring AI 的功能(函数调用、流式输出等)都能无缝对接本地模型。

  • 这对于本地开发、调试、或者注重数据隐私的场景来说,简直是太方便了!

6、工具调用 (Tool/Function Calling) 和多模态能力增强:

  • 工具执行框架有改进,比如增加了 ToolExecutionEligibilityPredicate 接口。

  • 多模态方面,增强了对 Base64 编码图像的处理能力。

7、文档处理、记忆存储、向量数据库增强:

  • 增加了 JSoup HTML 文档读取器。

  • 新增了基于 JDBC 和 Neo4j 的 ChatMemory 实现。

  • 新增了 Couchbase 向量数据库支持,并对 Milvus、PgVector 等现有向量库做了增强。

8、开发者体验提升:

  • 改进了 Spring Boot 自动配置模式。

  • 增强了 AOT 和 Native Image 的支持。

  • 官方文档也做了更新,增加了 M7 的升级指南和模块架构图。

<think>好的,用户之前的问题是关于在使用Spring AI时,当添加了tools之后,流式输出无法正常工作。之前的回答中,我给出了两种解决方案:一种是禁用工具调用,另一种是正确处理工具调用并继续流式传输。现在用户的新问题是,如果这个问题是由于与spring-ai-ollama-spring-boot-starter 1.0.0-spring-boot-starter的1.0.0-M6版本,这是一个Milestone版本,可能存在一些尚未修复的问题。需要考虑到Ollama与Spring AI的集成可能存在兼容性问题,尤其是在处理工具调用和流式输出时。 接下来,用户的问题可能涉及几个方面:Ollama本身是否支持工具调用,Spring AI的Ollama starter在该版本中是否正确处理了工具调用和流式响应的交互,或者是否存在配置上的问题。 首先,我需要回忆一下Ollama的特性。Ollama主要用于本地运行大型语言模型,比如Llama 2等。这些模型可能不像OpenAI的模型那样支持函数调用或工具调用。因此,当用户尝试在Ollama模型中使用tools参数时,模型可能无法正确响应,导致流式输出中断。 接下来,检查Spring AI的文档,特别是关于Ollama集成的部分,看看是否支持工具调用。在Milestone版本中,可能某些功能尚未完全实现或存在已知问题。例如,可能在Ollama的配置中,工具调用没有被正确处理,导致流式传输中断。 可能的解决步骤包括: 1. **确认Ollama模型是否支持工具调用**:需要检查Ollama的文档或社区讨论,确认所使用的模型(如Llama2)是否支持函数调用功能。如果模型本身不支持,那么添加tools参数会导致问题,流式输出无法继续。 2. **检查Spring AI Ollama Starter的版本兼容性**:Milestone版本可能不稳定,查看是否有更新的版本或快照版本修复了该问题。如果问题在后续版本中已修复,建议用户升级。 3. **配置参数调整**:可能需要在advisors中设置特定参数,比如禁用工具调用(类似之前提到的tool_choice参数),但由于Ollama可能不支持这些参数,可能需要其他方式。 4. **处理工具调用的响应**:如果Ollama不支持工具调用,但代码中仍然添加了tools,可能会导致异常或中断。需要移除不必要的tools,或者确保在Ollama环境下不启用工具调用。 5. **日志和错误分析**:建议用户启用详细日志,查看在流式传输过程中是否有异常抛出,或者Ollama返回的响应结构是否符合Spring AI的预期,特别是在涉及工具调用时。 6. **替代方案**:如果必须使用工具调用,可能需要切换回支持的工具调用模型,如OpenAI,或者在Ollama中使用自定义的提示工程来模拟工具调用,而不依赖Spring AI的tools参数。 在思考过程中,还需要考虑到用户可能对Spring AI和Ollama的集成不够熟悉,或者对工具调用的工作机制存在误解。因此,回答中需要明确说明Ollama的可能限制,并提供逐步的排查步骤和替代解决方案。 总结可能的解决方案: - 确认Ollama模型是否支持工具调用,如不支持,则避免使用tools参数。 - 升级到更高版本Spring AI Ollama Starter,如果问题已修复。 - 调整配置,禁用工具调用相关设置。 - 修改代码,移除不必要的tools配置。 - 使用其他支持工具调用的模型,如OpenAI。 此外,还需要指导用户如何检查日志,确认是否有错误信息,以及如何测试在没有tools的情况下流式传输是否正常,以进一步隔离问题。</think>--- 在 **Spring AI 1.0.0-M6** 中结合 `spring-ai-ollama-spring-boot-starter` 使用工具(`tools`)时,若流式输出(`stream()`)中断,可能是由于以下原因及解决方案: --- ### **问题原因** 1. **Ollama 模型限制** 当前 Ollama 的多数模型(如 Llama2)**不支持原生工具调用(Function Calling)**,添加 `tools()` 会导致模型无法正确处理请求。 2. **Spring AI 兼容性问题** `spring-ai-ollama-spring-boot-starter` 的早期版本(如 1.0.0-M6)可能未完全适配工具调用与流式输出的交互逻辑。 --- ### **解决方案** #### 方法 1:禁用工具调用(推荐) 如果不需要工具调用,直接移除 `tools()` 配置,强制模型生成文本流: ```java Flux<String> content = chatClient.prompt() .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) .user(message) .stream(); // 移除 .tools(new DateTimeTools()) ``` --- #### 方法 2:升级 Spring AI 版本 1. **尝试最新版本** Spring AI 更新较快,1.0.0-M6 可能存在已知问题,建议升级到最新里程碑版本或快照(如 `1.0.0-M7` 或更高): ```xml <!-- pom.xml --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <version>1.0.0-M7</version> <!-- 或最新版本 --> </dependency> ``` 2. **检查版本兼容性** 确保 Ollama 服务版本Spring AI 兼容(例如 Ollama `0.1.23+`)。 --- #### 方法 3:自定义工具调用处理 若必须使用工具,需手动处理工具调用逻辑(Ollama 可能返回原始 JSON 请求): ```java Flux<String> flux = chatClient.prompt() .user(message) .tools(new DateTimeTools()) .stream() .flatMap(response -> { // 1. 检查是否为工具调用请求 if (response.getMetadata().containsKey("tool_call")) { String toolCallJson = response.getMetadata().get("tool_call").toString(); // 2. 解析 JSON 并执行工具 ToolResult result = executeTool(toolCallJson); // 3. 将结果追加到对话中,重新生成流 return chatClient.prompt() .user(new UserMessage("Tool Result: " + result)) .stream(); } else { return Flux.just(response.getContent()); } }); ``` --- #### 方法 4:配置 Ollama 模型参数 在 `application.yml` 中明确配置 Ollama 模型参数,避免模型误解析工具请求: ```yaml spring: ai: ollama: base-url: http://localhost:11434 chat: model: llama2 # 确保模型支持工具调用(如 mistral 部分版本) options: temperature: 0.7 num_ctx: 4096 ``` --- ### **关键排查步骤** 1. **确认模型支持性** 检查 Ollama 模型是否支持工具调用(如 `mistral` 较新版可能支持,而 `llama2` 不支持)。 2. **查看日志** 启用 DEBUG 日志,观察 Ollama 返回的原始响应: ```yaml logging: level: org.springframework.ai: DEBUG ``` 3. **简化测试** 移除 `tools()` 后验证流式输出是否正常,确认问题是否由工具调用引起。 --- ### **替代方案** 如果必须使用工具调用,建议切换至支持该功能的模型服务(如 **OpenAI** 或 **Anthropic**): ```java // 切换为 OpenAI @Autowired OpenAiChatClient openAiChatClient; Flux<String> flux = openAiChatClient.prompt() .user(message) .tools(new DateTimeTools()) .stream(); ``` --- ### **总结** - **Ollama 模型限制** 是核心问题,多数模型暂不支持工具调用。 - 若需流式输出,优先移除 `tools()` 或升级 Spring AI/Ollama 版本- 如需完整工具调用流程,建议使用 OpenAI 等支持 Function Calling 的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东锋17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值