学的东西真的可以用在工作上解决问题!今天上午我在解决webai-lite的前端页面加载慢并且CPU飙高的问题。先是让Ai分析原因,写PRD。Ai写出的方案中有一条是LRU,这tm就是我曾经刷过的算法题啊!!!??然后我直接就是一个采用。之后还发现因为没有数据库存储,前端每次随机查看一张图片或者获取一张图片的信息(像素,占用,标注信息)时,都会去遍历后端的image目录,时间复杂度为O(n),那么我就在想能不能把目录里的图片名称按照字典序排序,之后进行二分,开始排序的时间复杂度为O(nlogn),之后每次查询就只需要O(logn)了。后续Ai优化之后,还可以结合LRU进行hash缓存,进而把一些图片加载降到O(1)

还有我发现,vibecoding的时候,不能一上来就告诉需求,就让ai开始写,这样ai整个context不全,达不到要求不说,还会写出很多bug,并且会不断返工消耗很多tokens。那么我的兼顾效果与成本的解决办法就是,用一个比较聪明的模型(GPT-5.5)不断完善PRD(产品需求文档),再用一个普通模型(ds 4 pro)根据这个PRD进行实施。我的工作流在上一篇博客其实已经有介绍了。那么这个过程中最费时间和token是的其实是写PRD的时候,因为你会和Ai不断讨论每一个细节的边界,不断收敛,直到你觉得没问题了之后,才能把PRD交给ds去实现。实现过程其实消耗不了多少tokens,因为模型本身就很便宜,在一个就是其实不用很深度的思考,自然而然就降低了额度花费。那么如果全部用旗舰模型也会让我本不多的额度雪上加霜~~~

todoList:

done

  1. 数据界面中的移动逻辑需要修改,当前只能全选当前页面的图片进行移动。翻页按钮也只能滑动到最下面才能点击,把翻页按钮独立出来在下面,并且还要显示当前页的图片数量
  2. 标注界面:左侧栏图片成一列展示,可上下滑动。上面不显示共xxx张 · 第x / xx页字段,底部除了显示当前页数,总页数,还要显示总图片数。
  3. 当前数据页面的顶部标识要改,改为进度条,展示当前样本和当前工作区的总数、标注、未标注数量(上下排布)。展示缺陷数量排名(和前面的左右排布)。最后留一个小地方展示占用空间
  4. 缩紧右侧扩展栏,数据导入栏高度缩小,缺陷检测类别栏增高。增加图片展示区的垂直高度
  5. 添加新增样本集/删除样本集按钮
  6. 缺陷数量排名直方图中缺陷的颜色要和标注时的颜色对应
  7. 标注界面左侧不要显示图片名称,只显示缩略图即可
  8. 标注界面对当前页面进行标注的时候,可以慢加载下面几张(2-3张)图片的信息,标注时的连续性会高很多

todo

  1. 标注页面尽量和原webai操作保持一致,空格显示隐藏标注mask,右键拖动图片,d下一张,s保存,q退出当前标注(考虑添加mask缓存?)(标注这个地方的代码需要重构,去掉屎山,保留最常用的几个快捷键即可)
  2. 数据页图片展示区中的放大图片功能需要支持鼠标滚轮放大缩小,鼠标左键拖动功能

ok那么解决完以上8个问题之后我也就要开始学自己的东西了,要看一下fastAPI的教程,做一下力扣题,逛逛L站啥的,对了今天工资到账了!我把之前买的键盘退了,因为我的电脑连不上舍友的显示器,一定要存住钱啊!各位!!!

零钱兑换(完全背包 这类题要好好看看)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// class Solution {
// public:
// // 回溯会超时
// int ans = INT_MAX;
// int coinChange(vector<int>& coins, int amount) {
// vector<int> output;
// dfs(coins, output, amount, 0);
// return ans == INT_MAX ? -1 : ans;
// }

