用 Langfuse 3.x 管提示词,灰度环境和生产共用同一个 name,取用时只按 label 拉取,上线后才发现生产拿到的是 30 天前的旧模板,回答里还在引用已经下线的活动名称;调用侧是 openai 1.68 的 gpt-4.1,模板由 get_prompt 注入。

一开始怀疑是「灰度与生产共用同一个 name,两边标签互相覆盖」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。新版本只写了 version,没有把 production 标签指过去。也可能是SDK 缓存了 prompt 对象,进程存活期间不会重新拉取。

另外,有人在控制台把 production 标签拖回了旧版本。

第一件事是确认当前进程实际取到的版本号

python -c "from langfuse import Langfuse;p=Langfuse().get_prompt('contract_extract',label='production');print(p.version,p.labels)"

然后用不缓存的方式再取一次排除本地缓存

python -c "from langfuse import Langfuse;Langfuse().get_prompt('contract_extract',label='production',cache_ttl_seconds=0)"

接着把目标版本的标签显式指过去

python sync_prompt_label.py --name contract_extract --version 12 --label production

末了用该版本渲染一次并核对关键字段

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d @req_v12.json

别只看报错消失,验证要多做一步。两次取到的版本号都是 12,渲染出的模板与当前活动名称一致,灰度与生产的回答不再互相串版本。

prompt 的标签是可移动的指针,只写版本号不打标签等于没发布,取用侧还要留意 SDK 的本地缓存。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189