开发
大模型开发用到kotlin,类型转换很麻烦,这里做枚举
JsonValue.from(String) -> JsonField
JsonField.asKnown()可解包
排查端口问题
lsof -i:8080查找指定端口相关文件(包括TCP,UDP连接)
kill -9 PID 强制杀死某个进程
工程tips
一个agent请求可能涉及到多次模型chat,例如functioncalling的处理就在一次while循环中,直到模型不再调用为止。因此在做日志时,上游可以将traceId存在上下文中,调airouter时使用同一个traceId,不同requestId,这样就能通过traceId将链路串联起来!
日志记录时,可以将上下文放在同一个context中,然后将file名按照traceId存储在blobstore中。
文件上传业内通用解决流程:
1.前端调upload-token,获取到上传所需要的地址和token。
2.前端根据地址和token上传文件。
3.前端调upload-finish把地址给予的resoureceId(blobstore地址)给到后端,后端做相应的存储处理。
guava耗时工具类,好用!
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS);
云厂商支持fileId肯定存在一定优化的,不然都存url不就好了。
*****再研究下百度云盘file做哈希是怎么做的,涉及到权限共享的问题可以研究下。
类不允许多重继承,但是接口可以
负载均衡可以总结为“记分”与“排序”
常见的按照权重做区间负载均衡
/**
* 根据权重选择供应商
*/
public static ProviderWeightInfo selectProviderByWeight(
List<ProviderWeightInfo> providerWeightInfos
) {
if (CollectionUtils.isEmpty(providerWeightInfos)) {
return null;
}
// 计算总权重
double totalWeight = providerWeightInfos.stream()
.mapToDouble(ProviderWeightInfo::getWeightScore)
.sum();
if (totalWeight <= 0) {
// 如果总权重为0,随机选择一个
int index = ThreadLocalRandom.current().nextInt(providerWeightInfos.size());
return providerWeightInfos.get(index);
}
// 生成随机数
double random = ThreadLocalRandom.current().nextDouble() * totalWeight;
double currentWeight = 0;
// 按权重选择
for (ProviderWeightInfo info : providerWeightInfos) {
currentWeight += info.getWeightScore();
if (random <= currentWeight) {
return info;
}
}
// 兜底返回最后一个
return providerWeightInfos.get(providerWeightInfos.size() - 1);
}
GenericKeyedObjectPool可以创建资源池,从中借与还资源,避免频繁创建销毁
hashLong & 0x7FFFFFFFFFFFFFFFL 这个与操作能够做到去符号化,抹掉首位的1.
grafana + loki能够迅速构建一个日志查看平台,推荐!
code review
可能为空的请注解@Nullable,这样会有编译提示,以防空指针。
数据的加解密都请放在repository层,以免外层忘记加密。
rpc输出结果不应为枚举,不方便新增枚举。
po层不应定义枚举,容易反序列化失败