Spring AI 1.0.0 M4 版本发布

发布 | Mark Pollack | 2024年11月20日 | ...

我们很高兴地宣布 Spring AI 1.0.0 Milestone 4 版本发布。

此版本修复了大部分报告的 bug,并在多个领域带来了显著的增强。

Amazon Bedrock Converse

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 启动这项艰巨的任务。

Function Calling 改进

函数类型和方法

最近的改进通过 FunctionCallback Builder 类扩展了对各种函数类型和方法(Function types and methods)的支持。这允许调用 java.util.FunctionSupplierConsumer 接口。

基本函数回调

FunctionCallback callback = FunctionCallback.builder()
    .description("Process a new order")
    .function("processOrder", (Order order) -> processOrderLogic(order))
    .inputType(Order.class)
    .build();

使用 ToolContext {#using-toolcontext}

使用 ToolContextBiFunction<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 文档,其中涵盖了

  • Schema 类型配置(JSON Schema 和 OpenAPI Schema 支持)
  • 自定义响应处理和对象映射
  • 使用 ParameterizedTypeReference 支持泛型输入类型
  • 从 Java 类型自动生成 Schema,包括 Jackson 注解支持
  • 编写有效的函数描述和错误处理指南

Kotlin 支持

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

高级和模块化 RAG

Spring AI 引入了对基于模块化 RAG 系统设计的最新研究的先进检索增强生成 (RAG) 的实验性支持,特别是论文 Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable FrameworksRetrieval-Augmented Generation for Large Language Models: A Survey。非常感谢 Thomas Vittale 领导这项工作。

以下是关键构建块:

预检索组件

  • QueryTransformer:转换查询以提高检索效果(例如,翻译、改写)
  • QueryExpander:将单个查询扩展为多个变体,以捕获更广泛的上下文

编排组件

  • QueryRouter:根据元数据或语义分析将查询路由到适当的检索器

检索组件

  • DocumentRetriever:检索相关文档的核心接口
  • DocumentJoiner:组合来自多个检索器/查询的结果

后检索组件

  • DocumentCompressor:在保留关键信息的同时减少文档内容
  • DocumentRanker:按相关性重新排序文档
  • DocumentSelector:根据标准过滤检索到的文档

增强组件

  • QueryAugmenter:使用检索到的上下文增强查询
  • ContextualQueryAugmenter:专注于文档上下文集成的默认实现

基于我们的模块化 RAG 组件,RetrievalAugmentationAdvisor 提供了一个实现,可以帮助您入门,并提供线性的 RAG 流。

  1. 查询创建:使用 PromptTemplate 从用户文本创建查询
  2. 查询转换:应用 QueryTransformers 链
  3. 查询扩展:通过 QueryExpander 创建多个查询
  4. 文档检索:路由和执行并行检索
  5. 文档集成:合并所有来源的结果
  6. 上下文增强:使用检索到的上下文增强查询

您可以在 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 版。

文档

  • 已添加一个全面的聊天模型比较页面。
  • 重构了文档导航,以提高可访问性。
  • 更新了聊天模型架构图。
  • 添加了有关使用服务帐户以编程方式配置 Vertex 嵌入的指南。
  • 增强了集成指南。
  • Ollama 更新
    • 新的自动拉取功能
    • Llama32-Vision 支持
  • Spring AI 功能
    • 开箱即用地支持 Llama32-Vision。
    • 可移植的多模态 API。
  • 向量数据库配置
    • Milvus
    • Chroma
    • OpenSearch

扩展了配置和设置文档,重点关注:

  • 属性覆盖
  • 代码示例
  • 不同模型类型的集成模式

向量存储和嵌入改进

  • 为 Oracle Coherence 和 Azure Cosmos 添加了新的向量存储实现。
  • 增强了现有的向量存储。
    • Azure:提供了匹配预先存在的字段名和使用无密钥身份验证的能力。
    • Milvus:添加了对非默认数据库的支持。
    • Chroma:引入了 Builder 模式以更好地初始化。
    • OpenSearch:改进了配置结构。
  • 为 TokenTextSplitter 引入了 Builder 模式。

贡献者

大量贡献者对代码进行了其他重构、错误修复和文档增强。如果您的 PR 尚未处理,我们将尽快处理,请耐心等待。感谢以下贡献者:

路线图

我们计划在 12 月下旬进行最后一次里程碑版本发布,即 1.0.0 M5,重点关注设计问题,例如在 ChatResponse 中返回更多信息,对 VectorStore API 进行大修以支持添加/删除和不同查询类型,统一各种 Builder 的 API 风格,等等。然后,在 1 月份,我们将发布 1.0.0 RC1 版本,并迅速跟进 1.0.0 GA 版本。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有