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

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;
    }
    


}

相关文章:

  • 技术视界 | 人形机器人运动控制框架详解:解锁智能机器人的“灵动”密码
  • 如何使用maxscale实现mysql读写分离
  • Java 反序列化之 XStream 反序列化
  • [c语言日记]轮转数组算法(力扣189)
  • JavaScript中的运算符与语句:深入理解编程的基础构建块
  • CentOS下,Xftp中文文件名乱码的处理方式
  • 【第42节】windows双机调试环境搭建和SEH原理剖析
  • RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法
  • 【科普】轨道交通信号系统相关名词解释
  • 基础贪心算法集合2(10题)
  • flutter-Text等组件出现双层黄色下划线的问题
  • android-根据java文件一键生成dex文件脚本
  • js | 网页上的 json 数据怎么保存到本地表格中?
  • NAS-相关软件推荐——非相册和备份的
  • 影刀RPA证书题库包含初级、中级、高级和AP初级
  • Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
  • try...catch、async/await和Promise区别与联系
  • Openlayers:实现聚合
  • [LeetCode 55] 跳跃游戏
  • 【今日三题】经此一役小红所向无敌(模拟) / 连续子数组最大和(动态规划) / 非对称之美(贪心)
  • 我国翻译从业人员达680.8万人,行业总需求仍在上升
  • 韩国检方以受贿嫌疑起诉前总统文在寅
  • 2025年中央金融机构注资特别国债发行,发行金额1650亿
  • 北京顺义潮白河大桥主跨坍塌原因公布,已成立事故调查组
  • 商务部:一季度社零总额12.47万亿元,同比增长4.6%
  • 泽连斯基:停火后愿进行“任何形式”谈判,但领土问题除外