领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我们很高兴地宣布 Spring AI 1.0.0 Milestone 4 版本发布。
此版本修复了大部分报告的 bug,并在多个领域带来了显著的增强。
Spring AI 现在支持 Amazon Bedrock Converse API,它为 Amazon 提供的 AI 聊天模型提供了一个统一的接口。与旧的 Bedrock Invoke API 不同,Converse 引入了令人兴奋的新功能,例如 **工具调用** 和 **多模态/视觉能力**(针对支持这些功能 _的模型_)。这使其成为使用 Amazon 聊天模型的更强大、更通用的选择。
在很多方面,Converse API 的作用与 Spring AI 本身类似,它提供了跨模型 API 的可移植性,但仅限于 Amazon 的聊天模型。我们建议聊天模型迁移到 Converse 模块。请注意,嵌入模型不受影响。
有关此新功能的详细信息,请参阅 Spring AI Bedrock Converse 文档。您也可以关注 即将进行的改进 以了解未来的增强功能。非常感谢 Max Jiang 启动这项艰巨的任务。
最近的改进通过 FunctionCallback Builder 类扩展了对各种函数类型和方法(Function types and methods)的支持。这允许调用 java.util.Function、Supplier 和 Consumer 接口。
FunctionCallback callback = FunctionCallback.builder()
.description("Process a new order")
.function("processOrder", (Order order) -> processOrderLogic(order))
.inputType(Order.class)
.build();
使用 ToolContext 和 BiFunction<I, ToolContext, O> 访问其他状态或上下文。
@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 generics),而不是使用 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 现已可用,用于托管“官方”示例。快来看看反射代理示例!
此外,作为项目介绍,请查看博文 Why 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 issue tracker 上提供反馈。
模型模块中有几个地方使用了 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 版本。