202604月度小结

4月的节奏快到起飞。这个月是我来 ths 的第一个完整月(正好是4.1入职的)。月初的我还是个连正经项目没有开发过的小菜鸡,月底的我嘛……只能说,我接触到了 S3/OSS、日志、Grafana 监控、ELK、sky walking、各种 llm 协议适配(与某些厂商的神秘字段作斗争)、bug 排查等活儿吧。ths 非常的鼓励大家用 AI,我可以说我没有写过一行代码(除了 .envconfig.yaml),呃啊……中间还穿插了 CCPC Final、天梯赛、清明扫墓、学校里的杂事(作业和项目结项)。回头看,信息密度还是挺大的,每天做的事情都能(让 cc 整理对话)有大约 20~30kb 的文本量吧,但是几乎完全没有时间整理……

入职 ths

4月1日,入职第一天。9:28 到大厅,卡在 9:30 截止前两分钟。原以为 9:30 是一个很严格的时间点,但是大约继续等到了 10:10(?)才来了个 hr 带我们上楼。

第一天:签协议、配环境、登账号,上午实际工作时间大概就只有一个半个小时。中午体验了一期地下室(G层)的免费食堂——像工厂流水线,饭菜和人都排队涌入,分量给的足,营养也 ok,就是环境简陋了点(感觉光照对食欲的影响大于饭菜本身,地下室的光照太差了,太不均匀了)。下午借助 Claude Code 研究 LiteLLM 的代码,尽量不 100% 依赖 AI(毕竟得是自己先清楚这个庞大的项目有哪些功能&是如何实现的),抱着科研精神钻研。临近下班被拉去开会,连找导师问期望和目标的机会都没找到。

一期食堂

一期食堂

二期食堂

同事投喂的咖啡!

我在资讯相关部门,但是干的是 AI 网关(偏工程基建、中台),技术栈基本是纯 python。

LiteLLM:从零到一

这是我 4 月的核心工作。说实话,入职之前我连 LiteLLM 是什么东西都不知道——大概就是个 llm 转发站?过了一个月,我感觉我还是没能将其摸透——功能细节太多了……主要的学习流程还是“下游有什么需求给我们、或者出现了什么神秘 bug,那我就先让 cc 探索代码、写一大堆文档,然后我看文档、提问题,让 cc 改、写单元测试冒烟测试、上线、再测试、看日志,最后反馈‘修完了’”。

S3 日志接入

第一个正经任务应该是搞 S3 日志回调。实际上,S3相关的代码是已经完备的,只需要在 callback 里填个 s3_v2就好了。但是我还是额外花了点小心思,做了个路径组件化,使得查询&下载的时候更方便(按前缀)且可后期方便的调整。然后本地部署了 MinIO 验证成功。上线后还是踩了一个坑——中文路径会 403,根因是 botocore 双编码问题,导致路径中的特殊字符(中文和 %)被编码了2次,签名对不上。又略微改了改代码就好了。

然后把 pgsql 里的日志的 message 字段截断开启,这样全量日志就只写入 oss 了,大功告成。

Prometheus + Grafana 监控全链路

这一块主要就是用 llm[1M] 改了很多版的 grafana 可视化图表。json 格式的,所以直接用 llm 拉满上下文猛猛改。

1
2
3
4
5
关键节点:
- v4→v10:解决 health check 污染、TTFT 命名、Team 预算多卡片等 6 个关键问题
- v16:分离 `$__range` 与 `$interval` 语义,统一 30 个 stat 面板
- v17/v18:统一背景样式(graphMode=area)、新增 Model 流式 TTFT 趋势图
- 过程中发现了 `/metrics` 有 307 重定向、`mock_response` 可以短路 LLM 调用等有意思的细节。

Cache 计费问题

用第三方中转站的 Claude-Opus 时发现缓存计费全都是 $0。研究了代码后发现,LiteLLM 对于”模型名-价格表”的适配是有自己的一套复杂规则的。



flowchart TD
    A["模型名: Vendor/claude-opus-4"] --> B["候选1: anthropic/Vendor/claude-opus-4"]
    B --> C{命中且 provider 匹配?}
    C -- 是 --> G["✅ 取到价格"]
    C -- 否 --> D["候选2: Vendor/claude-opus-4"]
    D --> C2{命中且 provider 匹配?}
    C2 -- 是 --> G
    C2 -- 否 --> E["候选3-5: 去版本号 / 取末段..."]
    E --> C3{命中且 provider 匹配?}
    C3 -- 是 --> G
    C3 -- 否 --> H["❌ 计费 $0"]

所以我们需要手动的构建(自定义模型名称的)模型表,同时还需要积极拉取官方的价格表。所以最后,xhy 把价格表的更新链接改成 oss 的,就可以很方便的自定义且实时地更新了。

这里遇到了一个多 pod 下价格表不会自动全部更新的问题,之后看像个办法 fix & pr 吧?

其他技术活

  • 写了个 oss 交互式下载 CLI(Python + boto3),方便下载 oss 上面的日志,拉下来做分析。
  • 搞了一套对话分析的工作流,先做 session 聚合、session analysis,然后 user analysis,最后做 team analysis。这样就能够从小到大的维度分析,产出有个人级别的多 session 聚合分析报告,和 team 使用报告。
  • LiteLLM 余额查询接口打通(/key/info/user/info)。不同类型的 key 的查询余额方式也是很不一样的,比较麻烦。之后还得改造一下,方便查询。
  • 逐渐熟悉 Git 分支清理、跨网同步 Git、用 bundle 内外传输 commit……这套专属于 ths 笔记本->虚拟机的开发流程

统计了一下,4月(使用claudecode)归档的技术文档有 63 份

