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


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值