// void dfs(vector<int>& candidates, vector<int>& output, int target,
// int pos) {
// long long sum = 0;
// int size = output.size();
// for (auto e : output)
// sum += e;
// if (sum == target) {
// ans = min(ans, size);
// return;
// } else if (sum > target || pos > candidates.size() - 1) {
// return;
// }
// // 选择当前数字
// output.push_back(candidates[pos]);
// dfs(candidates, output, target, pos);
// output.pop_back();

// // 不选当前数字
// dfs(candidates, output, target, pos + 1);
// }
// };

// class Solution {
// public:
// // 回溯会超时 用dp
// // 这个代码也会超时
// // dp[i][j]考虑前i枚硬币(包括i)的总和为j的最少硬币数 总和最大为 10e4
// vector<vector<int>> dp{13, vector<int>(10005, -1)};
// int coinChange(vector<int>& coins, int amount) {
// int n = coins.size();
// // 从最后一枚硬币开始回溯
// int ans = dfs(coins, n - 1, amount);
// return ans < INT_MAX / 2 ? ans : -1;
// }
// // 从最后一枚硬币开始算,返回所需最少硬币数量
// // cur 当前还需多少面额
// int dfs(vector<int>& coins, int i, int cur) {
// if (i < 0) {
// // cur等于0说明当前路径刚好结束,当前需要硬币数量为0
// // cur不为0说明当前路径不满足要求,返回一个极大值
// // 除2是为了防止下面 +1 溢出
// return cur == 0 ? 0 : INT_MAX / 2;
// }
// int& ret = dp[i][cur]; // 引用
// if (ret != -1) // 之前计算过
// return ret;
// if (coins[i] > cur)
// return dfs(coins, i - 1, cur); // 只能不选了
// // 取选或者不选最小的
// return min(dfs(coins, i - 1, cur), dfs(coins, i, cur - coins[i]) +
// 1);
// }
// };

class Solution {
public:
// 回溯会超时 用dp 完全背包
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
const int INF = 0x3f3f3f3f;
// dp[i][j]使用 前 i 种硬币(即硬币下标 0, 1, ..., i-1)来凑出总金额 j
// 所需的 最少硬币数量。
vector<vector<int>> dp(n + 1, vector<int>(amount + 1, INF));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= amount; j++) {
dp[i][j] = dp[i - 1][j];
if (j >= coins[i - 1])
dp[i][j] = min(dp[i][j], dp[i][j - coins[i - 1]] + 1);
}
}
return dp[n][amount] >= INF ? -1 : dp[n][amount];
}
};

今日工作内容

Task: Session 13: 前端加载性能与图片查找链路优化

Summary

实施 PRD 06-10:后端新增 snapshot.py 进程内快照(消除重复 rglob)+ warmup.py 预热协调器;修改 workspace/sample_sets 服务层和路由层全部读取函数优先从快照获取;缩略图服务端文件缓存(BILINEAR+JPEG draft);GET /workspace 轻量模式、/images include_dimensions、/label-stats sample_set_ids;前端移除 loadImageDimensions、AbortController 请求取消、debounce、N+1 收敛;标注/annotation 统计缓存;更新 4 份 code-spec。

Task: 数据页与标注页选择交互优化 — 跨页选择、整组移动、统计面板重构、标注页左栏列表优化

Summary

实现 PRD 06-10 全部需求:后端新增整组移动端点+文件锁并发保护;前端数据页跨页选择、整组移动、统计面板改为双进度条+竖柱直方图+环形存储图、分页栏独立固定;标注页左栏改为单列纵向列表;修复 flex 容器链 overflow-y:auto 高度约束问题;右侧面板缩窄+检测类别自动撑满;更新后端和前端 spec 契约文档

Task: 数据页与标注页交互增强二期实现

Summary

实现 PRD 五项需求:样本集新建/删除入口、缺陷颜色统一、标注快捷键对齐 WebAI(S/D/Q/空格)、标注页缩略图导航、连续预加载缓存。修复三个 Bug:直方图颜色覆盖、D 键焦点判断、新增按钮空列表隐藏。

下阶段计划

  1. 优化标注界面交互逻辑,和原webai标注逻辑统一