Spring AI 1.0.0 M1 版本发布

发布 | Mark Pollack | 2024年5月30日 | ...

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

此版本包含以下新功能和改进。

ChatClient 流式 API

流式 API 提供了构建提示 (Prompt) 的方法,然后将其作为输入传递给 AI 模型。您可以使用 ChatClient.Builder 对象创建 ChatClient。您可以从 Spring Boot 自动配置中获取自动配置的 ChatClient.Builder,也可以通过编程方式创建一个。

如果您熟悉其他 Spring 客户端类,例如 WebClientRestClientJdbcClient,那么您会感觉很熟悉。

这是一个简单的使用示例

@RestController
class MyController {

    private final ChatClient chatClient;

    MyController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping("/ai")
    String generation(String userInput) {
        return this.chatClient.prompt()
            .user(userInput)
            .call()
            .content();
    }
}

user 方法设置提示的用户文本。call 方法调用 AI 模型,提供各种重载以返回响应。在本例中,content 方法返回一个字符串。

您也可以以响应式方式调用 AI 模型(在底层使用 WebClient),如下所示。

Flux<String> output = chatClient.prompt()
    .user("Tell me a joke")
    .stream()
    .content();

一个常见的用例是从对 AI 模型的调用中返回 JSON。使用 entity 方法可以简化此操作。

record ActorFilms(String actor, List<String> movies) {
}

ActorFilms actorFilms = chatClient.prompt()
    .user("Generate the filmography for a random actor.")
    .call()
    .entity(ActorFilms.class);

您可以在 @Configuration 类中创建 ChatClient 时指定默认值,例如系统文本。这种设计时和运行时分离允许运行时代码最小化,只需要属性占位符值。例如

@Configuration
class Config {

    @Bean
    ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}")
                .build();
    }

}

@RestController
class AIController {
	private final ChatClient chatClient
	AIController(ChatClient chatClient) {
		this.chatClient = chatClient;
	}
	@GetMapping("/ai")
	Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message, String voice) {
		return Map.of(
				"completion",
				chatClient.prompt()
						.system(sp -> sp.param("voice", voice))
						.user(message)
						.call()
						.content());
	}
}

还有许多其他选项可用。在您的 IDE 中浏览 API 并参阅文档以了解更多详细信息。

使用用户文本调用 AI 模型时,一种常见的模式是附加或增强包含上下文数据的提示。这类似于面向方面编程 (AOP) 的建议,其中可以在调用前后修改方法参数。Spring AI 中的 Advisor 允许您指定围绕 AI 模型调用的此行为。

此上下文数据可以是不同类型,包括:

  • 您自己的数据:这是 AI 模型未经训练的数据。即使模型已经见过类似的数据,附加的上下文数据在生成响应时也会优先考虑。数据首先从向量数据库中检索,然后添加到提示中。然后 AI 模型生成响应。这被称为检索增强生成 (RAG) 模式。

  • 对话历史记录:聊天模型的 API 是无状态的。如果您告诉 AI 模型您的姓名,它不会在后续交互中记住它。必须在每个请求中发送对话历史记录,以确保在生成响应时考虑之前的交互。

假设您已经将数据加载到 VectorStore 中,您可以通过向 ChatClient 提供 QuestionAnswerAdvisor 实例来执行检索增强生成 (RAG)。

ChatResponse response = ChatClient.builder(chatModel)
        .build().prompt()
        .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
        .user(userText)
        .call()
        .chatResponse();

ChatResponse 返回值包含生成的文本以及有关请求的其他元数据,例如 AI 模型用于生成响应的标记数量。

还有一些内置的 Advisor 用于对话历史记录,它们将对话存储在内存中或向量数据库中。

虽然 Advisor 模型并非创建 RAG 应用程序的最终解决方案,但它只需在 ChatClient 调用中添加一行代码即可提供重要的附加功能。这种简单而强大的方法为进一步探索提供了很大的潜力。

评估

通常,人们对收到听起来像人类的 AI 模型的响应感到非常满意,以至于他们认为它是准确的。不幸的是,情况并非总是如此。生成式 AI 容易出现幻觉,这意味着它可能会产生虚假信息。除非您是领域专家,否则很难区分事实和虚构。

评估器有助于解决此问题。您可以使用 AI 模型来评估另一个 AI 模型的响应是否准确。我们刚刚开始使用简单的 RelevancyEvaluator,但这项基本工具已被证明非常有用。

这是一个您可以用来在执行 RAG 后调用 RelevancyEvaluator 的 JUnit 测试示例。

@Test void testEvaluation() {

dataController.delete();
dataController.load();

String userText = "What is the purpose of Carina?";

ChatResponse response = ChatClient.builder(chatModel)
        .build().prompt()
        .advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
        .user(userText)
        .call()
        .chatResponse();

var relevancyEvaluator = new RelevancyEvaluator(ChatClient.builder(chatModel));

EvaluationRequest evaluationRequest = new EvaluationRequest(userText,
        (List<Content>) response.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS), response);

EvaluationResponse evaluationResponse = relevancyEvaluator.evaluate(evaluationRequest);

assertTrue(evaluationResponse.isPass(), "Response is not relevant to the question");

}

更多评估器将在 1.0 M2 中推出。

新的 AI 模型

在 1.0 M1 中添加了多个新的模型,感谢所有为此做出贡献的贡献者。

更新的模型

  • OpenAI - 支持 GPT4o 和多模态
  • Google Gemini Pro 1.5 pro、flash 等。
  • Anthropic 函数调用
  • Ollama 多模态支持
  • 改进的流式函数调用支持 - Grogdunn

新的向量数据库

测试容器支持

Spring AI 提供了 Testcontainer 支持,用于在您的测试中或通过docker compose启动向量数据库。感谢Eddú Meléndez Gonzales 的贡献。

常规改进

大量重构、错误修复、文档增强,由众多贡献者共同完成。如果我们还没有处理您的 PR,我们会处理的,请耐心等待。感谢

abel533pradipkhomanebottlerocketjonnymackey0225izeyelgxisbbjakkazyuluo-yxzhangqian9158ricken07iAMSagar44youngmoneeecosmin-ionitakoloyyeeThomasVitalePabloSanchiiAMSagar44MikeLaptevm3ss0alexcheng1982Hyune-czucchivanscionalteraJabezBrewimpactCndperezcabreraomarmahamidtenthehyglVrryouthesurlydevjiacheodanvegaizeyeeltociearvbartacekGrogdunnsamzhuhabumadevholic22Dimibedeepakn27swapy-27ahewerskewgod

示例应用

一个示例应用程序,涵盖了在航班预订机构聊天机器人的上下文中检索增强生成和函数调用。

后续步骤

对于M2,我们将重点关注对API的全面设计审查,扩展AI模型类型覆盖范围,进一步探索Advisor功能,添加更多评估器,并进行彻底的集成测试。我们计划在M2之后发布一个RC版本,然后在大约两个月内发布GA版本。

获取Spring简报

关注Spring简报

订阅

抢先一步

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

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部