升级说明
升级到 1.0.0-SNAPSHOT
添加 Snapshot 存储库
要使用 1.0.0-SNAPSHOT 版本,您需要将快照存储库添加到构建文件中。 有关详细说明,请参阅入门指南中的快照版本 - 添加快照存储库部分。
更新依赖项管理
将 Spring AI BOM 版本更新为1.0.0-SNAPSHOT在您的 build 配置中。
有关配置依赖项管理的详细说明,请参阅 Getting Started guide 中的 Dependency Management 部分。
升级到 1.0.0-RC1
您可以使用 OpenRewrite 配方自动执行升级到 1.0.0-RC1 的过程。 此配方有助于为此版本应用许多必要的代码更改。 在 Arconia Spring AI Migrations 中查找配方和使用说明。
重大更改
聊天客户端和顾问
影响最终用户代码的主要更改包括:
*在VectorStoreChatMemoryAdvisor:常数CHAT_MEMORY_RETRIEVE_SIZE_KEY已重命名为TOP_K.常数DEFAULT_CHAT_MEMORY_RESPONSE_SIZE(值:100) 已重命名为DEFAULT_TOP_K替换为新的默认值 20。
-
常数
CHAT_MEMORY_CONVERSATION_ID_KEY已重命名为CONVERSATION_ID并从AbstractChatMemoryAdvisor到ChatMemory接口。更新您的导入以使用org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID.
其他更改包括:
-
在
SimpleLoggerAdvisor这requestToStringinput 参数需要更新才能使用ChatClientRequest.这是一个突破性的变化,因为替代方案还不是 M8 的一部分。构造函数也是如此。 -
AbstractChatMemoryAdvisor已替换为BaseChatMemoryAdvisor界面中的api包。对于任何直接扩展的代码来说,这都是一个重大更改AbstractChatMemoryAdvisor. -
Public constructors 中的
MessageChatMemoryAdvisor,PromptChatMemoryAdvisor和VectorStoreChatMemoryAdvisor已设为私有。现在,您必须使用 builder 模式来创建实例(例如MessageChatMemoryAdvisor.builder(chatMemory).build()). -
在
VectorStoreChatMemoryAdvisor:-
构建器方法
chatMemoryRetrieveSize(int)已重命名为defaultTopK(int).更新您的代码以使用新的方法名称:VectorStoreChatMemoryAdvisor.builder(vectorStore).defaultTopK(1).build(). -
这
systemTextAdvise(String)builder 方法。使用systemPromptTemplate(PromptTemplate)方法。
-
-
在
PromptChatMemoryAdvisor这systemTextAdvise(String)builder 方法。使用systemPromptTemplate(PromptTemplate)方法。 -
在
MessageChatMemoryAdvisor,PromptChatMemoryAdvisor和VectorStoreChatMemoryAdvisor这protectFromBlocking(boolean)方法已删除。使用scheduler()方法。默认情况下,advisor 会防止阻塞,因此除非您想禁用保护或自定义 Reactor Scheduler,否则您无需设置此方法。
Advisor 中的自包含模板
执行提示增强的内置 advisor 已更新为使用自包含模板。目标是让每个 advisor 都能够执行模板作,而不会影响其他 advisor 的模板和提示决策,也不受其影响。
如果您为以下顾问提供自定义模板,则需要更新它们以确保包含所有预期的占位符。
-
这
QuestionAnswerAdvisor需要具有以下占位符的模板(请参阅更多详细信息):-
一个
queryplaceholder 接收用户问题。 -
一个
question_answer_contextplaceholder 接收检索到的上下文。
-
-
这
PromptChatMemoryAdvisor需要具有以下占位符的模板(请参阅更多详细信息):-
一
instructionsplaceholder 接收原始系统消息。 -
一个
memoryplaceholder 接收检索到的对话内存。
-
-
这
VectorStoreChatMemoryAdvisor需要具有以下占位符的模板(请参阅更多详细信息):-
一
instructionsplaceholder 接收原始系统消息。 -
一个
long_term_memoryplaceholder 接收检索到的对话内存。
-
聊天内存存储库模块和自动配置重命名
在 1.0.0-RC1 中,Cassandra、JDBC 和 Neo4j 的聊天内存模块、Starters和自动配置类已重命名为包含repository后缀以清楚起见。这会影响工件 ID、Java 软件包名称和类名称。例如:
-
工件 ID:
-
spring-ai-model-chat-memory-jdbc→spring-ai-model-chat-memory-repository-jdbc -
spring-ai-autoconfigure-model-chat-memory-jdbc→spring-ai-autoconfigure-model-chat-memory-repository-jdbc -
spring-ai-starter-model-chat-memory-jdbc→spring-ai-starter-model-chat-memory-repository-jdbc -
spring-ai-model-chat-memory-cassandra→spring-ai-model-chat-memory-repository-cassandra -
spring-ai-autoconfigure-model-chat-memory-cassandra→spring-ai-autoconfigure-model-chat-memory-repository-cassandra -
spring-ai-starter-model-chat-memory-cassandra→spring-ai-starter-model-chat-memory-repository-cassandra -
spring-ai-model-chat-memory-neo4j→spring-ai-model-chat-memory-repository-neo4j -
spring-ai-autoconfigure-model-chat-memory-neo4j→spring-ai-autoconfigure-model-chat-memory-repository-neo4j -
spring-ai-starter-model-chat-memory-neo4j→spring-ai-starter-model-chat-memory-repository-neo4j -
Java 包现在使用
.repository.(例如,org.springframework.ai.chat.memory.repository.jdbc.JdbcChatMemoryRepository和org.springframework.ai.model.chat.memory.repository.jdbc.autoconfigure.JdbcChatMemoryRepositoryAutoConfiguration). -
主要的自动配置类现在已命名为
JdbcChatMemoryRepositoryAutoConfiguration,CassandraChatMemoryRepositoryAutoConfiguration等。 -
属性也已重命名以反映新的命名约定,从
spring.ai.chat.memory.<storage>…自spring.ai.chat.memory.repository.<storage>….
需要迁移:- 更新您的 Maven/Gradle 依赖项以使用新的工件 ID。 - 更新使用旧软件包或类名称的任何导入、类引用或配置。
消息聚合器
-
MessageAggregator具有一种新方法,用于聚合来自ChatClientRequest.前面的方法聚合来自旧AdvisedRequest已被删除,因为它已在 M8 中标记为已弃用。
MessageAggregator 重构
变化
-
MessageAggregatorclass 已从org.springframework.ai.chat.model包中的spring-ai-client-chatmodule 添加到spring-ai-modelmodule (相同的包名称) -
这
aggregateChatClientResponse方法已从MessageAggregator并移至新类ChatClientMessageAggregator在org.springframework.ai.chat.client包
迁移指南
如果您直接使用aggregateChatClientResponsemethod 从MessageAggregator,您需要使用新的ChatClientMessageAggregatorclass 替换为:
// Before
new MessageAggregator().aggregateChatClientResponse(chatClientResponses, aggregationHandler);
// After
new ChatClientMessageAggregator().aggregateChatClientResponse(chatClientResponses, aggregationHandler);
不要忘记添加适当的导入:
import org.springframework.ai.chat.client.ChatClientMessageAggregator;
升级到 1.0.0-M8
您可以使用 OpenRewrite 配方自动执行到 1.0.0-M8 的升级过程。 此配方有助于为此版本应用许多必要的代码更改。 在 Arconia Spring AI Migrations 中查找配方和使用说明。
重大更改
从 Spring AI 1.0 M7 升级到 1.0 M8 时,以前注册工具回调的用户会遇到重大更改,这些更改会导致工具调用功能以静默方式失败。这特别影响使用已弃用的tools()方法。
例
下面是一个在 M7 中工作但在 M8 中不再按预期运行的代码示例:
// Old code in M7 - no longer works correctly in M8
chatClient.prompt("What day is tomorrow?")
.tools(toolCallback)
.call()
.content();
如何调整代码
要在升级到 M8 时解决此问题,您需要更新代码以使用新的toolCallbacks()方法:
// Updated code for M8
chatClient.prompt("What day is tomorrow?")
.toolCallbacks(toolCallback)
.call()
.content();
从 M7 到 M8 的方法映射
以下是旧方法与新方法的映射方式:
-
tools(String… toolNames)→toolNames(String… toolNames)-
在引用在其他位置注册的工具时使用(例如,通过
@Bean跟@Description)
-
-
tools(ToolCallback… toolCallbacks)→toolCallbacks(ToolCallback… toolCallbacks)-
用于内联工具回调注册
-
-
tools(List<ToolCallback> toolCallbacks)→toolCallbacks(List<ToolCallback> toolCallbacks)-
当您拥有一组工具回调时使用
-
-
tools(ToolCallbackProvider… toolCallbackProviders)→toolCallbacks(ToolCallbackProvider… toolCallbackProviders)-
用于实现
ToolCallbackProvider接口
-
-
tools(Object… toolObjects)保持不变-
仅用于方法注释有
@Tool
-
改进的错误处理
在现已合并的此 PR (spring-projects/spring-ai#2964) 中,tools(Object… toolObjects)方法现在会在 No@Tool方法在提供的对象上找到,而不是静默失败。这有助于开发人员立即识别迁移问题。
聊天客户端
-
这
ChatClient已得到增强,可以解决在 advisor 中使用用户和系统提示之前未呈现时的一些不一致或不需要的行为。新行为可确保在执行 advisor 链之前始终呈现用户和系统提示。作为此增强功能的一部分,AdvisedRequest和AdvisedResponseAPI 已被弃用,取而代之的是ChatClientRequest和ChatClientResponse.顾问现在在完全构建的Prompt对象包含在ChatClientRequest而不是AdvisedRequest,保证一致性和完整性。
例如,如果您有一个自定义顾问程序,该顾问程序修改了before方法,您可以按如下方式对其进行重构:
// --- Before (using AdvisedRequest) ---
@Override
public AdvisedRequest before(AdvisedRequest advisedRequest) {
// Access original user text and parameters directly from AdvisedRequest
String originalUserText = new PromptTemplate(advisedRequest.userText(), advisedRequest.userParams()).render();
// ... retrieve documents, create augmented prompt text ...
List<Document> retrievedDocuments = ...;
String augmentedPromptText = ...; // create augmented text from originalUserText and retrievedDocuments
// Copy existing context and add advisor-specific data
Map<String, Object> context = new HashMap<>(advisedRequest.adviseContext());
context.put("retrievedDocuments", retrievedDocuments); // Example key
// Use the AdvisedRequest builder pattern to return the modified request
return AdvisedRequest.from(advisedRequest)
.userText(augmentedPromptText) // Set the augmented user text
.adviseContext(context) // Set the updated context
.build();
}
// --- After (using ChatClientRequest) ---
@Override
public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain chain) {
String originalUserText = chatClientRequest.prompt().getUserMessage().getText(); // Access prompt directly
// ... retrieve documents ...
List<Document> retrievedDocuments = ...;
String augmentedQueryText = ...; // create augmented text
// Initialize context with existing data and add advisor-specific data
Map<String, Object> context = new HashMap<>(chatClientRequest.context()); (1)
context.put("retrievedDocuments", retrievedDocuments); // Example key
context.put("originalUserQuery", originalUserText); // Example key
// Use immutable operations
return chatClientRequest.mutate()
.prompt(chatClientRequest.prompt()
.augmentUserMessage(augmentedQueryText) (2)
)
.context(context) (3)
.build();
}
| 1 | 使用来自传入请求 (chatClientRequest.context()) 保留以前 advisor 的上下文,然后添加新数据。 |
| 2 | 使用如下方法prompt.augmentUserMessage(),安全地修改提示内容。 |
| 3 | 传递更新的上下文映射。此映射将成为ChatClientRequest稍后可通过以下方式访问ChatClientResponse.responseContext()在after方法。
|
除了直接将用户消息文本替换为augmentUserMessage(String)中,你可以提供一个函数来修改现有的UserMessage更细致:
Prompt originalPrompt = new Prompt(new UserMessage("Tell me about Large Language Models."));
// Example: Append context or modify properties using a Function
Prompt augmentedPrompt = originalPrompt.augmentUserMessage(userMessage ->
userMessage.mutate()
.text(userMessage.getText() + "\n\nFocus on their applications in software development.")
// .media(...) // Potentially add/modify media
// .metadata(...) // Potentially add/modify metadata
.build()
);
// 'augmentedPrompt' now contains the modified UserMessage
当您需要有条件地更改UserMessage或者使用其媒体和元数据,而不仅仅是替换文本内容。
-
超载的
tools方法中的ChatClient为清楚起见,并避免基于参数类型的方法调度中的歧义,已重命名了提示生成器 API。 -
ChatClient.PromptRequestSpec#tools(String… toolNames)已重命名为ChatClient.PromptRequestSpec#toolNames(String… toolNames).使用此方法指定工具函数的名称 (在其他位置注册,例如,通过@Bean定义@Description),允许模型调用。 -
ChatClient.PromptRequestSpec#tools(ToolCallback… toolCallbacks)已重命名为ChatClient.PromptRequestSpec#toolCallbacks(ToolCallback… toolCallbacks).使用此方法提供内联ToolCallback实例,其中包括函数实现、名称、描述和输入类型定义。
此更改解决了 Java 编译器可能不会根据提供的参数选择预期重载的潜在混淆。
提示模板和 Advisor
与提示创建和 advisor 自定义相关的几个类和方法已被弃用,取而代之的是更灵活的方法,使用构建器模式和TemplateRenderer接口。
有关新 API 的详细信息,请参阅 PromptTemplate 。
PromptTemplate 弃用
这PromptTemplateclass 已经弃用了几个与旧版templateFormat枚举和直接可变注入:
-
构造 函数:
PromptTemplate(String template, Map<String, Object> variables)和PromptTemplate(Resource resource, Map<String, Object> variables)已弃用。 -
领域:
template和templateFormat已弃用。 -
方法:
getTemplateFormat(),getInputVariables()和validate(Map<String, Object> model)已弃用。
迁移:使用PromptTemplate.builder()pattern 创建实例。通过以下方式提供模板字符串.template()并选择性地配置自定义TemplateRenderer通过.renderer().使用.variables().
// Before (Deprecated)
PromptTemplate oldTemplate = new PromptTemplate("Hello {name}", Map.of("name", "World"));
String oldRendered = oldTemplate.render(); // Variables passed at construction
// After (Using Builder)
PromptTemplate newTemplate = PromptTemplate.builder()
.template("Hello {name}")
.variables(Map.of("name", "World")) // Variables passed during builder configuration
.build();
Prompt prompt = newTemplate.create(); // Create prompt using baked-in variables
String newRendered = prompt.getContents(); // Or use newTemplate.render()
QuestionAnswerAdvisor 弃用
这QuestionAnswerAdvisor弃用了依赖于简单userTextAdvise字符串:
-
采用
userTextAdviseString 参数已弃用。 -
Builder 方法:
userTextAdvise(String userTextAdvise)已弃用。
迁移:使用.promptTemplate(PromptTemplate promptTemplate)builder 方法提供完全配置的PromptTemplate对象,用于自定义检索到的上下文的合并方式。
// Before (Deprecated)
QuestionAnswerAdvisor oldAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
.userTextAdvise("Context: {question_answer_context} Question: {question}") // Simple string
.build();
// After (Using PromptTemplate)
PromptTemplate customTemplate = PromptTemplate.builder()
.template("Context: {question_answer_context} Question: {question}")
.build();
QuestionAnswerAdvisor newAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
.promptTemplate(customTemplate) // Provide PromptTemplate object
.build();
聊天记忆
-
一个
ChatMemory每当使用 Spring AI Model Starters之一时,bean 都会自动为您配置。默认情况下,它使用MessageWindowChatMemory实现并将对话历史记录存储在内存中。 -
这
ChatMemoryAPI 已得到增强,以支持更灵活、可扩展的对话历史记录管理方式。存储机制已与ChatMemory接口,现在由新的ChatMemoryRepository接口。这ChatMemoryAPI 现在可用于实现不同的内存策略,而无需绑定到特定的存储机制。默认情况下,Spring AI 提供了一个MessageWindowChatMemory实现,该实现将消息窗口维持到指定的最大大小。 -
这
get(String conversationId, int lastN)method 中ChatMemory已被弃用,转而使用MessageWindowChatMemory当需要将内存中的消息保留到一定限制时。这get(String conversationId)method 现在是从内存中检索消息的首选方式,而ChatMemory可以决定筛选、处理和返回消息的策略。 -
这
JdbcChatMemory已被弃用,转而使用JdbcChatMemoryRepository与ChatMemory实现方式,例如MessageWindowChatMemory.如果您依赖于自动配置的JdbcChatMemorybean,你可以通过自动连接ChatMemoryBean 自动配置为使用JdbcChatMemoryRepositoryinternally 用于在相关依赖项位于 Classpath 中时存储消息。 -
这
spring.ai.chat.memory.jdbc.initialize-schema属性已被弃用,取而代之的是spring.ai.chat.memory.repository.jdbc.initialize-schema. -
请参阅 新聊天内存 文档 有关新 API 及其使用方法的更多详细信息。
-
这
MessageWindowChatMemory.get(String conversationId, int lastN)方法已弃用。窗口大小现在根据实例化期间提供的配置在内部进行管理,因此只有get(String conversationId)应该使用。
提示模板
-
这
PromptTemplateAPI 经过重新设计,以支持更灵活、可扩展的模板化提示方式,依赖于新的TemplateRenderer应用程序接口。作为此更改的一部分,getInputVariables()和validate()方法已被弃用,并将抛出UnsupportedOperationException如果调用。特定于模板引擎的任何逻辑都应该通过TemplateRenderer应用程序接口。
类包重构
为了更好地组织,几个类已经被移动到不同的模块和包中:
-
移动的评估类:
-
org.springframework.ai.evaluation.FactCheckingEvaluator移至org.springframework.ai.chat.evaluation包内spring-ai-client-chat. -
org.springframework.ai.evaluation.RelevancyEvaluator移至org.springframework.ai.chat.evaluation包内spring-ai-client-chat. -
org.springframework.ai.evaluation.EvaluationRequest,EvaluationResponse和Evaluator移自spring-ai-client-chat自spring-ai-commons在org.springframework.ai.evaluation包。
-
-
移动了输出转换器类:
-
类
org.springframework.ai.converter(例如,BeanOutputConverter,ListOutputConverter,MapOutputConverter,StructuredOutputConverter等)移自spring-ai-client-chat自spring-ai-model.
-
-
移动的 Transformer 类:
-
org.springframework.ai.chat.transformer.KeywordMetadataEnricher移至org.springframework.ai.model.transformer.KeywordMetadataEnricher在spring-ai-model. -
org.springframework.ai.chat.transformer.SummaryMetadataEnricher移至org.springframework.ai.model.transformer.SummaryMetadataEnricher在spring-ai-model.
-
-
移动的实用程序类:
-
org.springframework.ai.util.PromptAssert移自spring-ai-client-chat自org.springframework.ai.rag.util.PromptAssert在spring-ai-rag.
-
请相应地更新您的导入。
可观察性
-
对
spring.ai.client观察:-
这
spring.ai.chat.client.tool.function.names和spring.ai.chat.client.tool.function.callbacks属性已被弃用,替换为新的spring.ai.chat.client.tool.names属性,该属性包含传递给 ChatClient 的所有工具的名称,而不管用于定义它们的底层机制如何。 -
这
spring.ai.chat.client.advisor.params属性已被弃用,并且不会有替代项。原因是存在暴露敏感信息或中断检测的风险,因为 advisor 上下文中的条目用于在 advisor 之间传递任意 Java 对象,并且不一定可序列化。之前在此处导出的对话 ID 现在可通过专用的spring.ai.chat.client.conversation.id属性。如果需要将 advisor 上下文中的一些其他参数导出到可观测性系统,可以通过定义ObservationFilter并明确决定要导出哪些参数。有关灵感,您可以参考ChatClientPromptContentObservationFilter. -
通过 ChatClient API 指定的提示内容可选地包含在
spring.ai.client观察,分为几个属性:spring.ai.chat.client.user.text,spring.ai.chat.client.user.params,spring.ai.chat.client.system.text,spring.ai.chat.client.system.params.所有这些属性现在都已弃用,取而代之的是单个gen_ai.prompt属性,解决影响已弃用属性的问题,其中提示的一部分未包含在观察中,并与 ChatModel API 中使用的观察保持一致。这个新属性可以通过spring.ai.chat.observations.include-promptconfiguration 属性,而之前的spring.ai.chat.observations.include-inputconfiguration 属性已弃用。
-
-
对
spring.ai.advisor观察:-
这
spring.ai.advisor.type属性已弃用。在以前的版本中,Advisor API 根据 advisor 的类型 (before,after,around).这种区别不再适用,这意味着所有 Advisor 现在都属于同一类型 (around).
-
升级到 1.0.0-M7
MCP Java SDK 升级到 0.9.0
Spring AI 1.0.0-M7 现在使用 MCP Java SDK 版本 0.9.0,该版本与以前版本相比有重大变化。如果您在应用程序中使用 MCP,则需要更新代码以适应这些更改。
主要更改包括:
接口重命名
-
ClientMcpTransport→McpClientTransport -
ServerMcpTransport→McpServerTransport -
DefaultMcpSession→McpClientSession或McpServerSession -
都
*Registration类 →*Specification类
服务器创建更改
-
用
McpServerTransportProvider而不是ServerMcpTransport
// Before
ServerMcpTransport transport = new WebFluxSseServerTransport(objectMapper, "/mcp/message");
var server = McpServer.sync(transport)
.serverInfo("my-server", "1.0.0")
.build();
// After
McpServerTransportProvider transportProvider = new WebFluxSseServerTransportProvider(objectMapper, "/mcp/message");
var server = McpServer.sync(transportProvider)
.serverInfo("my-server", "1.0.0")
.build();
处理程序签名更改
现在,所有处理程序都会收到一个exchangeparameter 作为其第一个参数:
// Before
.tool(calculatorTool, args -> new CallToolResult("Result: " + calculate(args)))
// After
.tool(calculatorTool, (exchange, args) -> new CallToolResult("Result: " + calculate(args)))
通过 Exchange 进行客户端交互
以前在服务器上可用的方法现在通过 exchange 对象访问:
// Before
ClientCapabilities capabilities = server.getClientCapabilities();
CreateMessageResult result = server.createMessage(new CreateMessageRequest(...));
// After
ClientCapabilities capabilities = exchange.getClientCapabilities();
CreateMessageResult result = exchange.createMessage(new CreateMessageRequest(...));
根更改处理程序
// Before
.rootsChangeConsumers(List.of(
roots -> System.out.println("Roots changed: " + roots)
))
// After
.rootsChangeHandlers(List.of(
(exchange, roots) -> System.out.println("Roots changed: " + roots)
))
有关迁移 MCP 代码的完整指南,请参阅 MCP 迁移指南。
启用/禁用模型自动配置
之前用于启用/禁用模型自动配置的配置属性已被删除:
-
spring.ai.<provider>.chat.enabled -
spring.ai.<provider>.embedding.enabled -
spring.ai.<provider>.image.enabled -
spring.ai.<provider>.moderation.enabled
默认情况下,如果在 Classpath 上找到模型提供程序(例如 OpenAI、Ollama),则会启用其对相关模型类型(聊天、嵌入等)的相应自动配置。如果存在同一模型类型的多个提供程序(例如,同时spring-ai-openai-spring-boot-starter和spring-ai-ollama-spring-boot-starter),您可以使用以下属性来选择哪个提供程序的自动配置应处于活动状态,从而有效地禁用该特定模型类型的其他自动配置。
要完全禁用特定模型类型的自动配置,即使只存在一个提供程序,也请将相应的属性设置为与 Classpath 上的任何提供程序都不匹配的值(例如,none或disabled).
您可以参考SpringAIModels已知提供程序值列表的枚举。
-
spring.ai.model.audio.speech=<model-provider|none> -
spring.ai.model.audio.transcription=<model-provider|none> -
spring.ai.model.chat=<model-provider|none> -
spring.ai.model.embedding=<model-provider|none> -
spring.ai.model.embedding.multimodal=<model-provider|none> -
spring.ai.model.embedding.text=<model-provider|none> -
spring.ai.model.image=<model-provider|none> -
spring.ai.model.moderation=<model-provider|none>
使用 AI 自动升级
您可以使用 Claude Code CLI 工具在提供的提示下自动升级到 1.0.0-M7:
-
从 update-to-m7.txt 文件中复制提示
-
将提示粘贴到 Claude Code CLI 中
-
AI 将分析您的项目并进行必要的更改
| 自动升级提示当前处理工件 ID 更改、软件包重定位和模块结构更改,但尚未包括升级到 MCP 0.9.0 的自动更改。如果您使用的是 MCP,则需要按照 MCP Java SDK 升级部分中的指导手动更新代码。 |
跨版本的常见更改
工件 ID 更改
Spring AI Starters工件的命名模式已更改。 您需要根据以下模式更新依赖项:
-
模型Starters:
spring-ai-{model}-spring-boot-starter→spring-ai-starter-model-{model} -
Vector Store Starters:
spring-ai-{store}-store-spring-boot-starter→spring-ai-starter-vector-store-{store} -
MCP Starters:
spring-ai-mcp-{type}-spring-boot-starter→spring-ai-starter-mcp-{type}
例子
-
Maven
-
Gradle
<!-- BEFORE -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- AFTER -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
// BEFORE
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
implementation 'org.springframework.ai:spring-ai-redis-store-spring-boot-starter'
// AFTER
implementation 'org.springframework.ai:spring-ai-starter-model-openai'
implementation 'org.springframework.ai:spring-ai-starter-vector-store-redis'
对 Spring AI 自动配置工件的更改
Spring AI 自动配置已从单个整体工件更改为每个模型、矢量存储和其他组件的单个自动配置工件。 进行此更改是为了最大程度地减少不同版本的依赖库冲突(例如 Google Protocol Buffers、Google RPC 等)的影响。 通过将自动配置分离到特定于组件的构件中,您可以避免引入不必要的依赖项,并降低应用程序中版本冲突的风险。
原始的整体式构件不再可用:
<!-- NO LONGER AVAILABLE -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-spring-boot-autoconfigure</artifactId>
<version>${project.version}</version>
</dependency>
相反,每个组件现在都有自己的 autoconfiguration artifact ,遵循以下模式:
-
模型自动配置:
spring-ai-autoconfigure-model-{model} -
Vector Store 自动配置:
spring-ai-autoconfigure-vector-store-{store} -
MCP 自动配置:
spring-ai-autoconfigure-mcp-{type}
新的 Autoconfiguration 工件示例
-
Models
-
Vector Stores
-
MCP
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-anthropic</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-vertex-ai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-vector-store-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-vector-store-pgvector</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-vector-store-chroma</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-mcp-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-mcp-server</artifactId>
</dependency>
| 在大多数情况下,您不需要显式添加这些自动配置依赖项。 在使用相应的 starter 依赖项时,它们将以传递方式包含。 |
程序包名称更改
您的 IDE 应有助于重构到新的包位置。
-
KeywordMetadataEnricher和SummaryMetadataEnricher已从org.springframework.ai.transformer自org.springframework.ai.chat.transformer. -
Content,MediaContent和Media已从org.springframework.ai.model自org.springframework.ai.content.
模块结构
该项目的模块和工件结构发生了重大变化。以前spring-ai-core包含所有中央接口,但现在已将其拆分为专门的域模块,以减少应用程序中不必要的依赖关系。
spring-ai-commons
Base 模块,不依赖于其他 Spring AI 模块。包含:
- 核心域模型 (Document,TextSplitter)
- JSON 实用程序和资源处理
- 结构化日志记录和可观测性支持
spring-ai-模型
提供 AI 能力抽象:
- 接口,如ChatModel,EmbeddingModel和ImageModel- 消息类型和提示模板
- 函数调用框架 (ToolDefinition,ToolCallback)
- 内容过滤和观察支持
spring-ai-vector-store
统一向量数据库抽象:
-VectorStore相似性搜索界面
- 使用类似 SQL 的表达式进行高级筛选
-SimpleVectorStore用于内存中使用
- 对嵌入的批处理支持
spring-ai-client-chat
高级对话式 AI API:
-ChatClient接口
- 对话持久性ChatMemory- 响应转换OutputConverter- 基于 advisor 的拦截
- 同步和响应式流式处理支持
spring-ai-advisors-vector-store
Bridges 与 RAG 的载体商店聊天:
-QuestionAnswerAdvisor:将上下文注入提示
-VectorStoreChatMemoryAdvisor:存储/检索对话历史记录
依赖关系结构
依赖项层次结构可以概括为:
-
spring-ai-commons(基金会) -
spring-ai-model(取决于共享资源) -
spring-ai-vector-store和spring-ai-client-chat(两者都取决于型号) -
spring-ai-advisors-vector-store和spring-ai-rag(取决于 client-chat 和 vector-store) -
spring-ai-model-chat-memory-*modules (取决于 client-chat)
ToolContext 更改
这ToolContext类已得到增强,可同时支持显式和隐式工具解析。工具现在可以是:
-
Explicitly Included:在提示中明确请求并包含在对模型的调用中的工具。
-
Implicitly Available:可用于运行时动态解析的工具,但除非明确请求,否则从不包含在对模型的任何调用中。
从 1.0.0-M7 开始,仅当在提示中明确请求或显式包含在调用中时,工具才会包含在对模型的调用中。
此外,ToolContext类现在已标记为 final,无法再扩展。它从来都不应该被子类化。您可以在实例化ToolContext,以Map<String, Object>.有关更多信息,请查看 [文档](docs.spring.io/spring-ai/reference/api/tools.html#_tool_context)。
升级到 1.0.0-M6
对使用接口和 DefaultUsage 实现的更改
这Usageinterface 及其默认实现DefaultUsage进行了以下更改:
-
方法重命名:
-
getGenerationTokens()现在是getCompletionTokens()
-
-
类型更改:
-
中的所有令牌计数字段
DefaultUsage从Long自Integer:-
promptTokens -
completionTokens(以前generationTokens) -
totalTokens
-
-
所需作
-
将所有调用 替换为
getGenerationTokens()跟getCompletionTokens() -
更新
DefaultUsageconstructor 调用:
// Old (M5) new DefaultUsage(Long promptTokens, Long generationTokens, Long totalTokens) // New (M6) new DefaultUsage(Integer promptTokens, Integer completionTokens, Integer totalTokens)
| 有关处理 Usage 的更多信息,请参阅此处 |
更改了 FunctionCallingOptions 在工具调用中的用法
每ChatModel实例在构造时接受可选的ChatOptions或FunctionCallingOptions实例
可用于配置用于调用模型的默认工具。
1.0.0-M6 之前:
-
通过
functions()method 的默认值FunctionCallingOptions实例包含在 从该ChatModel实例,可能会被运行时选项覆盖。 -
通过
functionCallbacks()method 的默认值FunctionCallingOptions实例仅 可用于运行时动态解析(请参阅工具解析),但从不可用于运行时动态解析 包含在对模型的任何调用中,除非明确请求。
从 1.0.0-M6 开始:
-
通过
functions()方法或functionCallbacks()的默认值FunctionCallingOptions实例现在以相同的方式处理:它包含在从该ChatModel实例 可能被运行时选项覆盖。因此,调用中包含工具的方式是一致的 添加到模型,并防止由于functionCallbacks()以及所有其他选项。
如果要使工具可用于运行时动态解析,并将其仅包含在对模型的聊天请求中 当明确请求时,您可以使用 Tool Resolution 中描述的策略之一。
| 1.0.0-M6 引入了用于处理工具调用的新 API。保持旧 API 的向后兼容性 所有场景,除了上面描述的场景。旧 API 仍然可用,但它们已被弃用 并将在 1.0.0-M7 中删除。 |
删除已弃用的 Amazon Bedrock 聊天模型
从 1.0.0-M6 开始,Spring AI 过渡到使用 Amazon Bedrock 的 Converse API 来实现 Spring AI 中的所有聊天对话。 除 Cohere 和 Titan 的嵌入模型外,所有 Amazon Bedrock Chat 模型都将被删除。
| 请参阅 Bedrock Converse 文档以使用聊天模型。 |
使用 Spring Boot 3.4.2 进行依赖项管理的更改
Spring AI 更新以使用 Spring Boot 3.4.2 进行依赖项管理。你可以参考这里,了解 Spring Boot 3.4.2 管理的依赖项
所需作
-
如果要升级到 Spring Boot 3.4.2,请务必参考此文档,了解配置 REST 客户端所需的更改。值得注意的是,如果你在 Classpath 上没有 HTTP 客户端库,这可能会导致使用
JdkClientHttpRequestFactory哪里SimpleClientHttpRequestFactory之前会使用。切换到使用SimpleClientHttpRequestFactory,您需要设置spring.http.client.factory=simple. -
如果您使用的是不同版本的 Spring Boot(例如 Spring Boot 3.3.x)并且需要特定版本的依赖项,则可以在构建配置中覆盖它。
Vector Store API 更改
在版本 1.0.0-M6 中,delete方法中的VectorStoreinterface 已修改为 void作,而不是返回Optional<Boolean>.
如果您的代码之前检查了 delete作的返回值,则需要删除此检查。
现在,如果删除失败,该作将引发异常,从而提供更直接的错误处理。
升级到 1.0.0.M5
-
为了保持一致性,对 Vector Builder 进行了重构。
-
当前的 VectorStore 实现构造函数已被弃用,请使用 builder 模式。
-
VectorStore 实现包已移至唯一的包名称中,从而避免了跨构件的冲突。例如
org.springframework.ai.vectorstore自org.springframework.ai.pgvector.vectorstore.
升级到 1.0.0.M2
-
Chroma Vector Store 的配置前缀已从
spring.ai.vectorstore.chroma.store自spring.ai.vectorstore.chroma为了与其他 Vector Store 的命名约定保持一致。 -
的
initialize-schema能够初始化 Schema 的 vector store 上的属性现在设置为false. 这意味着,如果需要在应用程序启动时创建架构,则应用程序现在需要在支持的向量存储上显式选择加入架构初始化。 并非所有 vector store 都支持此属性。 有关更多详细信息,请参阅相应的 vector store 文档。 以下是目前不支持initialize-schema财产。-
汉娜
-
Pinecone
-
Weaviate
-
-
在 Bedrock Jurassic 2 中,聊天选项
countPenalty,frequencyPenalty和presencePenalty已重命名为countPenaltyOptions,frequencyPenaltyOptions和presencePenaltyOptions. 此外,聊天选项的类型stopSequences已从String[]自List<String>. -
在 Azure OpenAI 中,聊天选项的类型
frequencyPenalty和presencePenalty已从Double自Float,与所有其他实现一致。
升级到 1.0.0.M1
在发布 1.0.0 M1 的过程中,我们进行了几项重大更改。抱歉,这是最好的!
ChatClient 更改
进行了一次重大更改,将“旧的”ChatClient并将功能移至ChatModel.“新”ChatClient现在采用ChatModel.这样做是为了支持 Fluent API,用于以类似于 Spring 生态系统中其他客户端类的样式创建和执行提示,例如RestClient,WebClient和JdbcClient.有关 Fluent API 的更多信息,请参阅 [JavaDoc](docs.spring.io/spring-ai/docs/api),适当的参考文档即将发布。
我们将 'old' 重命名为ModelClient自Model并重命名了实现类,例如ImageClient已重命名为ImageModel.这Modelimplementation 表示在 Spring AI API 和底层 AI 模型 API 之间进行转换的可移植性层。
适应变化
这ChatClientclass 现在位于软件包中org.springframework.ai.chat.client
|
方法 1
现在,无需获取 AutoconfiguredChatClient实例,您将获得一个ChatModel实例。这call重命名后的方法签名保持不变。
要适应您的代码,您应该重构您的代码以更改 typeChatClient自ChatModel以下是更改前的现有代码示例
@RestController
public class OldSimpleAiController {
private final ChatClient chatClient;
public OldSimpleAiController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ai/simple")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.chatClient.call(message));
}
}
现在,在更改之后,这将是
@RestController
public class SimpleAiController {
private final ChatModel chatModel;
public SimpleAiController(ChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/simple")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.chatModel.call(message));
}
}
重命名也适用于类
*StreamingChatClient→StreamingChatModel
* EmbeddingClient→EmbeddingModel
* ImageClient→ImageModel
* SpeechClient→SpeechModel* 和其他类似<XYZ>Client类 |
方法 2
在此方法中,您将使用“new”上提供的新 Fluent APIChatClient
以下是更改前的现有代码示例
@RestController
class OldSimpleAiController {
ChatClient chatClient;
OldSimpleAiController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ai/simple")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of(
"generation",
this.chatClient.call(message)
);
}
}
现在,在更改之后,这将是
@RestController
class SimpleAiController {
private final ChatClient chatClient;
SimpleAiController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/ai/simple")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of(
"generation",
this.chatClient.prompt().user(message).call().content()
);
}
}
这ChatModel实例 通过 Autoconfiguration 提供给您。 |
方法 3
GitHub 存储库中有一个名为 [v1.0.0-SNAPSHOT-before-chatclient-changes](github.com/spring-projects/spring-ai/tree/v1.0.0-SNAPSHOT-before-chatclient-changes) 的标记,您可以查看该标记并进行本地构建,以避免更新任何代码,直到您准备好迁移代码库。
git checkout tags/v1.0.0-SNAPSHOT-before-chatclient-changes
./mvnw clean install -DskipTests
构件名称更改
重命名了 POM 构件名称: - spring-ai-qdrant → spring-ai-qdrant-store - spring-ai-cassandra → spring-ai-cassandra-store - spring-ai-pinecone → spring-ai-pinecone-store - spring-ai-redis → spring-ai-redis-store - spring-ai-qdrant → spring-ai-qdrant-store - spring-ai-gemfire → spring-ai-gemfire-store - spring-ai-azure-vector-store-spring-boot-starter → spring-ai-azure-store-spring-boot-starter - spring-ai-redis-spring-boot-starter → spring-ai-starter-vector-store-redis
升级到 0.8.1
前spring-ai-vertex-ai已重命名为spring-ai-vertex-ai-palm2和spring-ai-vertex-ai-spring-boot-starter已重命名为spring-ai-vertex-ai-palm2-spring-boot-starter.
因此,您需要将依赖项从
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vertex-ai</artifactId>
</dependency>
自
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vertex-ai-palm2</artifactId>
</dependency>
并且 Palm2 型号的相关 Boot starter 已从
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vertex-ai-spring-boot-starter</artifactId>
</dependency>
自
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vertex-ai-palm2-spring-boot-starter</artifactId>
</dependency>
-
重命名的类 (01.03.2024)
-
VertexAiApi → VertexAiPalm2Api
-
VertexAiClientChat → VertexAiPalm2ChatClient
-
VertexAiEmbeddingClient → VertexAiPalm2EmbeddingClient
-
VertexAiChatOptions → VertexAiPalm2ChatOptions
-
升级到 0.8.0
2024 年 1 月 24 日更新
-
将
prompt和messages和metadatapackages 的子软件包org.springframework.ai.chat -
新功能是文本生成图像客户端。类是
OpenAiImageModel和StabilityAiImageModel.有关用法,请参阅集成测试,文档即将推出。 -
新软件包
model其中包含接口和基类,以支持为任何输入/输出数据类型组合创建 AI 模型客户端。目前,chat 和 image model 包实现了这一点。我们很快就会将 embedding 包更新到这个新模型。 -
新的 “portable options” 设计模式。我们希望在
ModelCall尽可能跨不同的基于聊天的 AI 模型。有一组通用的生成选项,然后是特定于模型提供程序的选项。使用了一种 “duck typing” 方法。ModelOptions在 model 包中是一个 marker 接口,指示此类的实现将为模型提供选项。看ImageOptions,一个定义所有 text→image 的可移植选项的子接口ImageModel实现。然后StabilityAiImageOptions和OpenAiImageOptions提供特定于每个模型提供程序的选项。所有选项类都是通过 Fluent API 构建器创建的,都可以传递到可移植的ImageModel应用程序接口。这些选项数据类型用于ImageModel实现。
2024 年 1 月 13 日更新
以下 OpenAi 自动配置聊天属性已更改
-
从
spring.ai.openai.model自spring.ai.openai.chat.options.model. -
从
spring.ai.openai.temperature自spring.ai.openai.chat.options.temperature.
查找有关 OpenAi 属性的更新文档:docs.spring.io/spring-ai/reference/api/chat/openai-chat.html
2023 年 12 月 27 日更新
将 SimplePersistentVectorStore 和 InMemoryVectorStore 合并到 SimpleVectorStore 中 * 将 InMemoryVectorStore 替换为 SimpleVectorStore
2023 年 12 月 20 日更新
重构 Ollama 客户端和相关类和包名称
-
将org.springframework.ai.ollama.client.OllamaClient替换为org.springframework.ai.ollama.OllamaModelCall。
-
OllamaChatClient 方法签名已更改。
-
将org.springframework.ai.autoconfigure.ollama.OllamaProperties重命名为org.springframework.ai.model.ollama.autoconfigure.OllamaChatProperties,并将后缀更改为:
spring.ai.ollama.chat.一些属性也发生了变化。
2023 年 12 月 19 日更新
重命名 AiClient 和相关类和包名
-
将 AiClient 重命名为 ChatClient
-
将 AiResponse 重命名为 ChatResponse
-
将 AiStreamClient 重命名为 StreamingChatClient
-
将包 org.sf.ai.client 重命名为 org.sf.ai.chat
重命名 artifact ID of
-
transformers-embedding自spring-ai-transformers
将 Maven 模块从顶级目录和embedding-clients子目录下的所有models目录。
12月 1, 2023
我们正在转换项目的组 ID:
-
出发地:
org.springframework.experimental.ai -
收件人:
org.springframework.ai
构件仍将托管在快照存储库中,如下所示。
main 分支将移动到版本0.8.0-SNAPSHOT.
它会不稳定一两周。
如果您不想处于最前沿,请使用 0.7.1-SNAPSHOT。
您可以访问0.7.1-SNAPSHOT工件,并且仍然可以访问 0.7.1-SNAPSHOT 文档。
0.7.1-SNAPSHOT 依赖项
-
Azure OpenAI
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> <version>0.7.1-SNAPSHOT</version> </dependency> -
OpenAI
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>0.7.1-SNAPSHOT</version> </dependency>