首页 > 其他分享 >Springboot --- 使用国内的 AI 大模型 对话

Springboot --- 使用国内的 AI 大模型 对话

时间:2024-10-12 14:34:51浏览次数:1  
标签:content Springboot service AI --- new import com String

  • 实在是不知道标题写什么了 可以在评论区给个建议哈哈哈哈 先用这个作为标题吧

尝试使用 国内给出的 AI 大模型做出一个 可以和 AI 对话的 网站出来

    <dependency>
        <groupId>cn.bigmodel.openapi</groupId>
        <artifactId>oapi-java-sdk</artifactId>
        <version>release-V4-2.0.0</version>
    </dependency>
  • 使用 普通的 java -- Maven项目 只能在控制台 查看结果 也就是 说没有办法在其他平台 使
    用 制作出来的 AI ChatRobot
  • 思来想去 不如 将这个东西写成 QQ 机器人
  • 但是因为我找到的 那个 不更新了 或者 腾讯不支持了 让我放弃了 写成 QQ 机器人的想法
  • 于是我就尝试将这个写成一个本地的 AI 对话机器人 但是 在翻看 官方给出的 Demo 我偶然发现了一个方法 他的 输出似乎是一个 json 转换成的 String
  • 这个方法并没有将这个String 返回出来 而是 直接在控制台打印
package com.codervibe.utils;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.image.CreateImageRequest;
import com.zhipu.oapi.service.v4.image.ImageApiResponse;
import com.zhipu.oapi.service.v4.model.*;
import io.reactivex.Flowable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

public class ChatAPIUtils {
    private static final String API_KEY = "cb11ad7f3b68ce03ed9be6e13573aa19";

    private static final String API_SECRET = "nG7UQrrXqsXtqD1S";

    private static final ClientV4 client = new ClientV4.Builder(API_KEY, API_SECRET).build();

    private static final ObjectMapper mapper = defaultObjectMapper();


