SpringAI + 智谱

春哥的魔法书 2024-08-28 16:01:03 阅读 58

1.智谱AI

网站 : https://bigmodel.cn/overview 智谱AI开放平台 (bigmodel.cn)

1.1.介绍

智谱 AI 是一家中国的人工智能公司,成立于 2019 年 6 月,总部位于北京。公司致力于打造认知智能大模型,专注于做大模型的中国创新。

智谱 AI 具有以下特点和优势:

全链路自主可控:实现了大模型生成 AI 的全链路自主可控,自研了具有完全知识产权的预训练框架 GLM,并自建训练平台。强大的技术实力:2022 年合作研发了中英双语千亿级超大规模预训练模型 GLM-130B,在斯坦福大学大模型中心的评测中表现优异。多样化的产品矩阵:拥有包括 AI 提效助手智谱清言、高效率代码模型 CodeGeeX、多模态理解模型 CogVLm 和文生图模型 CogView 等在内的 AIGC 模型及产品矩阵。广泛的应用场景:通过认知大模型链接物理世界的亿级用户,为千行百业带来持续创新与变革。开源开放:开源了部分模型,如 GLM-130B、CodeGeeX 等,促进了技术的共享和发展。

以下是一些关于智谱 AI 的最新动态:

2024 年 1 月,智谱 AI 举办首届技术开放日,发布了新一代基座大模型 GLM-4。2024 年 7 月,智谱 AI 开源视频理解模型 CogVLM2-Video。

总的来说,智谱 AI 在人工智能领域具有一定的技术实力和影响力,其产品和技术在自然语言处理、计算机视觉等领域有着广泛的应用前景。

已经与 Spring AI 进行整合

1.2.获取API-KEY

注册智谱账号可以获取

查看位置 : https://bigmodel.cn/usercenter/apikeys 智谱AI开放平台 (bigmodel.cn)

1.3.项目依赖

创建 SpringBoot 项目中 选择 SpringWeb , AI

在pom.xml文件中增加

<code> <dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId>

</dependency>

1.4.配置

spring:

application:

name: zhipuai

ai:

zhipuai:

api-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

base-url: https://open.bigmodel.cn/api/paas

server:

port: 9090

2.ZhiPuAiChatModel 对话

https://docs.spring.io/spring-ai/reference/api/chat/zhipuai-chat.html ZhiPu AI Chat :: Spring AI Reference

2.1.对话

controller 类

import org.springframework.ai.chat.messages.UserMessage;

import org.springframework.ai.chat.model.ChatResponse;

import org.springframework.ai.chat.prompt.Prompt;

import org.springframework.ai.chat.prompt.PromptTemplate;

import org.springframework.ai.zhipuai.ZhiPuAiChatModel;

import org.springframework.ai.zhipuai.ZhiPuAiChatOptions;

import org.springframework.ai.zhipuai.api.ZhiPuAiApi;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController

public class ZhiPuChatController {

@Autowired

private ZhiPuAiChatModel chatModel;

/**

* 模型调用 : 最简

* @param message

* @return

*/

@GetMapping("/zp/generate")

public Map generate(@RequestParam(value = "message", defaultValue = "中国的首都是哪里") String message) {

return Map.of("generation", chatModel.call(message));

}

/**

* 模型调用 prompt 设置对话属性

* @param message

* @return

*/

@GetMapping("/zp/generatePrompt")

public Map generatePrompt(@RequestParam(value = "message", defaultValue = "中国的首都是哪里") String message) {

Prompt prompt = new Prompt(

message ,

ZhiPuAiChatOptions.builder()

.withModel(ZhiPuAiApi.ChatModel.GLM_4.getValue())

.withTemperature(0.5f)

.withUser("用户id")

.build()

);

String content = chatModel.call(prompt).getResult().getOutput().getContent();

return Map.of("generation", content );

}

/**

* 模型调用 prompt 使用对话模板

* @param message

* @return

*/

@GetMapping("/zp/generateMessage")

public Map generateMessage(@RequestParam(value = "message", defaultValue = "中国") String message) {

PromptTemplate promptTemplate = new PromptTemplate( "{message}的首都是哪里?." , Map.of("message", message ));

Prompt prompt = promptTemplate.create();

String content = chatModel.call(prompt).getResult().getOutput().getContent();

return Map.of("generation", content );

}

}

2.2.流式输出

Spring AI中流式对话接口采用的是Spring WebFlux异步网络框架实现的.

2.2.1.controller

import org.springframework.ai.chat.messages.UserMessage;

import org.springframework.ai.chat.model.ChatResponse;

import org.springframework.ai.chat.prompt.Prompt;

import org.springframework.ai.zhipuai.ZhiPuAiChatModel;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import reactor.core.publisher.Flux;

@RestController

public class ZhiPuChatController {

@Autowired

private ZhiPuAiChatModel chatModel;

/**

* 模型调用 stream 流式输出

* @param message

* @return

*/

@GetMapping(value = "/zp/generateStream", produces = "text/event-stream" )

public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "糖醋排骨怎么做") String message) {

var prompt = new Prompt(new UserMessage(message));

return chatModel.stream(prompt);

}

}

2.2.2.前端页面

<!DOCTYPE html>

<html lang="en">code>

<head>

<meta charset="UTF-8">code>

<title>Title</title>

</head>

<body>

<a href="index.html">返回</a> <br>code>

<div id="chat"></div>code>

<hr>

<textarea id="msg">如何玩五子棋</textarea>code>

<button id="btn" onclick="send()">发送</button>code>

</body>

<script>

function send() {

let msg = document.getElementById('msg').value;

var source = new EventSource("http://localhost:9090/zp/generateStream?message=" + msg);

source.onmessage = function(event) {

let innerText = document.getElementById('chat').innerText;

document.getElementById('chat').innerText = innerText + JSON.parse(event.data).result.output.content;

};

}

</script>

</html>

这是一个简单的例子 更多的异常处理等需要进一步完善

3.ZhiPuAiImageModel

https://docs.spring.io/spring-ai/reference/api/image/zhipuai-image.html ZhiPuAI Image Generation :: Spring AI Reference

import org.springframework.ai.image.ImagePrompt;

import org.springframework.ai.image.ImageResponse;

import org.springframework.ai.zhipuai.ZhiPuAiImageModel;

import org.springframework.ai.zhipuai.ZhiPuAiImageOptions;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class ZhiPuImageController {

@Autowired

private ZhiPuAiImageModel zhiPuAiImageModel;

@GetMapping("/zp/image")code>

public String generate(@RequestParam(value = "message", defaultValue = "画一幅向日葵的图片") String message) {

ImageResponse response = zhiPuAiImageModel.call(

new ImagePrompt(

message,

ZhiPuAiImageOptions.builder()

.withModel("cogview-3")

.build())

);

return response.getResult().getOutput().getUrl();

}

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。