😀前言
不知不觉过了一年了很感慨也很期待未来
🏠个人主页:尘觉主页
文章目录
- 我的创作纪念日-一周年
- 机缘
- 收获(荣誉)
- 日常
- 成就
- 憧憬
我的创作纪念日-一周年
机缘
在我开始在 CSDN 上发布文章之前,我对这个平台几乎一无所知。随着时间的推移和知识的积累,以及老师的指导,我开始意识到将我的学习笔记分享出来的重要性。但当时,我对 Markdown 语法毫无了解,甚至从未听说过 Typora 这个编辑软件。因此,我只能依赖富文本编辑器,尝试着去调整格式,然而这一过程却异常艰难。
后来,我在一个讨论区里了解到了 Markdown 的便捷性和流行程度。我向一位经验丰富的“大佬”请教,并开始探索 Typora 软件的功能。我开始逐步学习 Markdown 语法,虽然一开始感到有些困难,但我并没有放弃。随着时间的推移,我逐渐掌握了 Markdown 的基本语法,并且发现它比富文本编辑器更加高效和方便。
为了方便,我开始探索图床的搭建和使用。
收获(荣誉)
我获得了6300左右的粉丝——很感谢他们的支持非常感谢
我在csdn的积累巩固了我的基础也为我在学校努力和比赛提供了信息
我主要收获是 获得了 国家级3项,省级7项,校级8项以及证书12项这些是我最大的收获,也希望以后进csdn工作看看哈哈哈
日常
- 创作是否已经是你生活的一部分了
我感觉我也没有之前的创作激情了就像进入了平淡期但是我也清楚的感觉到以及成为我生活的一部分了我有时间还是会抽空写一篇博文吧 希望可以帮助到更多人
- 有限的精力下,如何平衡创作和工作学习
我觉得还是热爱吧以及看到越来越多的粉丝关注我和我的浏览量增加内心的成就感也会激励我
在学习工作的经验以及笔记然后在休闲时刻总结发布吧
成就
- 无重复字符的最长子串
public int lengthOfLongestSubstring(String s) {
// 记录字符上一次出现的位置
int[] last = new int[128];
for(int i = 0; i < 128; i++) {
last[i] = -1;
}
int n = s.length();
int res = 0;
int start = 0; // 窗口开始位置
for(int i =0 ; i < n; i++) {
int index = s.charAt(i);
start = Math.max(start, last[index] + 1);
res = Math.max(res, i - start + 1);
last[index] = i;
}
return res;
}
- OpenaiChatBusinessServiceImpl
@Slf4j
@Service
public class OpenaiChatBusinessServiceImpl implements ChatBusinessService<ChatCompletionRequest> {
@Resource
private ChatResponseSyncDataService chatResponseSyncDataService;
@Override
public ChatSdkType type() {
return ChatSdkType.openai;
}
@Override
public ChatSdkStorageResponse chatCompletionStream(List<RecordData> recordList, ChatSdkAccount chatSdkAccount) {
String connectId = chatSdkAccount.getConnectId();
log.info("[平台-{}] 流式请求参数:{}", chatSdkAccount.getSdkUniqueKey(), JSON.toJSONString(recordList));
MessageSendHandler messageSendHandler = new MessageSendHandler(connectId);
ChatSdkStorageResponse response = new ChatSdkStorageResponse();
response.setAccount(chatSdkAccount);
try {
OpenAiService service = OpenaiClientFactory.getService(chatSdkAccount);
ChatCompletionRequest chatCompletionRequest = this.convertRequest(recordList, chatSdkAccount, e -> e.setStream(true));
RecordData recordData = response.pushData(new RecordData());
try {
service.streamChatCompletion(chatCompletionRequest)
.blockingForEach(chunk -> {
List<ChatCompletionChoice> choices = chunk.getChoices();
Optional.ofNullable(choices).orElseGet(ArrayList::new).forEach(res -> {
ChatMessage message = Optional.ofNullable(res.getMessage()).orElseGet(ChatMessage::new);
OR.run(message.getRole(), StrUtil::isNotEmpty, recordData::setRole);
String resContent = Optional.ofNullable(message.getContent()).orElse("");
recordData.getContentSB().append(resContent);
// 发送消息
messageSendHandler.queueAdd(resContent);
});
});
} catch (BusinessException e) {
if (e.getCode() == HttpStatus.HTTP_OK) {
return response;
}
throw e;
} finally {
recordData.setContent(recordData.getContentSB().toString());
service.shutdownExecutor();
}
} catch (Exception throwable) {
throwable.printStackTrace();
if (throwable.getCause() instanceof ConnectException) {
throw new BusinessException("服务器节点异常,请稍后重试或联系管理员");
}
if (throwable instanceof OpenAiHttpException e) {
int statusCode = e.statusCode;
String code = e.code;
List<Integer> accountErrorCode = CollUtil.newArrayList(HttpStatus.HTTP_UNAUTHORIZED, 429);
if (accountErrorCode.contains(statusCode) || "insufficient_quota".equals(code)) {
response.setAccountError(true);
}
return response;
}
throw new BusinessException(throwable.getMessage());
} finally {
messageSendHandler.close();
}
chatResponseSyncDataService.syncChatResponse(chatSdkAccount, response, recordList);
return response;
}
@Override
public ChatSdkStorageResponse chatCompletion(List<RecordData> recordList, ChatSdkAccount chatSdkAccount) {
String connectId = chatSdkAccount.getConnectId();
log.info("[平台-{}] 非流式请求参数:{}", chatSdkAccount.getSdkUniqueKey(), JSON.toJSONString(recordList));
MessageSendHandler messageSendHandler = new MessageSendHandler(connectId);
ChatSdkStorageResponse response = new ChatSdkStorageResponse();
try {
OpenAiService service = OpenaiClientFactory.getService(chatSdkAccount);
ChatCompletionRequest chatCompletionRequest = this.convertRequest(recordList, chatSdkAccount, e -> e.setStream(true));
RecordData recordData = response.pushData(new RecordData());
try {
chatCompletionRequest.setStream(false);
ChatCompletionResult chatCompletion = service.createChatCompletion(chatCompletionRequest);
Optional.ofNullable(chatCompletion.getChoices()).orElseGet(ArrayList::new).forEach(res -> {
ChatMessage message = Optional.ofNullable(res.getMessage()).orElseGet(ChatMessage::new);
OR.run(message.getRole(), StrUtil::isNotEmpty, recordData::setRole);
String resContent = Optional.ofNullable(message.getContent()).orElse("");
recordData.getContentSB().append(resContent);
// 发送消息
messageSendHandler.queueAdd(resContent);
});
} catch (BusinessException e) {
if (e.getCode() == HttpStatus.HTTP_OK) {
return response;
}
throw e;
} finally {
recordData.setContent(recordData.getContentSB().toString());
service.shutdownExecutor();
}
} catch (Exception e) {
e.printStackTrace();
if (e.getCause() instanceof ConnectException) {
throw new BusinessException("服务器节点异常,请稍后重试或联系管理员");
}
throw new BusinessException(e.getMessage());
} finally {
messageSendHandler.close();
}
chatResponseSyncDataService.syncChatResponse(chatSdkAccount, response, recordList);
return response;
}
/**
* 转换为api请求参数
*
* @param recordList
* @param account
* @param requestConsumer
* @return
*/
@Override
public ChatCompletionRequest convertRequest(List<RecordData> recordList, ChatSdkAccount account, Consumer<ChatCompletionRequest> requestConsumer) {
ChatCompletionRequest request = new ChatCompletionRequest();
request.setModel(account.getModelValue());
request.setN(1);
request.setMaxTokens(account.getOnceToken());
request.setLogitBias(new HashMap<>());
List<ChatMessage> chatMessageList = recordList.stream().map(item -> {
ChatMessage chatMessage = new ChatMessage();
chatMessage.setRole(item.getRole());
chatMessage.setContent(item.getContent());
return chatMessage;
}).toList();
request.setMessages(chatMessageList);
OR.run(account.getExtendParam(), CollUtil::isNotEmpty, extendParam -> {
OR.run(extendParam.get("temperature"), Objects::nonNull, e -> {
request.setTemperature(Double.valueOf(e.toString()));
});
OR.run(extendParam.get("topP"), Objects::nonNull, e -> {
request.setTopP(Double.valueOf(e.toString()));
});
OR.run(extendParam.get("presencePenalty"), Objects::nonNull, e -> {
request.setPresencePenalty(Double.valueOf(e.toString()));
});
OR.run(extendParam.get("frequencyPenalty"), Objects::nonNull, e -> {
request.setFrequencyPenalty(Double.valueOf(e.toString()));
});
OR.run(extendParam.get("user"), Objects::nonNull, e -> {
request.setUser(e.toString());
});
});
requestConsumer.accept(request);
return request;
}
}
憧憬
我很荣幸获得了湖南省首届职业规划大赛省一我对自己的职业规划是先学和基础以及融汇贯通并且落地实战,因为博主还是专科学历我是打算把学历提升增加自己的知识储备
创作规划就是把自己的心得和收获干货分享给更多人,也希望在开源领域做出自己的一份贡献吧,众人拾柴火焰高嘛
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
手写机制
微服务组件
spring_尘觉
springMVC
mybits
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