这类问题我又碰上了一次。Langfuse 里流式对话的 generation 要等回答结束才出现,前端调试看不到进行中的 trace,首字 2 秒的记录却写成了 18 秒。
第一反应是「batch exporter 攒批发送」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。span 在 finally 里才结束并上报;没有记录首 token 时间;采样率过低,调试请求被丢弃。
收到首块时先更新一次输出和时间
python -c "print('generation.update(output=first_chunk, completion_start_time=now)')"
随后把首字时间单独记成 TTFT 指标
python -c "print('ttft_ms = first_token_at - request_at')"
调试期间强制 flush exporter
python -c "print('langfuse.flush()')"
临时把采样率调到 1 再复现一次
python -c "print('LANGFUSE_SAMPLE_RATE=1')"
同一份数据我导出了两份,一份留底,一份拿来试。
这类问题以前遇到过,但这次的触发条件和上次不一样。
怎么算真的好了,看的是同一批现象。请求进行中就能在 Langfuse 看到 generation,TTFT 与耗时分别记录,前端调试不再等整段结束。
这里还有个坑。链路追踪默认按请求结束上报,流式场景要主动分段更新,否则排障时看到的永远是滞后数据。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
