格式化输出(Structured Output) 是指通过设计提示词(Prompt)或使用 Schema 约束(或者对象约束),引导大语言模型(LLM)将非结构化信息处理后,输出为预定义的结构化数据格式(如 JSON、XML、对象等),以便程序能够直接解析和使用。

官方文档:格式化输出(Structured Output)-阿里云Spring AI Alibaba官网官网

通俗的意思就是:将AI大模型返回的结果转成JSON、XML、Java类等,原本返回值是String(字符串)

1.本章目标

假设我们期望将模型输出转换为Record记录类结构体,不再是传统的String

2.创建record对象

 record学习资料:

https://www.bilibili.com/video/BV1PY411e7J6?spm_id_from=333.788.videopod.episodes&vd_source=f3f60f7acbef49d38b97c4d660d439fc&p=199https://www.bilibili.com/video/BV1PY411e7J6?spm_id_from=333.788.videopod.episodes&vd_source=f3f60f7acbef49d38b97c4d660d439fc&p=199

package com.atguigu.study.record;


/**
 * jdk14以后的新特性,纪录类recode = entity(实体) + Lombok
 */
public record StudentRecord(String id, String sname, String major, String email ) {
}

jdk14以后的新特性,纪录类recode = entity(实体) + Lombok

实际上一个record就是一个对象

这是用户自定义的提示词,所以这里用这个

new Consumer<ChatClient.PromptUserSpec>()

PromptUserSpec 是一个接口,里面封装了很多方法

方式一:模板文件写死到代码中

@RestController
public class StructuredOutputController {
    @Resource(name = "qwenChatClient")
    private ChatClient qwenChatClient;

    /**
     * http://localhost:8007/structuredoutput/chat?sname=李四&email=zzyybs@126.com
     *
     * @param sname
     * @return
     */
    @GetMapping("/structuredoutput/chat")
    public StudentRecord chat(String sname, String email) {

//        这里的user是用到了一个匿名内部类,拼了一个提示词,并且这个提示词的返回进行了格式化的组织
//        一些内容去替换占位符,并且返回的结果不是string而是纪录类record(对象)
        return qwenChatClient.prompt().user(new Consumer<ChatClient.PromptUserSpec>() {
            @Override
            public void accept(ChatClient.PromptUserSpec promptUserSpec) {
                promptUserSpec.text("学号1001,我叫{sname},大学专业是计算机科学与技术,邮箱{email}")
                        .param("sname", sname)
                        .param("email", email);
            }
        }).call().entity(StudentRecord.class);

    }
}

方法二:lambda表达式和模板文件

  /**
     * http://localhost:8007/structuredoutput/chat2?sname=孙伟&email=zzyybs@126.com
     * @param sname
     * @return
     */
    @GetMapping("/structuredoutput/chat2")
    public StudentRecord chat2(String sname, String email) {

        String stringTemplate = "学号1001,我叫{sname},大学专业是计算机科学与技术,邮箱{email}";

//        这里的user是用到了一个匿名内部类,拼了一个提示词,并且这个提示词的返回进行了格式化的组织
//        一些内容去替换占位符,并且返回的结果不是string而是纪录类record(对象)
        return qwenChatClient.prompt().user(promptUserSpec -> promptUserSpec.text(stringTemplate)
                .param("sname", sname)
                .param("email", email))
                .call().
                entity(StudentRecord.class);

    }

3.格式化输出的结果

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