java 千帆大模型 流式返回

本文介绍了如何在SpringBoot应用中使用Java实现与QianFanAPI的流式聊天接口,涉及获取token、构建请求以及处理响应流。还提及了如何在部署时调整NGINX配置以支持流式响应。
摘要由CSDN通过智能技术生成

聊天有两个接口,第一个是获取token, 第二个是聊天接口,具体参照官方文档

下面是流式调用聊天接口,单次的,不含上下文

    @Value("${qianfan.apiKey}")
    private String apiKey;

    @Value("${qianfan.secretKey}")
    private String secretKey;

    @Value("${qianfan.tokenUrl}")
    private String tokenUrl;

    @Value("${qianfan.chatUrl}")
    private String chatUrl;
   
 private final OkHttpClient client = new OkHttpClient();
    private static final String ACCESS_TOKEN_PRE = "?access_token=";

 @SneakyThrows
   public Flux<String> getAnswer(Message message, String token) {
        RequestMessage requestBody = new RequestMessage();
        requestBody.addMessage(message);
        String jsonStr = JSON.toJSONString(requestBody);
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, jsonStr);
        Request request = new Request.Builder()
                .url(chatUrl + ACCESS_TOKEN_PRE + token)
                .addHeader("Content-Type", "application/json")
                .method("POST", body)
                .build();
        Response response = client.newCall(request).execute();
        ResponseBody responseBody = response.body();
        if (responseBody != null) {
            BufferedReader reader = new BufferedReader(responseBody.charStream());
            return Flux.<String>generate(sink -> { // 流式响应式接口
                try {
                    String line = reader.readLine();
                    if (null != line) {
                        line = line.replace("data: ", "");
                        JSONObject json = JSON.parseObject(line);
                        if (null != json && StringUtils.isNotBlank((String) json.get("result"))) {
                            sink.next((String) json.get("result")); // 返回答案
                            if ((Boolean) json.get("is_end")) {
                              
                                sink.complete(); // 结束响应
                            }
                        } else if (null != json && (Boolean) json.get("is_end")) {
  
                            sink.complete(); // 结束响应
                        } else {
                            sink.next("\u200B"); // 返回空白字符
                        }
                    }
                } catch (IOException e) {
                    sink.error(e);
                }
            }).doFinally(signalType -> {
                try {
                    reader.close();
                    responseBody.close();
                } catch (IOException e) {
                    // handle exception
                }
            });
        }
        return Flux.empty();
    }

对应controller

   @GetMapping(value = "/chat", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    @CrossOrigin(origins = "*")
    public Flux<String> chat(@Valid Message vo){
        return xxxService.chat(vo);
    }

入参

@Data

@AllArgsConstructor
@NoArgsConstructor
public class Message {
    /**
     * 用户角色
     * 目前支持:
     * user 用户
     * assistant 对话助手
     */
    @ApiModelProperty(value = "用户角色", example = "user",hidden = true)
    private String role = "user";



    /**
     * 对话内容。
     */
    @ApiModelProperty(value = "对话内容")
    @NotBlank(message = "对话内容不能为空")
    private String content;

}
@Data
public class RequestMessage {
    /**
     * 聊天上下文
     */
    List<Message> messages = new ArrayList<>();

    /**
     * 范围(0~1.0]
     * 较高的数值会使输出更加随机
     */
    float temperature = Float.parseFloat("0.95");

    /**
     * 影响文本的多样性,取值越大生成的文本多样性越强
     * 建议该参数与temperature只设置一个。建议top_p和temperature不要同时更改
     */
    float top_p = Float.parseFloat("0.8");

    /**
     * 通过对已生成的token增加惩罚,减少重复生成的现象
     * 值越大,惩罚越大
     * 取值范围[1,2]
     */
    float penalty_score = Float.parseFloat("1.0");

    /**
     * 是否以流式接口形式返回数据
     */
    boolean stream = true;

    /**
     * 模型人设
     */
    String system = null;

    /**
     * 表示用户唯一标识符,用于监测和检测滥用行为。防止接口恶意调用。
     */
    String user_id = "";

    public void addMessage(Message message){
        this.messages.add(message);
    }
}

部署服务器后,不是流式响应的话,需要在NGINX的配置文件中加上:

proxy_buffering off;

http {
    include       mime.types;
    default_type  application/octet-stream;
    proxy_buffering off;
    client_max_body_size 5000M;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                 '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for" "$server_protocol"';

然后重启NGINX即可!

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于文心千帆模型的图像风格迁移是一种图像处理技术,它能够将一张图片的原本图像风格转换成另一种图像风格。这个过程通常涉及到对输入图像进行特征提取和风格映射,然后将提取的特征与目标风格进行融合,生成新的图像。 文心千帆模型是一种大规模预训练模型,它能够处理大规模的文本数据和图像数据,并从中学习到各种语言和视觉知识。在图像风格迁移方面,文心千帆模型可以利用其强大的特征提取和表示学习能力,将一张图片的像素特征转换成另一种风格的像素特征,从而实现图像风格迁移。 具体来说,文心千帆模型可以通过以下步骤来实现图像风格迁移: 1. 输入一张待迁移风格的图片,模型会对图片进行特征提取,生成像素级别的特征表示。 2. 模型会使用深度学习算法,如卷积神经网络(CNN)或transformer,对提取的特征进行建模,学习到不同风格之间的映射关系。 3. 模型会将提取的特征与目标风格的特征进行融合,生成新的像素级别的特征表示。这个过程涉及到像素级别的颜色替换、纹理调整等操作,从而实现图像风格迁移。 4. 最后,模型会将生成的新的像素级别的特征表示输出为迁移后的图像。 基于文心千帆模型的图像风格迁移技术具有以下优点: 1. 效果好:文心千帆模型能够学习到不同风格之间的映射关系,生成的迁移后的图像能够很好地保持原图的细节和色彩,同时呈现出目标风格的特点。 2. 速度快:文心千帆模型是一种大规模预训练模型,具有很高的计算效率和速度,能够快速地处理大规模的图像数据。 3. 可定制:文心千帆模型可以根据不同的需求,定制不同的风格迁移算法和参数设置,从而实现更加精细化的图像处理效果。 总之,基于文心千帆模型的图像风格迁移技术是一种高效、精确、可定制的图像处理技术,可以广泛应用于图像编辑、艺术创作、视频处理等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值