报错是这么冒出来的。prompt 都存在 prompts/ 目录,文件名从 prompt_v2.txt 到 prompt_v10.txt,服务启动时按 glob 排序取最后一个当默认,结果 v10 排在 v2 前面,线上跑了三天旧版本,评测分数掉了 6 分才发现。
中间走过弯路,把「版本号没有补零,无法直接比较」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。字符串排序按字典序,v10 小于 v2。另一种情况是glob 返回顺序依赖文件系统,不稳定。
还有一种情况,加载逻辑取了 sorted() 的最后一个元素,没有解析数字。
先看目录的实际排序结果
python -c "import glob;print(sorted(glob.glob('prompts/prompt_v*.txt')))"
再往下按解析出的数字版本排序取最大
python -c "import glob,re;fs=glob.glob('prompts/prompt_v*.txt');print(max(fs,key=lambda f:int(re.search(r'v(\d+)',f).group(1))))"
接着把所有文件名补零成三位后重命名
python rename.py --dir prompts --pattern 'prompt_v{n:03d}.txt'
等前面都确认过,再启动时打印最终选中的文件与版本
python -c "print('selected', 'prompts/prompt_v010.txt')"
怎么算真的好了,看的是同一批现象。服务启动日志里选中的是版本号最大的文件,v10 不再被 v2 压过,评测分数回到改动前的水平。
补一句。按文件名排序做版本管理迟早会遇到 v10 和 v2 的问题,要么补零,要么在代码里解析数字;取最后一个文件这种写法在 CI 里也很难测出来。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
