先行一步
VMware 提供培训和认证,助您快速进步。
了解更多我们很高兴宣布 Spring AI 的 1.0.0 M4 里程碑版本发布。
此版本修复了大部分报告的错误,并在各个领域带来了显著增强。
Spring AI 现在支持 Amazon Bedrock Converse API,它为 Amazon 提供的 AI 对话模型提供了一个统一接口。与旧的 Bedrock Invoke API 不同,Converse 引入了令人兴奋的新功能,例如 工具调用 (Tool Calling) 和 多模态/视觉能力 (Multimodality/Visual capabilities)(适用于支持这些功能的模型)。这使得它成为使用 Amazon 对话模型更强大和灵活的选择。
在许多方面,Converse API 的作用类似于 Spring AI 本身,提供跨模型 API 的可移植性,但仅限于 Amazon 的对话模型。我们建议将对话模型迁移到 Converse 模块。请注意,嵌入模型不受影响。
有关此新功能的详细信息,请参阅 Spring AI Bedrock Converse 文档。您还可以关注 即将进行的改进 以获取未来的增强功能。非常感谢 Max Jiang 启动这项大型工作。
最近的改进通过 FunctionCallback
Builder 类扩展了对各种函数类型和方法的支持。这允许调用 java.util.Function
、Supplier
和 Consumer
接口。
FunctionCallback callback = FunctionCallback.builder()
.description("Process a new order")
.function("processOrder", (Order order) -> processOrderLogic(order))
.inputType(Order.class)
.build();
使用 BiFunction<I, ToolContext, O>
通过 ToolContext
访问附加状态或上下文
@Bean
@Description("Get the weather in location")
public BiFunction<WeatherService.Request, ToolContext, WeatherService.Response> weatherFunctionWithContext() {
return (request, context) -> new MockWeatherService().apply(request);
}
方法调用支持为 M5 中即将推出的 @ToolMapping
注解提供了基础
public static class LightControl {
private static final Logger logger = LoggerFactory.getLogger(LightControl.class);
private final Map<String, Object> arguments = new HashMap<>();
public void controlLight(String roomName, boolean on) {
arguments.put("roomName", roomName);
arguments.put("on", on);
logger.info("Setting light in room '{}' to: {}", roomName, on ? "ON" : "OFF");
}
}
用法
LightControl lightControl = new LightControl();
String response = ChatClient.create(this.chatModel)
.prompt("Turn light on in the living room.")
.functions(
FunctionCallback.builder()
.description("Controls lights by room name, allowing them to be turned on or off.")
.method("controlLight", String.class, boolean.class)
.targetObject(lightControl)
.build()
)
.call()
.content();
有关附加功能,请查阅涵盖以下内容的 FunctionCallback 文档
ParameterizedTypeReference
支持泛型输入类型Spring AI 引入了对 Kotlin 的支持,使 Kotlin 开发人员能够更轻松地将 AI 能力集成到他们的应用程序中。此版本引入了地道的 Kotlin 扩展和类型安全的 API。非常感谢 Sebastien Deleuze 承担这项工作。
新的 Kotlin 扩展提供了更简洁、类型安全的方式来处理 AI 响应。现在,您可以使用 Kotlin 的 reified 泛型,而不是 Java 风格的类型声明
import org.springframework.ai.chat.client.entity
data class Joke(val setup: String, val punchline: String)
@SpringBootApplication
class KotlinHelloWorldApplication {
@Bean
fun jokeRunner(chatModel: ChatModel) = CommandLineRunner {
val response = ChatClient.create(chatModel).prompt().user("Tell me a joke").call().entity<Joke>()
println("\nJoke:")
println("Setup: ${response.setup}")
println("Punchline: ${response.punchline}")
}
}
fun main(args: Array<String>) {
runApplication<KotlinHelloWorldApplication>(*args)
}
Kotlin 函数现在可以直接注册为 AI 工具。语法很简单
@Configuration
class Config {
@Bean
fun weatherFunctionInfo(currentWeather: (WeatherRequest) -> WeatherResponse): FunctionCallback {
return FunctionCallback.builder()
.description(
"Find the weather conditions, forecasts, and temperatures for a location, like a city or state."
)
.function("WeatherInfo", currentWeather)
.inputType(WeatherRequest::class.java)
.build()
}
@Bean
@Description("Get current weather")
fun currentWeather(): (WeatherRequest) -> WeatherResponse = { request ->
MockKotlinWeatherService().invoke(request)
}
}
然后,可以按如下方式使用。
@Bean
open fun init(chatModel: ChatModel) = CommandLineRunner {
try {
val userMessage = UserMessage(
"What are the weather conditions in San Francisco, Tokyo, and Paris? Find the temperature in Celsius for each of the three locations."
)
val response = chatModel.call(
Prompt(
listOf(userMessage),
OpenAiChatOptions.builder().withFunction("WeatherInfo").build()
)
)
println("Response: $response")
}
catch (e: Exception) {
println("Error during weather check: ${e.message}")
}
}
参考文档已更新,包含 Kotlin 示例,您可以在 spring-ai-examples 仓库中找到其他示例。
仓库 awesome-spring-ai 延续了其他“awseome”仓库的主题,收集了与 Spring AI 相关的社区资源,如书籍、演示、示例代码等。如果您发现了任何有用的材料,请向该仓库提交 PR。
仓库 spring-ai-integration-tests 现已可用,并正在取得进展,每天两次运行整个项目的集成测试。
仓库 spring-ai-examples 现已可用于托管“官方”示例。查看反射代理示例!
此外,作为对该项目的介绍,请查看博客文章 为何选择 Spring AI
Spring AI 引入了对基于模块化 RAG 系统设计最新研究的先进检索增强生成 (RAG) 的实验性支持,特别是论文 Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks 和 Retrieval-Augmented Generation for Large Language Models: A Survey。非常感谢 Thomas Vittale 领导这项工作。
以下是关键构建块
预检索组件
QueryTransformer
: 转换查询以提高检索效率(例如,翻译、重写)QueryExpander
: 将单个查询扩展为多个变体以捕获更广泛的上下文编排组件
QueryRouter
: 根据元数据或语义分析将查询路由到适当的检索器检索组件
DocumentRetriever
: 用于检索相关文档的核心接口DocumentJoiner
: 合并来自多个检索器/查询的结果后检索组件
DocumentCompressor
: 在保留关键信息的同时减少文档内容DocumentRanker
: 按相关性对文档重新排序DocumentSelector
: 根据条件过滤检索到的文档增强组件
QueryAugmenter
: 使用检索到的上下文增强查询ContextualQueryAugmenter
: 专注于文档上下文集成的默认实现基于我们的模块化 RAG 组件,RetrievalAugmentationAdvisor
提供了一个实现,帮助您入门并提供线性的 RAG 流程
您可以在 bean 定义中将这些协作的构建块组件组合在一起,例如
@Bean
public RetrievalAugmentationAdvisor customRagAdvisor(VectorStore vectorStore) {
return RetrievalAugmentationAdvisor.builder()
.queryTransformers(List.of(new TranslationQueryTransformer(...)))
.queryExpander(new MultiQueryExpander(...))
.queryRouter(
AllRetrieversQueryRouter.builder()
.documentRetrievers(new VectorStoreDocumentRetriever(...))
.build()
)
.documentJoiner(new ConcatenationDocumentJoiner())
.queryAugmenter(new ContextualQueryAugmenter(...))
.build();
}
虽然 RetrievalAugmentationAdvisor 实现了线性流程,但用户可以实现自定义的 Advisor
来实现条件、分支、递归和自适应流程等高级模式。更多文档即将推出,我们鼓励您在我们的 GitHub 问题跟踪器上发送反馈。
在模型模块中有几个地方使用了 Spring Boot。现在不再是这种情况。对 Spring Boot 的唯一依赖仅限于 autoconfigure 模块。
Azure OpenAI SDK 已升级到 12 Beta 版本。
扩展了配置和设置文档,重点关注
通过众多贡献者的努力,在各个方面进行了其他重构、错误修复和文档增强。如果您的 PR 尚未被处理,我们会尽快处理,请耐心等待。感谢
我们计划在 12 月下旬发布最后一个里程碑版本 1.0.0 M5,重点关注设计问题,例如在 ChatResponse 中返回更多信息,彻底改进 VectorStore API 以支持添加/删除和不同的查询类型,统一各种 Builder 的 API 风格等。然后我们将在 1 月发布 1.0.0 RC1 版本,随后很快发布 1.0.0 GA 版本。