这个坑值得记一笔。langfuse 2.53 的 Python SDK 埋点后,控制台里所有对话都被归到同一个会话下,一天下来几万条 trace 挤在一起,按用户筛选完全失效。

刚开始盯着「session 放在 metadata 里,SDK 不会据此分组」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。trace 创建时没传 session_id,默认落进空会话;把 user_id 当成 session 用,同一个用户的多轮被合并;SDK 升级后参数名从 session_id 改成按上下文传。

第一件事是看一条 trace 的 sessionId 字段是否为空

python -c "from langfuse import Langfuse;print(Langfuse().get_trace('t-1').session_id)"

创建 trace 时显式带上会话标识

python -c "from langfuse import Langfuse;t=Langfuse().trace(name='chat', session_id='sess-88', user_id='u-7');print(t.id)"

再往下用上下文管理器把整轮调用包进同一会话

python -c "print('with langfuse.start_as_current_generation(session_id=...)')"

剩下的就是按会话维度查一次确认聚合正确

python -c "print(Langfuse().get_traces(session_id='sess-88'))"

别只看报错消失,验证要多做一步。同一轮对话的三次调用归在一个会话下,按用户筛选能列出各自的会话,控制台里不再出现巨型会话。

会话标识要由业务生成并贯穿整轮对话,缺失时监控面板会把所有流量塞进一个桶里,越晚补数据越难还原。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189