先行一步
VMware 提供培训和认证,为您的发展加速。
了解更多我们很高兴地宣布 Spring AI 的 1.0.0 Milestone 1 版本发布。
此版本包含以下新特性和改进。
流式 API 提供了构建 Prompt 的方法,Prompt 然后作为输入传递给 AI 模型。您可以使用 ChatClient.Builder
对象创建 ChatClient
。您可以从 Spring Boot 自动配置获取自动配置的 ChatClient.Builder
,或者通过编程方式创建。
如果您熟悉其他 Spring 客户端类,例如 WebClient
、RestClient
和 JdbcClient
,这将会感觉很熟悉。
以下是一个简单的用法示例
@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
方法设置 Prompt 的用户文本。call
方法调用 AI 模型,提供各种重载以返回响应。在这种情况下,content
方法返回一个 String。
您还可以以响应式方式调用 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 模型时,一个常见的模式是附加或增强 Prompt,为其添加上下文数据。这类似于面向切面编程 (AOP) 中的 advice,可以在方法调用之前和之后修改方法参数。Spring AI 中的 Advisor 允许您在 AI 模型调用周围指定此行为。
这些上下文数据可以是不同类型,包括
您的自有数据:这是 AI 模型尚未训练的数据。即使模型见过类似数据,附加的上下文数据在生成响应时也会优先。数据首先从向量存储中检索,然后添加到 Prompt 中。接着 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 模型生成响应使用了多少 token。
还有内置的 Advisors 用于对话历史,它们将对话存储在内存中或向量存储中。
虽然 Advisor 模型并非创建 RAG 应用的万能解决方案,但它通过在您的 ChatClient
调用中只需一行代码,提供了显著的额外功能。这种简单而强大的方法为进一步探索提供了巨大潜力。
人们常常对收到听起来像人类的 AI 模型响应感到非常满意,以至于他们认为它是准确的。不幸的是,情况并非总是如此。生成式 AI 容易出现幻觉,这意味着它可以产生虚假信息。除非您是领域专家,否则很难区分事实与虚构。
评估器有助于解决这个问题。您可以使用一个 AI 模型来评估来自另一个 AI 模型的响应是否准确。我们刚刚开始使用一个简单的 RelevancyEvaluator
来探索这条道路,但即使是这个基本工具也已被证明非常有帮助。
以下是一个示例 JUnit 测试,您可以在执行 RAG 后使用它来调用 RelevancyEvaluator。
@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 中推出。
1.0 M1 中新增了多个模型,感谢所有为此付出努力的贡献者。
Spring AI 提供 Testcontainer 支持,用于在 您的测试 中或通过 docker compose 启动向量存储数据库。感谢 Eddú Meléndez Gonzales 的贡献。
通过众多贡献者的努力,全面进行了大量重构、错误修复和文档增强。如果您的 PR 我们尚未处理,我们将会处理,请耐心等待。感谢
abel533, pradipkhomane, bottlerocketjonny, mackey0225, izeye, lgxisbb, jakkaz, yuluo-yx, zhangqian9158, ricken07, iAMSagar44, youngmoneee, cosmin-ionita, koloyyee, ThomasVitale, PabloSanchi, iAMSagar44, MikeLaptev, m3ss0, alexcheng1982, Hyune-c, zucchivan, scionaltera, JabezBrew, impactCn, dperezcabrera, omarmahamid, tenthe, hygl, Vrryou, thesurlydev, jiacheo, danvega, izeye, eltociear, vbartacek, Grogdunn, samzhu, habuma, devholholic22, Dimibe, deepakn27, swapy-27, ahewer, skewgod
一个涵盖检索增强生成和函数调用(在航班预订代理的聊天机器人上下文中)的示例应用。
对于 M2,我们的重点是彻底的设计评审 API,扩展 AI 模型类型覆盖范围,进一步探索 Advisor 特性,添加更多评估器,并进行全面的集成测试。我们计划在 M2 后发布一个 RC,然后在大约两个月后发布 GA 版本。