本文的宗旨在于通过简单干净实践的方式教会读者,HTTP的常用框架使用,HTTP接口快速对接方式。以及在编码实战中练习 HTTP 对数据的采集、ChatGLM对接、问题回答。这样的场景学习,非常适合以后大家在做一些智能化问答进行参考使用。
本文涉及的工程:
虽然在分布式架构的微服务内部是RPC调用,但在对外的Web/H5等场景下,则需要使用HTTP协议进行调用。因而我们在对接公司以外的其他服务时,通常都是HTTP协议,包括你对接微信支付、ChatGLM等。当然也有少部分使用 websocket 协议。
但众所周知HTTP的调用,会涉及较多的信息配置。包括;请求头、入参、出参,而这些内容都是非对象化的设计。很多人在对接特别多的 HTTP 请求以后,自己的工程代码就会变得非常混乱。所以我们需要用一些 HTTP 框架,来解决这个场景问题,让 HTTP 的调用更加优雅。
那么本章节小傅哥会结合知识星球的接口进行案例场景学习;
接下来,小傅哥会告诉如何非常快速的使用Java代码对接上HTTP调用。—— 把🐘大象装冰箱统共分3步;
cn.bugstack.xfg.dev.tech.test#HttpClientTest|OKHttpTest|Retrofit2Test
除此之外,你还可以使用Ai工具,来生成对接的测试代码。
接下来,我结合所学技术锻炼下。结合星球完成一个自动Ai回贴的功能,通过定时任务扫描星球接口帖子,并对未回答且圈【@小傅哥】的帖子进行采集回答。
源码:cn.bugstack.xfg.dev.tech.config.ChatGLMSDKConfig
@Bean
@ConditionalOnProperty(value = "chatglm.sdk.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();
}
源码:cn.bugstack.xfg.dev.tech.job.ZSXQJob
@Scheduled(cron = "0/10 * * * * ?")
public void exec() throws Exception {
Response response = getResponse(cookie);
RespData respData = response.getRespData();
List<TopicsItem> topics = respData.getTopics();
for (TopicsItem topicsItem : topics) {
// 是否回答过判断
if (!isCommentDone(topicsItem)) continue;
// 找到圈我我帖子
long topicId = topicsItem.getTopicId();
Talk talk = topicsItem.getTalk();
// "<e type="mention" uid="241858242255511" title="%40%E5%B0%8F%E5%82%85%E5%93%A5" /> 提问 java 冒泡排序"
String text = talk.getText();
// 正在匹配处理
String regex = "<e type=\"mention\" uid=\"(\\d+)\" title=\"(.*?)\" /> (.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
String uid = matcher.group(1);
String remainingText = matcher.group(3);
if ("241858242255511".equals(uid)) {
if (null == openAiSession) {
log.info("你没有开启 ChatGLM 参考yml配置文件来开启");
// 你可以使用 ChatGLM SDK 进行回答,回复问题;
comment(cookie, topicId, "【测试,只回答圈我的帖子】对接 ChatGLM SDK https://bugstack.cn/md/project/chatgpt/sdk/chatglm-sdk-java.html 回答:" + remainingText);
} else {
log.info("ChatGLM 进入回答 {} {}", topicId, remainingText);
if (topicIds.contains(topicId)){
continue;
} else {
topicIds.add(topicId);
}
new Thread(() -> {
// 入参;模型、请求信息
ChatCompletionRequest request = new ChatCompletionRequest();
request.setModel(Model.CHATGLM_LITE); // chatGLM_6b_SSE、chatglm_lite、chatglm_lite_32k、chatglm_std、chatglm_pro
request.setPrompt(new ArrayList<ChatCompletionRequest.Prompt>() {
private static final long serialVersionUID = -7988151926241837899L;
{
add(ChatCompletionRequest.Prompt.builder()
.role(Role.user.getCode())
.content(remainingText)
.build());
}
});
// 请求
try {
StringBuilder content = new StringBuilder();
openAiSession.completions(request, new EventSourceListener() {
@Override
public void onEvent(EventSource eventSource, @Nullable String id, @Nullable String type, String data) {
ChatCompletionResponse chatCompletionResponse = com.alibaba.fastjson.JSON.parseObject(data, ChatCompletionResponse.class);
log.info("测试结果 onEvent:{}", chatCompletionResponse.getData());
// type 消息类型,add 增量,finish 结束,error 错误,interrupted 中断
if (EventType.finish.getCode().equals(type)) {
ChatCompletionResponse.Meta meta = com.alibaba.fastjson.JSON.parseObject(chatCompletionResponse.getMeta(), ChatCompletionResponse.Meta.class);
log.info("[输出结束] Tokens {}", com.alibaba.fastjson.JSON.toJSONString(meta));
}
content.append(chatCompletionResponse.getData());
}
@Override
public void onClosed(EventSource eventSource) {
log.info("对话完成");
// 你可以使用 ChatGLM SDK 进行回答,回复问题;
comment(cookie, topicId, "ChatGLM 回答:" + content);
topicIds.remove(topicId);
}
});
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}).start();
}
}
}
}
}
chatglm:
sdk:
config:
# 状态;true = 开启、false 关闭
enabled: true
# 官网地址
api-host: https://open.bigmodel.cn/
# 官网申请 https://open.bigmodel.cn/usercenter/apikeys
api-secret-key: 4e087e4135306ef4a676f0cce*****.sgP2D*****
# 知识星球 Cookie 你需要获取你的 cookie 登录
cookie: zsxq_access_token=86EB23*****
这个是你就会看到后台会快速运行检测帖子和回答。- 好啦,运行到这就全部完成了。你也可以去做做测试了。 加入小傅哥的星球【码农会锁】可以做更多的实战项目。—— 公众号回复星球,可以获得加入优惠券。
- END -