培训网站大数据分析,个人网站的色彩设计怎么做,ps怎么做华为网站界面,怎么做网站站长视频作者#xff1a;小傅哥 - 百度搜 小傅哥bugstack 博客#xff1a;bugstack.cn 沉淀、分享、成长#xff0c;让自己和他人都能有所收获#xff01;#x1f604; 大家好#xff0c;我是技术UP主小傅哥。
清华大学计算机系的超大规模训练模型 ChatGLM-130B 使用效果非常牛小傅哥 - 百度搜 小傅哥bugstack 博客bugstack.cn 沉淀、分享、成长让自己和他人都能有所收获 大家好我是技术UP主小傅哥。
清华大学计算机系的超大规模训练模型 ChatGLM-130B 使用效果非常牛所以我也想把这样的Ai能力接入到自己的应用中或者做一些 IntelliJ IDEA Plugin 使用。但经过了一晚上的折腾我决定给它写个对接的SDK开源出来—— 智谱Ai不是已经有了一个SDK吗为啥还要写呢那你写多少了 在很早之前就关注了智谱Ai(ChatGLM)也看到官网有一个Java对接的SDK方式。但从前几天开始正式对接发现这SDK是8月份提交的10个commit而且已经2个月没有更新了。所以真的是不少Bug呀呀呀如果不去修改它的SDK代码就没法对接。如ConfigV3类中拆分ApiKey的操作String[] arrStr apiSecretKey.split(.); 但这里的.是正则的关键字所以根本没法拆分。一起动就报错 invalid apiSecretKey 这对于初次对接并且没有看源码的伙伴来说是不小的炸雷。
不过虽然 SDK 有点赶工不好用。但不影响智谱Ai(ChatGLM)是个好东西。他的官网中有API HTTP 接口对接描述。所以小傅哥决定跟着按照它的文档写一个能简单对接代码有干净整洁的 SDK 让大家使用。 那么接下来小傅哥就介绍下如何基于智谱Ai(ChatGLM)的开发者文档开发一个通用的SDK组件。也让后续有想法PR贡献源码的伙伴一起参与进来。—— 别看东西不大写到简历上也是非常精彩的一笔 本文不止有智谱Ai-SDK开发还有如何在项目中运用SDK开发一个自己的OpenAi服务。文末有SDK链接和OpenAi应用工程。 一、对接鉴权
文档https://open.bigmodel.cn/dev/apiApiKeyhttps://open.bigmodel.cn/usercenter/apikeys - 申请个人授权创建ApiKey即可
智谱Ai的Api文档与ChatGPT对接有一些差
如果大家对接过ChatGPT开发直接获取一个ApiKey就可以使用了。但在对接智谱Ai的Api时需要把获取的ApiKey按照.号分割并需要进行JWT-Token的创建。而这个Token才是实际传给接口的内容。 因为生成Token会比较耗时所以这里会使用Guava框架进行本地缓存29分钟有效期30分钟的Token确保可以有效的刷新。在工程中提供了 BearerTokenUtils Token 生成工具类测试的时候可以使用。
二、接口处理
文档https://open.bigmodel.cn/dev/api#chatglm_lite - 以Api文档的chatglm_lite模型举例对接
传输方式https请求地址https://open.bigmodel.cn/api/paas/v3/model-api/chatglm_lite/sse-invoke调用方式SSE字符编码UTF-8接口请求头accept: text/event-stream接口请求格式JSON响应格式标准 Event Stream接口请求类型POST开发语言任意可发起 HTTP 请求的开发语言
在正式开发代码要把接口的使用先简单测试运行出来。之后再去编写代码。为此这里小傅哥先根据官网的文档和鉴权使用方式编写了 curl http 请求
curl -X POST \-H Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsInNpZ25fdHlwZSI6IlNJR04ifQ.eyJhcGlfa2V5IjoiNGUwODdlNDEzNTMwNmVmNGE2NzZmMGNjZTNjZWU1NjAiLCJleHAiOjE2OTY5OTM5ODIzMTQsInRpbWVzdGFtcCI6MTY5Njk5MjE4MjMxNH0.9nxhRXTJcP4Q_YTQ8w5y0CZOBOu0epP1J56oDaYewQ8 \-H Content-Type: application/json \-H User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) \-H Accept: text/event-stream \-d {top_p: 0.7,sseFormat: data,temperature: 0.9,incremental: true,request_id: xfg-1696992276607,prompt: [{role: user,content: 写个java冒泡排序}]} \http://open.bigmodel.cn/api/paas/v3/model-api/chatglm_lite/sse-invoke注意Authorization: Bearer 后面传的是 JWT Token 不是一个直接从官网复制的 ApiKey - 你可以使用工程中 BearerTokenUtils 创建之后可以直接运行这段脚本(也可以导入到ApiPost工具中)执行后就能获得到运行效果了。—— 速度非常快
三、组件开发
在考虑到抽象和设计原则下小傅哥这里采用了会话模型结构进行工程框架设计。把程序的调用抽象为一次会话而会话的创建则交给工厂。通过工厂屏蔽使用细节在使用上简化调用尽可能让外部最少知道原则。这样的设计实现方式既可以满足调用方开心的使用也可以让SDK贡献者见代码如见文档容易理解和上手。
1. 工程结构 工程非常注重会话的设计和使用因为框架的根基搭建好以后扩展各项功能就会有迹可循。大部分代码就是因为早期没有考虑好框架最后功能来了被填充的很乱。
2. 会话流程 会话流程以工厂创建 Session 为入口点进行使用其他的操作都在组件内自己处理好。
3. 代码举例
Override
public OpenAiSession openSession() {// 1. 日志配置HttpLoggingInterceptor httpLoggingInterceptor new HttpLoggingInterceptor();httpLoggingInterceptor.setLevel(configuration.getLevel());// 2. 开启 Http 客户端OkHttpClient okHttpClient new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).addInterceptor(new OpenAiHTTPInterceptor(configuration)).connectTimeout(configuration.getConnectTimeout(), TimeUnit.SECONDS).writeTimeout(configuration.getWriteTimeout(), TimeUnit.SECONDS).readTimeout(configuration.getReadTimeout(), TimeUnit.SECONDS).build();configuration.setOkHttpClient(okHttpClient);// 3. 创建 API 服务IOpenAiApi openAiApi new Retrofit.Builder().baseUrl(configuration.getApiHost()).client(okHttpClient).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(JacksonConverterFactory.create()).build().create(IOpenAiApi.class);configuration.setOpenAiApi(openAiApi);return new DefaultOpenAiSession(configuration);
}这是一段 DefaultOpenAiSessionFactory 创建工厂开启会话的服务对象。使用方只需要在自己的工程中创建出一个工厂对象就可以对接使用了。下文有代码示例其他更多的代码直接看小傅哥开发好的 chatglm-sdk-java
四、组件使用
1. 组件配置
申请ApiKeyhttps://open.bigmodel.cn/usercenter/apikeys - 注册申请开通即可获得 ApiKey运行环境JDK 1.8maven pom - 暂时测试阶段未推送到Maven中央仓库需要下载代码本地 install 后使用
dependencygroupIdcn.bugstack/groupIdartifactIdchatglm-sdk-java/artifactIdversion1.0-SNAPSHOT/version
/dependency源码(Github)https://github.com/fuzhengwei/chatglm-sdk-java源码(Gitee)https://gitee.com/fustack/chatglm-sdk-java源码(Gitcode)https://gitcode.net/KnowledgePlanet/road-map/chatglm-sdk-java
2. 单元测试
Slf4j
public class ApiTest {private OpenAiSession openAiSession;Beforepublic void test_OpenAiSessionFactory() {// 1. 配置文件Configuration configuration new Configuration();configuration.setApiHost(https://open.bigmodel.cn/);configuration.setApiSecretKey(4e087e4135306ef4a676f0cce3cee560.sgP2*****);// 2. 会话工厂OpenAiSessionFactory factory new DefaultOpenAiSessionFactory(configuration);// 3. 开启会话this.openAiSession factory.openSession();}/*** 流式对话*/Testpublic void test_completions() throws JsonProcessingException, InterruptedException {// 入参模型、请求信息ChatCompletionRequest request new ChatCompletionRequest();request.setModel(Model.CHATGLM_LITE); // chatGLM_6b_SSE、chatglm_lite、chatglm_lite_32k、chatglm_std、chatglm_prorequest.setPrompt(new ArrayListChatCompletionRequest.Prompt() {private static final long serialVersionUID -7988151926241837899L;{add(ChatCompletionRequest.Prompt.builder().role(Role.user.getCode()).content(写个java冒泡排序).build());}});// 请求openAiSession.completions(request, new EventSourceListener() {Overridepublic void onEvent(EventSource eventSource, Nullable String id, Nullable String type, String data) {ChatCompletionResponse response JSON.parseObject(data, ChatCompletionResponse.class);log.info(测试结果 onEvent{}, response.getData());// type 消息类型add 增量finish 结束error 错误interrupted 中断if (EventType.finish.getCode().equals(type)) {ChatCompletionResponse.Meta meta JSON.parseObject(response.getMeta(), ChatCompletionResponse.Meta.class);log.info([输出结束] Tokens {}, JSON.toJSONString(meta));}}Overridepublic void onClosed(EventSource eventSource) {log.info(对话完成);}});// 等待new CountDownLatch(1).await();}}这是一个单元测试类也是最常使用的流式对话模式。
五、应用接入
1. SpringBoot 配置类
Configuration
EnableConfigurationProperties(ChatGLMSDKConfigProperties.class)
public class ChatGLMSDKConfig {BeanConditionalOnProperty(value wxpay.config.enabled, havingValue true, matchIfMissing false)public OpenAiSession openAiSession(ChatGLMSDKConfigProperties properties) {// 1. 配置文件cn.bugstack.chatglm.session.Configuration configuration new cn.bugstack.chatglm.session.Configuration();configuration.setApiHost(properties.getApiHost());configuration.setApiSecretKey(properties.getApiSecretKey());// 2. 会话工厂OpenAiSessionFactory factory new DefaultOpenAiSessionFactory(configuration);// 3. 开启会话return factory.openSession();}}Data
ConfigurationProperties(prefix chatglm.sdk.config, ignoreInvalidFields true)
public class ChatGLMSDKConfigProperties {/** 状态open 开启、close 关闭 */private boolean enable;/** 转发地址 */private String apiHost;/** 可以申请 sk-*** */private String apiSecretKey;}Autowired(required false)
private OpenAiSession openAiSession;注意如果你在服务中配置了关闭启动 ChatGLM SDK 那么注入 openAiSession 为 null
2. yml 配置
# ChatGLM SDK Config
chatglm:sdk:config:# 状态true 开启、false 关闭enabled: false# 官网地址 api-host: https://open.bigmodel.cn/# 官网申请 https://open.bigmodel.cn/usercenter/apikeysapi-key: 4e087e4135306ef4a676f0cce3cee560.sgP2DUs*****你可以在配置文件中通过 enabled 参数启动和关闭 ChatGLM SDK
六、应用开发
基于本文开发的 ChatGLM SDK 就可以对接到 OpenAi 开发一个自己的应用了。https://bugstack.cn/md/project/chatgpt/chatgpt.html