Spring AI 1.0.0 M4 版本发布

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

我们很高兴宣布 Spring AI 的 1.0.0 M4 里程碑版本发布。

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

Amazon Bedrock Converse

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.FunctionSupplierConsumer 接口。

基本函数回调

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

使用 ToolContext {#using-toolcontext}

使用 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 文档

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

Kotlin 支持

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

高级和模块化 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 问题跟踪器上发送反馈。

其他改进

在模型模块中有几个地方使用了 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 社区所有即将举行的活动。

查看全部