4.指定输出格式OutputParser
4.1.OutputParser解析器
Spring AI 提供了OutputParser解析器,该解析器可以将AI生成的内容解析为Java Bean对象。该解析器类似于ORM框架中的Mapper,将AI的生成内容映射为Java对象。
OutputParser
结合了Parser<T>
和FormatProvider
。
FormatProvider
接口用于提供一些文本指令,来限制AI的输出格式,这里就用到了提示词,我们可以通过阅读源码来查看Spring AI内部设定的相关提示词:
Parser<T>
接口用于解析AI生成的内容并将其转换为Java对象返回。
在Spring AI中,OutputParser接口有三个具体的实现类:
BeanOutputParser
: 通过让AI生成JSON格式的文本,然后通过JSON反序列化为Java对象返回;
MapOutputParser
: 与BeanOutputParser的功能类似,但会将JSON反序列化为Map对象;
ListOutputParser
: 让AI生成以逗号分隔的列表;
一般的,我们会先使用FormatProvider
获取输出限制的提示词对AI生成的文本格式进行限制,然后用Parser<T>
来解析我们生成的内容作为一个Bean对象。
4.2.BeanOutputParser
响应模板
import java.util.List;
public class ActorsFilms {
// 属性
private String actor;
private List<String> movies;
// 构造方法
public ActorsFilms() {
}
// Setter/ Getter
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public List<String> getMovies() {
return movies;
}
public void setMovies(List<String> movies) {
this.movies = movies;
}
@Override
public String toString() {
return "ActorsFilms{" + "actor='" + actor + '\'' + ", movies=" + movies + '}';
}
}
代码实现
@GetMapping("/chat/output")
public ActorsFilms output(
@RequestParam(value = "actor", defaultValue = "成龙") String actor
) {
OutputParser<ActorsFilms> outputParser = new BeanOutputParser<>(ActorsFilms.class);
String format = outputParser.getFormat(); // 分析结构 json
String userMessage = """
列出{actor}主演的电影.
{format}
""";
PromptTemplate promptTemplate = new PromptTemplate(userMessage, Map.of("actor", actor, "format", format));
Prompt prompt = promptTemplate.create();
AssistantMessage output = chatClient.call(prompt).getResult().getOutput();
String content = output.getContent();
content = content
.replace("```json", "")
.replace("```", "");
System.out.println("content = " + content);
return outputParser.parse(content);
}
测试
GET http://localhost:8080/chat/output