    public static ObjectMapper defaultObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        mapper.addMixIn(ChatFunction.class, ChatFunctionMixIn.class);
        mapper.addMixIn(ChatCompletionRequest.class, ChatCompletionRequestMixIn.class);
        mapper.addMixIn(ChatFunctionCall.class, ChatFunctionCallMixIn.class);
        return mapper;
    }

    // 请自定义自己的业务id
    private static final String requestIdTemplate = "mycompany-%d";



    /**
     * 同步调用
     */
    public static String InvokeApi(String content) throws JsonProcessingException {
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), content);
        messages.add(chatMessage);
        String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
        // 函数调用参数构建部分
        List<ChatTool> chatToolList = new ArrayList<>();
        ChatTool chatTool = new ChatTool();
        chatTool.setType(ChatToolType.FUNCTION.value());
        ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
        chatFunctionParameters.setType("object");
        Map<String, Object> properties = new HashMap<>();
        properties.put("location", new HashMap<String, Object>() {{
            put("type", "string");
            put("description", "城市,如:北京");
        }});
        properties.put("unit", new HashMap<String, Object>() {{
            put("type", "string");
            put("enum", new ArrayList<String>() {{
                add("celsius");
                add("fahrenheit");
            }});
        }});
        chatFunctionParameters.setProperties(properties);
        ChatFunction chatFunction = ChatFunction.builder()
                .name("get_weather")
                .description("Get the current weather of a location")
                .parameters(chatFunctionParameters)
                .build();
        chatTool.setFunction(chatFunction);
        chatToolList.add(chatTool);
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.FALSE)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .requestId(requestId)
                .tools(chatToolList)
                .toolChoice("auto")
                .build();
        ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
        try {
        // 这里返回出去是一个 json 
            return mapper.writeValueAsString(invokeModelApiResp);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return mapper.writeValueAsString(new ModelApiResponse());
    }

    public static void CreateImage(String content) {
        CreateImageRequest createImageRequest = new CreateImageRequest();
        createImageRequest.setModel(Constants.ModelCogView);
        createImageRequest.setPrompt(content);
        ImageApiResponse imageApiResponse = client.createImage(createImageRequest);
        System.out.println("imageApiResponse:" + JSON.toJSONString(imageApiResponse));
    }

}

  • 工具类中 InvokeApi 方法 最后获得的是一个 ModelApiResponse类 这个类有点类似于 统一返回类型 但是我在这里 只需要里面的具体方法 请求状态和 信息 并不需要 (有另外一个统一返回类型定义 ) 所以在 后面我将这个方法 修改 改为 将我需要的数据返回给controller
  • 实际上这是不应该直接返回给 controller 的 而是 应该 通过 service 的 因为service中才是真正的业务代码
  • 修改后的方法 代码如下
    /**
     * 同步调用
     */
    public static ModelData InvokeApi(String content) throwsJsonProcessingException{
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), content);
        messages.add(chatMessage);
        String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
        // 函数调用参数构建部分
        List<ChatTool> chatToolList = new ArrayList<>();
        ChatTool chatTool = new ChatTool();
        chatTool.setType(ChatToolType.FUNCTION.value());
        ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
        chatFunctionParameters.setType("object");
        Map<String, Object> properties = new HashMap<>();
        properties.put("location", new HashMap<String, Object>() {{
            put("type", "string");
            put("description", "城市,如:北京");
        }});
        properties.put("unit", new HashMap<String, Object>() {{
            put("type", "string");
            put("enum", new ArrayList<String>() {{
                add("celsius");
                add("fahrenheit");
            }});
        }});
        chatFunctionParameters.setProperties(properties);
        ChatFunction chatFunction = ChatFunction.builder()
                .name("get_weather")
                .description("Get the current weather of a location")
                .parameters(chatFunctionParameters)
                .build();
        chatTool.setFunction(chatFunction);
        chatToolList.add(chatTool);
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.FALSE)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .requestId(requestId)
                .tools(chatToolList)
                .toolChoice("auto")
                .build();
        ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
        ModelData data = invokeModelApiResp.getData();
        return data;
  • 而这里的信息实际上是一层层 抽丝剥茧 剥离出来的
    List<Choice> choices = data.getChoices();
    System.out.println("choices.toString() = " + choices.toString());
    for (Choice choice : choices) {
        ChatMessage message = choice.getMessage();
        System.out.println("message.getContent() = " + message.getContent());
        //本来这里想返回具体的信息类但是发现 上面的的那个ModelApiResponse类 也是一个 统一返回类型 也包含这 请求状态码 之类的定义
        return message;
    }
    return new ChatMessage();
    try {
        return mapper.writeValueAsString(invokeModelApiResp);
    } catch (JsonProcessingException e) {
            e.printStackTrace();
    }
    return mapper.writeValueAsString(new ModelApiResponse());    
  • 可以看到我的这段代码 有多个 return 所以这实际上是一段假 代码
  • 每一个return 实际上官方都 对应的 model 或者说 resoponse
  • controller 代码
    @PostMapping("/chat")
    public R chat(@RequestParam("content") String content) throws JsonProcessingException {
        /**
         * data 中的 choices 是一个 List<Choice> 类型但是实际上只有一个所以索性直接获取数组下标0的对象
         */
        logger.info(ChatAPIUtils.InvokeApi(content).getChoices().get(0).getMessage().getContent().toString());
        return R.ok().data("content", ChatAPIUtils.InvokeApi(content));
    }
  • 修改 由 service 层 调用 工具类
  • service 代码
  • service 接口
package com.codervibe.server.service;

import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.ModelData;

public interface ChatService {
    /**
     * AI 对话
     */
    ModelData AIdialogue(String content);

    /**
     * AI  画图
     */
    ImageResult AIcreateimage(String content);
}
  • service 接口实现

package com.codervibe.server.Impl;

import com.codervibe.server.service.ChatService;
import com.codervibe.utils.ChatAPIUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.ModelData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service("chatService")
public class ChatServiceImpl implements ChatService {
    Logger logger = LoggerFactory.getLogger(ChatServiceImpl.class);
    /**
     * AI 对话
     * @param content
     */
    @Override
    public ModelData AIdialogue(String content) {
        logger.info(ChatAPIUtils.InvokeApi(content).getChoices().get(0).getMessage().getContent().toString());
        return ChatAPIUtils.InvokeApi(content);
    }

    /**
     * AI  画图
     *
     * @param content
     */
    @Override
    public ImageResult AIcreateimage(String content) {
        logger.info(ChatAPIUtils.CreateImage(content).getData().get(0).getUrl());
        return ChatAPIUtils.CreateImage(content);
    }
}

  • controller 层调用 service
****package com.codervibe.web.controller;

import com.codervibe.server.service.ChatService;
import com.codervibe.utils.ChatAPIUtils;
import com.codervibe.web.common.response.R;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;

@RestController
@RequestMapping("/chat")
public class ChatController {
    Logger logger = LoggerFactory.getLogger(ChatController.class);
    @Resource
    private ChatService chatService;
    @PostMapping("/content")
    public R chat(@RequestParam("content") String content) {
        return R.ok().data("content", chatService.AIdialogue(content));
    }
    @PostMapping("/AIcreateimage")
    public R AIcreateimage(@RequestParam("content") String content){
        return R.ok().data("image",chatService.AIcreateimage(content));
    }
}

  • 现在 虽然可以 和 AI 进行对话 但是 数据返回的速度实在是太慢 所以我打算 将 常见的问题和答案 存储在本地的数据库中以提升 数据返回的速度 这只是一个初步的想法
  • 最后的想法 还未实现 先这样
  • 粉丝群 企鹅 179469398

