Spring-AI-alibaba 结构化输出
1、将模型响应转换为 ActorsFilms 对象实例:
ActorsFilms
package com.alibaba.cloud.ai.example.chat.openai.entity;
import java.util.List;
public record ActorsFilms(String actor, List<String> movies) {
}
@GetMapping("/toBean")
public ActorsFilms toBean() {
ActorsFilms actorsFilms = openAiChatClient.prompt()
.user(u -> u.text("Generate the filmography of 5 movies for {actor}.")
.param("actor", "Tom Hanks"))
.call()
.entity(ActorsFilms.class);
return actorsFilms;
}
2、将模型响应转换为 List 对象实例:
@GetMapping("/toBeanList")
public List<ActorsFilms> toBeanList() {
List<ActorsFilms> actorsFilms = openAiChatClient.prompt()
.user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.")
.call()
.entity(new ParameterizedTypeReference<List<ActorsFilms>>() {});
return actorsFilms;
}
3、将模型响应转换为 Map<String, Object>:
@GetMapping("/toMap")
public Map<String, Object> toMap() {
Map<String, Object> result = openAiChatClient.prompt()
.user(u -> u.text("Provide me a List of {subject}")
.param("subject", "an array of numbers from 1 to 9 under their key name 'numbers'"))
.call()
.entity(new ParameterizedTypeReference<Map<String, Object>>() {});
return result;
}
4、使用 ListOutputConverter
将模型响应转换为 List:
@GetMapping("/toList")
public List<String> toList() {
List<String> flavors = openAiChatClient.prompt()
.user(u -> u.text("List five {subject}")
.param("subject", "ice cream flavors"))
.call()
.entity(new ListOutputConverter(new DefaultConversionService()));
return flavors;
}
完整controller
package com.alibaba.cloud.ai.example.chat.openai.controller;
import com.alibaba.cloud.ai.example.chat.openai.entity.ActorsFilms;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.converter.ListOutputConverter;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.rag.Query;
import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander;
import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.TranslationQueryTransformer;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* @Author: wst
* @Date: 2024-12-16
*/
@RestController
@RequestMapping("/stru")
public class StruOuptController {
private final ChatClient openAiChatClient;
private final ChatModel chatModel;
public StruOuptController(ChatModel chatModel) {
this.chatModel = chatModel;
// 创建聊天客户端实例
// 设置系统提示信息,定义AI助手作为专业的室内设计顾问角色
// 构造时,可以设置 ChatClient 的参数
// {@link org.springframework.ai.chat.client.ChatClient};
this.openAiChatClient = ChatClient.builder(chatModel)
// 实现 Chat Memory 的 Advisor
// 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。
.defaultAdvisors(
new MessageChatMemoryAdvisor(new InMemoryChatMemory())
)
// 实现 Logger 的 Advisor
.defaultAdvisors(
new SimpleLoggerAdvisor()
)
// 设置 ChatClient 中 ChatModel 的 Options 参数
.defaultOptions(
OpenAiChatOptions.builder()
.topP(0.7)
.build()
)
.build();
}
@GetMapping("/toBean")
public ActorsFilms toBean() {
ActorsFilms actorsFilms = openAiChatClient.prompt()
.user(u -> u.text("Generate the filmography of 5 movies for {actor}.")
.param("actor", "Tom Hanks"))
.call()
.entity(ActorsFilms.class);
return actorsFilms;
}
@GetMapping("/toBeanList")
public List<ActorsFilms> toBeanList() {
List<ActorsFilms> actorsFilms = openAiChatClient.prompt()
.user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.")
.call()
.entity(new ParameterizedTypeReference<List<ActorsFilms>>() {});
return actorsFilms;
}
@GetMapping("/toMap")
public Map<String, Object> toMap() {
Map<String, Object> result = openAiChatClient.prompt()
.user(u -> u.text("Provide me a List of {subject}")
.param("subject", "an array of numbers from 1 to 9 under their key name 'numbers'"))
.call()
.entity(new ParameterizedTypeReference<Map<String, Object>>() {});
return result;
}
@GetMapping("/toList")
public List<String> toList() {
List<String> flavors = openAiChatClient.prompt()
.user(u -> u.text("List five {subject}")
.param("subject", "ice cream flavors"))
.call()
.entity(new ListOutputConverter(new DefaultConversionService()));
return flavors;
}
}