java也能结合Ai? | springboot集成chatGLM

什么是GLM:

GLM 全名 General Language Model ,是一款基于自回归填空的预训练语言模型。ChatGLM 系列模型,支持相对复杂的自然语言指令,并且能够解决困难的推理类问题。该模型配备了易于使用的 API 接口,允许开发者轻松将其融入各类应用,广泛应用于智能客服、虚拟主播、聊天机器人等诸多领域。

SDK 安装说明

安装 Java SDK

Java SDK 地址: https://github.com/zhipuai/zhipuai-sdk-java-v4

如下方式,将SDK的依赖项加入到Maven项目:

 <dependency>
    <groupId>cn.bigmodel.openapi</groupId>
    <artifactId>oapi-java-sdk</artifactId>
    <version>release-V4-2.0.2</version>
</dependency>

Java SDK 创建 Client

使用 Java SDK 您替换自己的 ApiSecretKey 即可,示例如下:

ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}").build();  

传输层默认使用 okhttpclient,如果需要修改为其他 http client,可以如下指定(注意 apache不支持sse调用):​​​​​​​

ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}")
                  .httpTransport(new ApacheHttpClientTransport())
                  .build();  

SDK 代码示例

同步调用

调用后即可一次性获得最终结果,Java 代码如下:

/**
* 同步调用
*/
private static void testInvoke() {
   List<ChatMessage> messages = new ArrayList<>();
   ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan");
   messages.add(chatMessage);
   String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
   
   ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
           .model(Constants.ModelChatGLM4)
           .stream(Boolean.FALSE)
           .invokeMethod(Constants.invokeMethod)
           .messages(messages)
           .requestId(requestId)
           .build();
   ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
   try {
       System.out.println("model output:" + mapper.writeValueAsString(invokeModelApiResp));
   } catch (JsonProcessingException e) {
       e.printStackTrace();
   }
}

异步调用

调用后会立即返回一个任务 ID,然后用任务ID查询调用结果(根据模型和参数的不同,通常需要等待10-30秒才能得到最终结果)​​​​​​​

/**
* 异步调用
*/
private static String testAsyncInvoke() {
   List<ChatMessage> messages = new ArrayList<>();
   ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan");
   messages.add(chatMessage);
   String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
   
   ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
           .model(Constants.ModelChatGLM4)
           .stream(Boolean.FALSE)
           .invokeMethod(Constants.invokeMethodAsync)
           .messages(messages)
           .requestId(requestId)
           .build();
   ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
   System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));
   return invokeModelApiResp.getData().getTaskId();
}

SSE 调用

调用后可以流式的实时获取到结果直到结束

/**
* sse调用
*/
private static void testSseInvoke() {
   List<ChatMessage> messages = new ArrayList<>();
   ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan");
   messages.add(chatMessage);
   String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
   ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
           .model(Constants.ModelChatGLM4)
           .stream(Boolean.TRUE)
           .messages(messages)
           .requestId(requestId)
           .build();
   ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest);
   if (sseModelApiResp.isSuccess()) {
       AtomicBoolean isFirst = new AtomicBoolean(true);
       ChatMessageAccumulator chatMessageAccumulator = mapStreamToAccumulator(sseModelApiResp.getFlowable())
               .doOnNext(accumulator -> {
                   {
                       if (isFirst.getAndSet(false)) {
                           System.out.print("Response: ");
                       }
                       if (accumulator.getDelta() != null && accumulator.getDelta().getTool_calls() != null) {
                           String jsonString = mapper.writeValueAsString(accumulator.getDelta().getTool_calls());
                           System.out.println("tool_calls: " + jsonString);
                       }
                       if (accumulator.getDelta() != null && accumulator.getDelta().getContent() != null) {
                           System.out.print(accumulator.getDelta().getContent());
                       }
                   }
               })
               .doOnComplete(System.out::println)
               .lastElement()
               .blockingGet();
       Choice choice = new Choice(chatMessageAccumulator.getChoice().getFinishReason(), 0L, chatMessageAccumulator.getDelta());
       List<Choice> choices = new ArrayList<>();
       choices.add(choice);
       ModelData data = new ModelData();
       data.setChoices(choices);
       data.setUsage(chatMessageAccumulator.getUsage());
       data.setId(chatMessageAccumulator.getId());
       data.setCreated(chatMessageAccumulator.getCreated());
       data.setRequestId(chatCompletionRequest.getRequestId());
       sseModelApiResp.setFlowable(null);
       sseModelApiResp.setData(data);
   }
   System.out.println("model output:" + JSON.toJSONString(sseModelApiResp));
}

​​​​​​​

springboot整合chatGLM

智谱清言Controller类

    @GetMapping("/chatTo")
    public ResponseEntity<String> chatTo(@RequestParam String message) {
        System.out.println("Message: " + message);
        String response = openAiService.generateTo(message);
        System.out.println(response);
        return ResponseEntity.ok(response);
    }

智谱清言实现类

@Service
@Slf4j
public class OpenAiServiceImpl implements OpenAiService {
//    private static final String API_KEY = "vv";
//
//    private static final String API_SECRET = "vv";
//
//    private static final ClientV4 client = new ClientV4.Builder(API_KEY,API_SECRET).build();
    private static final ClientV4 client = new ClientV4.Builder("vv.vv").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;
    }
    @Override
    public String generate(String message) {
//        log.info("启动了 message: " + message);
//         message="作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan";
        ClientV4 client = new ClientV4.Builder("vv.vv").build();
//        ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}")
//                .httpTransport(new ApacheHttpClientTransport())
//                .build();
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), message);
        messages.add(chatMessage);
        String requestIdTemplate= "requestId_%d";
        String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.FALSE)
                .invokeMethod(Constants.invokeMethodAsync)
                .messages(messages)
                .requestId(requestId)
                .build();
        ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
        System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));
        String taskId = invokeModelApiResp.getData().getTaskId();
        System.out.println(taskId);
//        String taskId = "62917222702082628875821015691843644"; // 从之前的响应中获得的taskId
        String apiKey = "vv.vv"; // 替换为你的API密钥
        String apiUrl = "https://api.zhipu.ai/v4/queryTaskResult"; // 替换为实际的API查询URL
        StringBuilder response = null;
        try {
            // 构建查询URL
            URL url = new URL(apiUrl + "?taskId=" + taskId);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设置请求头,包括API密钥
            connection.setRequestProperty("Authorization", "Bearer " + apiKey);
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setRequestMethod("GET");
            // 发送请求并获取响应
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            // 读取响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            // 打印结果
            System.out.println("Response: " + response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response.toString();
    }
    @Override
    public String generateTo(String message) {
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), message);
        messages.add(chatMessage);
        String requestIdTemplate= "requestId_%d";// 请求ID模板
        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 {
            System.out.println("model output:" + mapper.writeValueAsString(invokeModelApiResp));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return invokeModelApiResp.getData().toString();
    }
}

仅供参考

Service

public interface OpenAiService {
    String generate(String message);
    String generateTo(String message);
}

启动类

@SpringBootApplication
@Slf4j
@EnableTransactionManagement //开启注解方式的事务管理
@ServletComponentScan //开启了对servlet组件的支持
public class xxxxxxxxApplication {
    public static void main(String[] args) {
        SpringApplication.run(xxxxxApplication.class, args);
        log.info("server started");
    }
}

END

文字丨代码星辰阁

图片丨代码星辰阁

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值