关于springboot对接chatglm3-6b大模型的尝试

之前我们通过阿里提供的cloud ai对接了通义千问。cloud ai对接通义千问
那么接下来我们尝试一些别的模型看一下,其实这个文章主要是表达一种对接方式,其他的都大同小异。都可以依此方法进行处理。

一、明确模型参数

本次我们对接的理论支持来自于阿里云提供的文档。阿里云大3-6b模型文档
我们看到他其实支持多种调用方式,包括sdk和http,我本人是不喜欢sdk的,因为会有冲突或者版本之类的问题,不如直接调用三方,把问题都扔到三方侧。所以我们这里来展示一下使用http的调用方式。
而且大模型的chat一般都是流式的,非流式的没啥技术含量而且效果很low。所以我们直接参考这部分内容即可,
在这里插入图片描述
我们看到他们的服务端其实是支持SSE的推流方式的,具体SSE是啥可以自行百度。
而流式和非流式的区别就在于请求参数的设置。如果你配置了,那大模型端就会给你按照流式响应。
在这里插入图片描述
在有了以上理论支持之后,我们就来测试一下。

二、代码接入

我们看到他的示例请求参数为:

curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <YOUR-DASHSCOPE-API-KEY>' \  # 这里写你的appkey
--header 'Content-Type: application/json' \
--header 'X-DashScope-SSE: enable' \   # 开启流式
--data '{
   
   
    "model": "chatglm3-6b", # 模型名字
    "input":{
   
   
        "messages":[      
       
            {
   
   
                "role": "user",
                "content": "你好,请介绍一下故宫"
            }
        ]
    },
    "parameters": {
   
   
        "result_format": "message"
    }
}'

所以我们可以找到关键点就在以上三处,至于如何申请appkey,可以参考官方。
那么我们接下来就使用okhttp这种支持事件响应的来对接流式的输出。

1、编写返回内容反序列化类

首先我们先来处理返回格式,我决定用一个java类来接受,具体你觉得不灵活可以直接用Json,怎么弄都行。
我们来看一下官网的响应示例格式。

{
   
   "output":{
   
   "choices":[{
   
   "message":{
   
   "content":"\n 故宫是中国北京市中心的一座明清两代的皇宫,现已成为博物馆。故宫是中国最具代表性的古建筑之一,也是世界文化遗产之一,以其丰富的文化遗产和精美的建筑艺术而闻名于世界。故宫占地面积达72万平方米,拥有9000多间房屋和70多座建筑,由大小湖泊、宫殿、花园和殿堂组成,是中国古代宫殿建筑之精华。","role":"assistant"},"finish_reason":"stop"}]},"usage":{
   
   "total_tokens":105,"input_tokens":24,"output_tokens":81},"request_id":"9d970376-4ba3-98b8-8387-f95702280341"}

我们看到他是个字符串,然后在流式的最后一句他的finish_reason的值是stop,这时候我们就可以结束推流。
OK,我们就来接收一下。

import lombok.Data;

@Data
public class Chatglm36bResponse {
   
   
    private Output output;
    private Usage usage;
    private String requestId;

    @Data
    public static class Output {
   
   
        private Choice[] choices;

        @Data
        public static class Choice {
   
   
            private Message message;
            private String finishReason;


            @Data
            public static class Message {
   
   
                private String content;
                private String role;
            }
        }
    }

    @Data
    public static class Usage {
   
   
        private int totalTokens;
        private int inputTokens;
        private int outputTokens;
    }
}

2、编写event事件监听器


import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Response;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;

import java.io.IOException;

@EqualsAndHashCode(callSuper = true)
@Data
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class ChatEventSourceListener extends EventSourceListener {
   
   

    private String clientId;

    @Override
    public void onOpen(EventSource eventSource, Response response) {
   
   
        log.info("ChatEventSourceListener onOpen invoke");
        super.onOpen(eventSource, response);
    }

    @Override
    public void onEvent(EventSource eventSource, String id, String type, String data) {
   
   
        log.info("ChatEventSourceListener onEvent invoke");
        Chatglm36bResponse chatglm36bResponse = JSONObject.parseObject(data, Chatglm36bResponse.class);
        Chatglm36bResponse.Output output = chatglm36bResponse.getOutput();
        Chatglm36bResponse.Output.Choice[] choices = output.getChoices();
        for (Chatglm36bResponse.Output.Choice choice : choices) {
   
   
            String finishReason = choice.getFinishReason();
            String content = choice.getMessage().getContent();
            log.</
### 阿里云 ChatGLM-6B 模型微调后的用途及下一步操作 微调后的阿里云 ChatGLM-6B 模型可以应用于多种场景,具体取决于业务需求和应用场景。以下是一些常见的用途及下一步操作: #### 1. **模型部署** 微调后的模型可以通过不同的方式部署以供实际使用。根据引用内容[^1],ChatGLM3 提供了三种主要的部署方式:命令行 Demo、网页版 Demo 和 API 部署。 - **命令行 Demo**:适用于简单的测试或本地环境下的快速验证。用户可以通过修改 `cli_demo.py` 文件中的模型路径 `MODEL_PATH` 来加载微调后的模型。 - **网页版 Demo**:适用于需要通过浏览器与模型交互的场景。在 `web_demo.py` 中修改模型路径后,启动服务即可提供网页界面访问。 - **API 部署**:适用于将模型集成到更大的系统中。通过修改 `openai_api.py` 文件中的模型路径,并配置相应的 API 接口,可以实现与其他应用的无缝对接。 #### 2. **任务定制化** 微调后的 ChatGLM-6B 模型可以根据特定任务进一步优化。例如: - **文本生成**:用于撰写文章、生成摘要、创作诗歌等。 - **对话系统**:构建智能客服、虚拟助手等应用。 - **情感分析**:对用户输入进行情感分类,帮助理解用户情绪。 - **信息检索**:结合搜索引擎技术,为用户提供更精准的信息查询服务。 #### 3. **性能优化** 为了提高模型的运行效率,可以考虑以下优化措施: - **量化压缩**:通过 INT8 或 INT4 量化减少模型大小和推理时间,同时降低硬件资源消耗[^2]。 - **分布式推理**:利用多 GPU 或多节点架构加速推理过程,尤其适合大规模在线服务。 - **缓存机制**:对于重复性高的请求,可以引入缓存策略以减少计算开销。 #### 4. **持续迭代** 微调并非一次性完成的工作,而是需要根据实际反馈不断调整和改进。以下是几个关键步骤: - **数据收集**:从真实应用场景中获取更多样化的数据,用于后续训练。 - **效果评估**:通过指标如 BLEU、ROUGE 等评估模型生成质量,并结合用户反馈进行主观评价。 - **再训练**:基于新数据重新训练模型,进一步提升其泛化能力和表现。 ```python # 示例代码:加载微调后的模型并进行推理 import torch from transformers import AutoTokenizer, AutoModelForCausalLM # 加载 tokenizer 和微调后的模型 tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/chatglm3-6b") model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/chatglm3-6b") # 输入文本 input_text = "请介绍一下你的功能" inputs = tokenizer(input_text, return_tensors="pt") # 生成输出 with torch.no_grad(): outputs = model.generate(**inputs, max_length=50) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值