分类 数量 内容
LiteLLM 功能 24 Anthropic adapter、cache 计费、reasoning_content、kimi-k2.6 修复、SQL 注入 CVE 排查、trace-id 全链路、logs filter
S3 / OSS / 日志 10 MinIO 本地验证、botocore 双编码 403、中文路径修复、pgsql 截断、prompt caching billing
Analysis 分析报告 10 CSV→团队报告三阶段流水线、L0/L1 指标设计、qsy modelverse tool 截断诊断
Deploy 部署 7 本地部署、Docker PG/Redis、git upstream 跨网同步、prompt 持久化
Prometheus & Grafana 6 看板 v4→v18 迭代、PromQL、TTFT 趋势、Team/Key 预算告警
性能基准 4 ▇▇▇ 78KB 上限、Haiku/Sonnet/Doubao 并发压测、GLM-5.1 tool streaming、慢请求分析
Git 操作 2 upstream merge、S3 分支整理

ACM 比赛

CCPC Final 11th

4月25-26日,CCPC Final,河南南阳——十周年纪念,又回到了首届承办学校。

赛前其实没怎么备赛。实习太忙了,每天下班回来就只想躺着,根本没精力刷题。

结果……我们签到题写了三个小时。三个人轮番上阵,提出解法,然后疯狂的 WA……还得是曹师傅灵机一动,一行循环结束战斗(

Day2 结束后,情绪直接跌到谷底。嘴里反复的念叨“我是蛆……我是蛆”,其他的什么都不想说。

天梯赛

4月18日天梯赛倒是意外惊喜,作为二队拿到了不错的成绩。我不好说是二队太强还是一队还得加训。个人成绩也比预期好,可以说是“功力尚且未散尽”吧。

学业

校科研结项

4月5日ddl。在清明回家的火车上完成了结题报告,让 哈基米乃 帮我回忆了我们去年到底做了哪些东西(真过去的有点久了),哐哐写完,4月5日提交给老师。这种事情多亏了有 llm,不然我真没法在火车上回忆起那么多的细节。

海康讲座

4月27日下午,海康某高管来学校讲座。那天我正好上午刚从南阳打 CCPC Final 回来,下午也是请假在学校,所以我就去顺路听了听。问答环节她抛了“干一行爱一行 vs 爱一行干一行”的问题,目光和我对上了好几秒,我就举了手,答:前者——人不可能所有工作都那么热爱,对领导而言稳定和“忠诚”比一时的“热爱”更有用。她同意了我的回答,给了我个小礼物。其他几条建议(自信从擅长的事起步、AI 一定要用、6-7 份 offer 才有话语权)我感觉也挺贴合现在实习生的。

礼物是一个安刻的小充电宝,这玩意可以直接插在双孔插座上,输出也是自带线,这样出门完全不用带线了,好用!

返校的感觉

其实,每次回学校,仿佛都感觉自己已经离开学校很久很久了。除了遇到朋友时还是会倍感熟悉之外,对校园的环境很不熟悉,强陌生感,格格不入……

大概这种感觉?

清明 & 生活

清明回家

4月4-6日。南昌→安庆→庐江县(何氏始祖瑊祖隐居地)→南昌→返杭。

扫墓的时候了解了一下何氏家族的起源:韩厥→瑊祖→秦灭韩后改姓何。感觉这个姓氏的来历还挺有意思的,也莫名有一种“中华上下五千年,血缘脉络一家人” 的感觉?

好吧实际上也没啥。一种关系,就算再特殊,有人在意这条关系,才是有用的关系。

Hermes Agent

4月19日安装配置成功,取名“妃爱”。又多了一个 AI 伙伴。

后来呢,重新连接了一次飞书,SOUL.md 改成了小音理!感觉这次的灵魂比之前好多了!

月底开始忙碌

CCPC 之后的那几天,情绪确实不太好。加上实习工作量也在增加,4月下旬基本上每天都在加班到 22 点左右。

刚刚又翻了翻 archive 文档——那几天真的超级忙,呃啊:

  • 4月29日是超级高产日——余额查询一人多组修复、SQL 注入 CVE 排查、Proxy Cache & OpenClaw 溯源、Trace-ID 全链路修复,全部搞定。那天,最后一份 archive 文档甚至是在 22:31 写的……
  • 4月30日也是。Key 预算 PaaS 告警配置(17:26 archived)、Session ID 过滤先 review 后亲自实现(18:24 & 18:38 archived)、来自 sz 的慢请求日志分析、来自 qsy 的工具调用输出被截断问题(19:02 archived)……

之前去打 CCPC Final 的时候,我在 pyq 和 xhs 发过有关于 ths 的内容,所以 hr 送了菜狗娃娃和奶龙玩偶作为感谢宣传的小礼品。在忙碌中开心一下吧。

总结

4月是入职后的第一个完整月。从零开始接触 LiteLLM,在短时间内完成了一系列任务,逐渐熟悉了开发的流程,感觉自己确实有所成长。但代价也很明显——留给自己学习和复盘的时间被压缩、作息被打乱、月底放五一假期前变得更加的繁忙。

好的一面是,技术上的成长是实实在在的。从 S3、普米到 Grafana 监控,从各种协议适配到缓存/价格漏洞排查,每一个任务都是从不懂到搞懂的过程。月底的时候回头看,发现自己已经能独立处理不少问题了。

5月的话,继续在实习岗位上深耕吧,走一步看一步。至于考研,仍在我的计划当中,但是呢,肯定不是今年了。大不了多干几个月,二战的零花钱都有了(笑)。毕竟,考研哪年都能考,但应届生身份只有这宝贵的一年……

继续努力活着吧。

图片欣赏

乌丸屋

小区里一株植物的成长

樱花雨

家的味道