当前位置: 首页 > news >正文

Spring AI 从入门到精通-结构化输出

6. 结构化输出:让 AI 交作业,不是写散文

6.1 问题:AI 输出的是文本,但你要的是对象

AI 默认返回的是自然语言文本。但你的程序需要的是结构化的 Java 对象。怎么办?

// 你想要的是这个recordPerson(Stringname,intage,Stringcity){}// 但 AI 给你的是这个"张三,今年 25 岁,住在北京。他的朋友李四..."

6.2 BeanOutputConverter:文本 → Java Bean

// 1. 定义目标类型recordPerson(Stringname,intage,Stringcity){}// 2. 用 ChatClient 的 entity() 方法Personperson=chatClient.prompt().user("生成一个随机的人物信息").call().entity(Person.class);System.out.println(person.name());// 张三System.out.println(person.age());// 28System.out.println(person.city());// 上海

发生了什么?Spring AI 在后台做了两件事:

  1. 根据Person类生成 JSON Schema,追加到 Prompt 后面作为格式指令
  2. 拿到 AI 返回的 JSON 后,用 Jackson 反序列化成Person对象

6.3 泛型类型:返回 List

// 返回 List<Person>List<Person>people=chatClient.prompt().user("生成 5 个随机的人物信息").call().entity(newParameterizedTypeReference<List<Person>>(){});people.forEach(p->System.out.println(p.name()+", "+p.age()));

💡ParameterizedTypeReference是什么?因为 Java 在运行时会擦除泛型类型(List<Person>在运行时只是List),Spring AI 需要通过这个匿名内部类的方式拿到实际的泛型参数类型。记住这个写法模板就行,每次需要返回泛型集合时照抄。

6.4 MapOutputConverter:返回 Map

Map<String,Object>result=chatClient.prompt().user(u->u.text("列出 {subject} 的 {count} 个属性,用 JSON 格式").param("subject","一个 Java 开发者的简历").param("count",5)).call().entity(newParameterizedTypeReference<Map<String,Object>>(){});System.out.println(result);// {name=张三, experience=5年, skills=[Java, Spring, MySQL, Redis], ...}

6.5 ListOutputConverter:返回列表

List<String>flavors=chatClient.prompt().user(u->u.text("列出 {count} 种 {subject}").param("count",10).param("subject","冰淇淋口味")).call().entity(newListOutputConverter(newDefaultConversionService()));flavors.forEach(System.out::println);// 巧克力// 香草// 草莓// ...

6.6 Native Structured Output:更可靠的结构化

一些模型(GPT-4o、Claude 3.5 等)原生支持结构化输出。Spring AI 用 Advisor 参数来启用:

Personperson=chatClient.prompt().advisors(AdvisorParams.ENABLE_NATIVE_STRUCTURED_OUTPUT).user("生成一个随机的人物信息").call().entity(Person.class);

区别:普通模式是在 Prompt 里加"请输出 JSON",AI 可能不听话。Native 模式是把 JSON Schema 传给模型的原生 API,模型保证输出符合 Schema。

全局启用:

@BeanChatClientchatClient(ChatClient.Builderbuilder){returnbuilder.defaultAdvisors(AdvisorParams.ENABLE_NATIVE_STRUCTURED_OUTPUT).build();}

6.7 底层用法:手动使用 BeanOutputConverter

有时候你需要手动控制转换过程:

BeanOutputConverter<Person>converter=newBeanOutputConverter<>(Person.class);Stringformat=converter.getFormat();// 拿到格式指令StringuserTemplate=""" 生成一个随机人物信息。 {format} """;Promptprompt=newPrompt(PromptTemplate.builder().template(userTemplate).variables(Map.of("format",format)).build().createMessage());Generationgeneration=chatModel.call(prompt).getResult();Personperson=converter.convert(generation.getOutput().getText());

💡什么时候用底层?当你需要自定义 Prompt 模板结构,不想用 ChatClient 的自动拼接时。


http://www.jsqmd.com/news/971399/

相关文章:

  • 今日开源[第10期]ds4(DwarfStar) - zhang
  • CAP定理(又称布鲁尔定理)指出:在分布式系统中,**一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)**
  • 看完就会:高效论文写作全流程AI论文工具推荐(2026 最新)
  • 神经渲染:颠覆特效制作的技术革命与实战指南
  • 手把手教你用Overleaf搞定IEEE会议论文(附CAC投稿避坑指南)
  • 2026年网架厂家推荐榜单:体育馆网架、煤棚网架、大跨度网架与螺栓球网架标杆品牌深度解析 - 品牌发掘
  • WorkshopDL:5分钟学会下载Steam创意工坊模组,非Steam平台也能用!
  • 工业用吸尘器厂家佛山排行榜2026:史沃斯稳居第一 - 工业清洁测评社
  • Spring AI 从入门到精通-Embedding
  • Java数据库连接池学习
  • 神经渲染引爆虚拟制片:技术原理、实战应用与未来蓝图
  • 蛋糕美食元服务_我的实现指南
  • 25+图像控制工具:ComfyUI ControlNet Auxiliary Preprocessors如何革新AI绘图预处理工作流
  • Java Agent Premain Agentmain
  • 2026 济南防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南 - 宅安选房屋修缮
  • 德国酷贝漆靠谱吗? - myqiye
  • 水泵隔音降噪技术全解析:新能源噪音治理、新能源隔音降噪、机房噪音治理、水泵房噪音治理、车间噪音治理、车间隔音降噪选择指南 - 优质品牌商家
  • 手机号查QQ终极指南:3个技巧帮你找回遗忘的账号
  • 动平衡机靠谱品牌,中联试验机的口碑怎样 - mypinpai
  • 如何快速掌握ExifToolGui:照片元数据管理的完整指南
  • 2026年托管加盟品牌实测推荐:托管加盟多少钱、托管加盟小饭桌、托管加盟手续、托管加盟推荐、教育加盟哪家好、教育加盟多少钱选择指南 - 优质品牌商家
  • 2026年修补砂浆厂家推荐榜单:快速修补、高强度修补与地面修复砂浆精选指南 - 品牌发掘
  • 关于下载pip install faiss-cpu失败的问题
  • 手绘字画和印刷字画怎么分?一招不再买错 - 深鉴新闻
  • 5个突破性功能:重新定义英雄联盟游戏体验的一站式解决方案
  • 企业品牌声誉管理靠谱之选(2026年6月):AI舆情监测/危机处置/声誉修复三大技术流派全攻略 - 玖叁鹿
  • 2026 东莞防水补漏服务商口碑测评榜单|全屋渗漏维修机构优选指南(6 月最新) - 宅安选房屋修缮
  • 终极指南:免费快速下载B站4K高清视频的完整教程
  • 2026年薄型气凝胶价格,哪家更实惠 - mypinpai
  • .net 简单的数据库操作框架