这类问题我又碰上了一次。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 与耗时分别记录,前端调试不再等整段结束。

这里还有个坑。链路追踪默认按请求结束上报,流式场景要主动分段更新,否则排障时看到的永远是滞后数据。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189