标签:content,Springboot,service,AI,---,new,import,com,String
From: https://www.cnblogs.com/codervibe/p/18460483

相关文章

  • hexo-开源框架-创建博客
    hexo-开源框架-创建博客导语现在随着计算机的飞速发展,拥有一个属于自己的博客,是一件非常平常的事。使用hexo搭建一个属于自己的个人博客,是即快捷又美观的一种方式,也是非常受到人们的喜爱的。hexo介绍Hexo是一款基于Node.js的静态博客框架,依赖少易于安装使用,可以方便的生成......
  • springboot 项目 统一 返回结果 统一 异常
    统一返回结果统一结果返回目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。统一结果的一般形式是否响应成功;响应状态码;状态码描述;响应数据其他标识符统一结果类在项目目录下新建一个common包......
  • Index-1.9B: 哔哩哔哩自主研发的轻量级多语言大模型
    Index-1.9B模型简介Index-1.9B是哔哩哔哩自主研发的一款轻量级多语言大模型系列,包含以下几个版本:Index-1.9Bbase:基础模型,具有19亿非嵌入参数,在2.8T主要为中英文的语料上进行预训练,在多项评测基准上领先同级别模型。Index-1.9Bpure:基础模型的对照版本,参数和训练策略......
  • SkyAGI: 人工智能领域的突破性进展 - 模拟真实人类行为的新技术
    SkyAGI:开启人工智能模拟人类行为的新纪元在人工智能快速发展的今天,一个名为SkyAGI的开源项目正在引起业界的广泛关注。这个基于大型语言模型(LLM)的项目展示了AI在模拟真实人类行为方面的突破性进展,为游戏开发、虚拟助手等领域带来了新的可能性。本文将深入探讨SkyAGI的核心功......
  • ListWise\PairWise\PointWise
    概念:三种不同的排序模型学习(LearningtoRank)设计思路。主要体现在损失函数不同用户的查询query为Q,候选文档集docs为c1~CN,正确的结果排序假设为C1-CK。候选文档集要一般大于最终返回的集合,因此N>K.例如,给出一个提问句子从候选句子(有10个)中选出最佳的5个的答案,返回的列表......
  • 什么是快充协议、支持多协议的USB Type-C受电端取电芯片
    随着快充技术的不断发展,传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间,给我们的生活带来了很多便利。什么是快充协议快充协议是快充技术的核心,现如今市面上已经有很多种快充协议,每家品牌手机都有自己的独有协议,如华为......
  • ‘AI员工’如何在半导体行业中发挥不可代替的应用
    王晨是一家大型电子公司的技术支持工程师,主要负责为客户提供半导体集成电路(IC)的技术支持。每天,他的工作就是解答客户关于IC产品的各种问题,包括产品规格、应用笔记、设计参考和工具使用。最近,公司决定引入“AI员工”来接管部分技术支持工作,提升整体效率。起初,王晨对这一技术持......
  • Midjourney中文版:激发无限创意的AI绘画之旅
    在追求艺术与科技融合的浪潮中,Midjourney中文版应运而生,成为连接创意与现实的桥梁。这款专为国内用户打造的AI绘画工具,旨在打破传统绘画的界限,让每个人都能轻松探索艺术的无限可能。MidjourneyAI超强绘画(原生态系统)用户端:AiLoadinghttps://www.mjdiscord.com项目详细介......
  • 【亲测可用】矢量图形处理软件Adobe Illustrator(AI2024)软件下载安装使用win/mac
    目录AdobeAI软件简介功能特点下载与安装下载:安装步骤:AdobeAI软件简介AdobeAI,全称AdobeIllustrator,是Adobe公司开发的一款专业的矢量图形处理软件。自1987年首次发布以来,AdobeIllustrator已成为行业标准之一,广泛应用于平面设计、UI设计、插画创作、印刷出版、海报......
  • GenossGPT:开源AI模型的统一接口
    GenossGPT:开源AI的革新之路在人工智能快速发展的今天,各种强大的语言模型层出不穷。然而,不同模型间的接口差异给开发者带来了不小的挑战。为了解决这一问题,GenossGPT应运而生。这个开创性的开源项目旨在为各种AI语言模型提供一个统一的API接口,让开发者能够轻松地在应用中集成和切......