通义千问调用笔记

如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心

package com.ruoyi.webapp.utils;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationOutput;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Semaphore;

/**
 * @author hrui
 * @date 2024/4/25 10:11
 */
public class TYQWUtils {
    private static final Logger logger = LoggerFactory.getLogger(TYQWUtils.class);
    public static String callWithMessage(String userContent) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation(); // 这里假设Generation可以这样使用API密钥

        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a helpful assistant.")
                .build();

        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(userContent)
                .build();

        GenerationParam param = GenerationParam.builder()
                .model("qwen-turbo")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .topP(0.8)
                .build();

        GenerationResult result = gen.call(param);
        List<GenerationOutput.Choice> choices = result.getOutput().getChoices();

        String content = choices.get(0).getMessage().getContent();
        return content; // 或者根据实际需求格式化结果
    }

    public static void main(String[] args) {
        List<String> list=new ArrayList<>();

    }

    private static void handleGenerationResult(GenerationResult message, StringBuilder fullContent) {

        fullContent.append(message.getOutput().getChoices().get(0).getMessage().getContent());
        logger.info("Received message: {}", JsonUtils.toJson(message));

    }


    //以流的方式
    public static String streamCallWithCallback(Generation gen, Message userMsg)
            throws NoApiKeyException, ApiException, InputRequiredException, InterruptedException {
        GenerationParam param = buildGenerationParam(userMsg);
        Semaphore semaphore = new Semaphore(0);
        StringBuilder fullContent = new StringBuilder();

        gen.streamCall(param, new ResultCallback<GenerationResult>() {
            @Override
            public void onEvent(GenerationResult message) {
                handleGenerationResult(message, fullContent);
            }

            @Override
            public void onError(Exception err) {
                logger.error("Exception occurred: {}", err.getMessage());
                semaphore.release();
            }

            @Override
            public void onComplete() {
                logger.info("Completed");
                semaphore.release();
            }
        });

        semaphore.acquire();

        return fullContent.toString();
    }
    private static GenerationParam buildGenerationParam(Message userMsg) {
        return GenerationParam.builder()
                .model("qwen-turbo")
                .messages(Arrays.asList(userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .topP(0.8)
                .incrementalOutput(true)
                .build();
    }

}
@RestController
@RequestMapping("/app")
public class MessageGenerator extends BaseController {

    @Value("${api.key}")
    private String apiKey;
    final Generation gen = new Generation();

    @PostConstruct
    public void test(){
        Constants.apiKey=apiKey;
    }
    //@PostMapping("/generatetext")
//    @GetMapping("/generatetext")
//    public AjaxResult generateResponse(@RequestParam String userContent) {
//        try {
//            //getLoginUser();
//            System.out.println("提问==================");
//            String str = "xxxx," + userContent + ",xxxx";
//            //String response = TYQWUtils.callWithMessage(str); // Adapt Main.callWithMessage method
//            String response = TYQWUtils.streamCallWithCallback(gen,Message.builder().role(Role.USER.getValue()).content(str).build());
//            System.out.println(response);
//            return success((Object)response);
//        } catch (ApiException | NoApiKeyException | InputRequiredException | InterruptedException e) {
//            //return ResponseEntity.internalServerError().body("An error occurred: " + e.getMessage());
//            return success((Object)"AI出了点小问题,请重新开始你的提问");
//        }
//    }
    private static void handleGenerationResult(GenerationResult message, StringBuilder fullContent) {
        fullContent.append(message.getOutput().getChoices().get(0).getMessage().getContent());
        System.out.println("Received message: " + JsonUtils.toJson(message));
    }

    // 以流的方式调用
    public static Flux<String> streamCallWithCallback(Generation gen, Message userMsg) throws NoApiKeyException, ApiException, InputRequiredException {
        GenerationParam param = buildGenerationParam(userMsg);
        StringBuilder fullContent = new StringBuilder();

        return Flux.create(sink -> {
            try {
                gen.streamCall(param, new ResultCallback<GenerationResult>() {
                    @Override
                    public void onEvent(GenerationResult message) {
                        handleGenerationResult(message, fullContent);
                        sink.next(message.getOutput().getChoices().get(0).getMessage().getContent());
                    }

                    @Override
                    public void onError(Exception err) {
                        System.err.println("Exception occurred: " + err.getMessage());
                        sink.error(err);
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("Completed");
                        sink.complete();
                    }
                });
            } catch (NoApiKeyException e) {
                e.printStackTrace();
            } catch (InputRequiredException e) {
                e.printStackTrace();
            }
        });
    }

    private static GenerationParam buildGenerationParam(Message userMsg) {
        return GenerationParam.builder()
                .model("qwen-turbo")
                .messages(Arrays.asList(userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .topP(0.8)
                .incrementalOutput(true)
                .build();
    }

    @GetMapping(value = "/generatetext",produces = "text/html;charset=UTF-8")
    public Flux<String> generateResponse(@RequestParam String userContent) {
        try {
            getLoginUser();
            String str = "xxxx," + userContent + ",xxxx";
            return streamCallWithCallback(gen, Message.builder().role(Role.USER.getValue()).content(str).build());
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            return Flux.just("AI出了点小问题,请重新开始你的提问");
        }
    }
}
<!--通义千问SDK-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <version>2.13.0</version>
        </dependency>

相关推荐

  1. golang调用阿里的接口

    2024-06-17 11:26:02       30 阅读
  2. 测试

    2024-06-17 11:26:02       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 11:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 11:26:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 11:26:02       82 阅读
  4. Python语言-面向对象

    2024-06-17 11:26:02       91 阅读

热门阅读

  1. jenkins docker配置方法

    2024-06-17 11:26:02       31 阅读
  2. qt c++ 子界面调用主窗口函数

    2024-06-17 11:26:02       29 阅读
  3. 为什么程序员老喜欢买云服务器?

    2024-06-17 11:26:02       32 阅读
  4. 只出现一次的数字 - LeetCode 热题 96

    2024-06-17 11:26:02       28 阅读
  5. Redisson实现分布式锁

    2024-06-17 11:26:02       30 阅读
  6. django学习入门系列之第二点《案例1:用户注册》

    2024-06-17 11:26:02       30 阅读
  7. 指令选择原理与实现方式

    2024-06-17 11:26:02       36 阅读